国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Cesium之3DTileset實(shí)例管理

這篇具有很好參考價(jià)值的文章主要介紹了Cesium之3DTileset實(shí)例管理。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

最近使用Cesium結(jié)合ts和react自己手動(dòng)搭建了一個(gè)基本界面,加載3dTiles數(shù)據(jù)和geojson數(shù)據(jù),動(dòng)態(tài)控制圖層的顯隱。本來以為是非常簡(jiǎn)單的功能,但是實(shí)際操作中發(fā)現(xiàn)有一些地方值得注意。

搭建的效果就是這個(gè)樣子,經(jīng)典的頂部header+左側(cè)布局,主視窗顯示地圖:
Cesium之3DTileset實(shí)例管理
加載geojson數(shù)據(jù)源的方法很簡(jiǎn)單,Cesium.GeoJsonDataSource.load方法會(huì)返回Promise<Cesium.GeoJsonDataSource> 類型的Promise(resolve),給其指定一個(gè)固定的標(biāo)識(shí)name。
代碼:

  const shandongJson = Cesium.GeoJsonDataSource.load(
    '../mock/shandong.geojson',
    {
      clampToGround:true
    }
  )
  shandongJson.then((shandongJson)=>{
    shandongJson.name = '山東';
    viewRef.dataSources.add(shandongJson)
  })

因?yàn)橛?Cesium.Viewer.dataSources.getByName() 方法,直接通過name屬性獲取對(duì)應(yīng)的geojson對(duì)象。

// 涉及業(yè)務(wù)代碼的部分就不放上了 重點(diǎn)是getByName方法
if (info.node.type === 'geojson' && viewer){
        viewer.dataSources.getByName(info.node.title as string)[0].show = info.checked;
      }

但是在加載3dTile數(shù)據(jù)時(shí),就沒這么方便了,當(dāng)我向Viewer中同時(shí)添加json數(shù)據(jù)源和3dTile數(shù)據(jù)時(shí),通過打印其存儲(chǔ)位置,發(fā)現(xiàn)是這樣的:
Cesium之3DTileset實(shí)例管理
在Cesium官網(wǎng)上查閱沒有一個(gè)可以直接獲取Cesium3DTileset對(duì)象實(shí)例的方法,通過index獲取獲取實(shí)例顯然不太可行,沒辦法,只能想一個(gè)其它的方法用來存儲(chǔ)Cesium3DTileset對(duì)象。于是使用Mobx建立全局store,思路如下,Redux和Vuex也是同理,只是語法不同。

import { action, extendObservable, runInAction } from "mobx";
import * as Cesium from 'cesium'
interface tileSetListProp {
  [key: string]: Cesium.Cesium3DTileset
}
interface OBSERVABLE_PROP {
  tileSetList: tileSetListProp
}
// 可觀察屬性
const OBSERVABLE: OBSERVABLE_PROP = {
  tileSetList: {},
};
// 建立下面的數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)
//  {
//   key1: Cesium3DTileset1,
//   key2: Cesium3DTileset2,
// }
class Tiles {
  tileSetList: tileSetListProp = {}

  constructor() {
    extendObservable(this, {
      ...OBSERVABLE
    });
  }
	// 向容器中添加新的Cesium3DTileset
  @action.bound addTileSet = (key: string, tileSet: Cesium.Cesium3DTileset) => {
    runInAction(() => {
      this.tileSetList[key] = tileSet;
    });

  }

  @action.bound update(data: any) {
    Object.assign(this, data);
  }

}

export default new Tiles();

頁面加載時(shí):引入全局變量,在數(shù)據(jù)加載時(shí)把它存進(jìn)去:addTileSet(‘Building’, tileBuilding), useStores是一個(gè)工具函數(shù),直接采用mobx的inject引用是一樣的,全局store如何使用就不贅述了,網(wǎng)上資料很多。

const Pages: FC = () => {
  const [viewer, setViewer] = useState<null | Cesium.Viewer>(null)
  const {
    tiles: {
      tileSetList,
      addTileSet
    }
  } = useStores()

  // const viewerRef = useRef<null | Cesium.Viewer>(null);
  useEffect(() => {
    const view = initViewer();
    initTile(view)
    setViewer(view);
    const MP = new MousePosition(view);
  }, [])

  const initTile = (viewer:Cesium.Viewer) => {
    const tileBuilding = viewer!.scene.primitives.add(
      new Cesium.Cesium3DTileset({ // 3d titles
        url: '../mock/tileset.json',
      })
    )

    tileBuilding.readyPromise
      .then(function (tileBuilding: Cesium.Cesium3DTileset) {
        addTileSet('Building', tileBuilding)
      })
      .catch(function (error: any) {
        console.log(error);
      });

    const tileBIM = viewer!.scene.primitives.add(
      new Cesium.Cesium3DTileset({ // 3d titles
        url: Cesium.IonResource.fromAssetId(8564),
      })
    )

    tileBIM.readyPromise
      .then(function (tileBIM: Cesium.Cesium3DTileset) {
        addTileSet('BIM', tileBIM)
      })
      .catch(function (error: any) {
        console.log(error);
      });
  }

  const add3DTile = (tileObj: TileProp) => {
    if (!viewer) return message.error('圖層未加載');      
      viewer.zoomTo(
        tileSetList[tileObj.title],
        new Cesium.HeadingPitchRange( // heading pitch roll
          0.5,
          -0.2,
          tileSetList[tileObj.title].boundingSphere.radius * 4.0
        )
      );
      return
    }
  return (
    <div className={styles.cesiumPage}>
      <MapHeader
        viewer={viewer}
        onRadioChange={add3DTile}
      />
      <div className={styles.cesiumPageContainer}>
        <LayerEdit
          viewer={viewer}
        />
        <div className={styles.baseMapWrapper}>
          <Titles />
        </div>
      </div>
    </div>
  );
}
export default Pages

同樣的,在左側(cè)組件中通過Antd的Tree勾選節(jié)點(diǎn)可以很方便控制顯隱: tileSetList[key].show = info.checked

// 引入全局Store,只用到了tileSetList
const {
    tiles: {
      tileSetList,
      addTileSet
    }
  } = useStores()
  
 ···
 ··· // 省略無用代碼
 
// Tree選中節(jié)點(diǎn)的觸發(fā)的事件
 const onCheck = (checkedKeys:any, info:CheckInfo) => {

      const layers = getLayersById(info)
      console.log('onCheck', checkedKeys, info, layers);
      // @ts-ignore
      if (info.node.type === 'geojson' && viewer){
        viewer.dataSources.getByName(info.node.title as string)[0].show = info.checked;
      }
      // @ts-ignore
      if (info.node.type === '3dtiles' && viewer){
        const key = info.node.title as string
        console.log('3dtiles',tileSetList,tileSetList[key])
        // get方法通過索引獲取數(shù)組元素,實(shí)踐證明不大好用
        // viewer.scene.primitives.get(info.node.key as number).show = info.checked; 
        tileSetList[key].show = info.checked // 設(shè)置顯隱
      }
    };

這樣子就達(dá)到目的了。
模型顯示:
Cesium之3DTileset實(shí)例管理
模型隱藏:
Cesium之3DTileset實(shí)例管理文章來源地址http://www.zghlxwxcb.cn/news/detail-477232.html

到了這里,關(guān)于Cesium之3DTileset實(shí)例管理的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • CesiumForUnreal實(shí)現(xiàn)多邊形裁剪3dTileset效果

    CesiumForUnreal實(shí)現(xiàn)多邊形裁剪3dTileset效果

    基于CesiumForUnreal插件的 Cartographic Polygon Actor在 Runtime 運(yùn)行時(shí)環(huán)境下實(shí)現(xiàn)對(duì)地形3DTileset的多邊形裁剪效果,GIF動(dòng)圖如下: 在Editor中的具體操作過程可以參考CesiumForUnreal官方裁剪地形的教程,本文這里在Runtime環(huán)境下進(jìn)行實(shí)現(xiàn)。數(shù)據(jù)依舊是使用CesiumForUnreal插件加載在線的地形和影

    2024年02月13日
    瀏覽(281)
  • CesiumForUnreal之3DTileset點(diǎn)選拾取屬性與單體高亮

    CesiumForUnreal之3DTileset點(diǎn)選拾取屬性與單體高亮

    在UE5中使用CesiumForUnreal插件加載本地的3dTiles建筑白模數(shù)據(jù),實(shí)現(xiàn)點(diǎn)擊拾取3DTileset單體要素的 屬性數(shù)據(jù) ,并對(duì) 高亮單體 進(jìn)行展示,GIF動(dòng)圖如下: 總體的實(shí)現(xiàn)過程分為 數(shù)據(jù)準(zhǔn)備 、 屬性拾取 和 單體高亮 三個(gè)大的部分,在本文中數(shù)據(jù)準(zhǔn)備部分簡(jiǎn)要概述,拾取屬性和單體高亮?xí)?/p>

    2024年02月04日
    瀏覽(50)
  • vue-vben-admin 與.net core 結(jié)合實(shí)例 【自學(xué)與教學(xué) 小白教程】---第4節(jié)---部門管理

    vue-vben-admin 與.net core 結(jié)合實(shí)例 【自學(xué)與教學(xué) 小白教程】---第4節(jié)---部門管理

    ?ue-vben-admin 與.net core 結(jié)合實(shí)例 這里計(jì)劃使用.net core 作為后端 。目標(biāo):打造好看 易用 開箱即用 的netcore一體化框架。Vue Vben Admin For NetCore 取命 hcrain-vvadmin 我不是前端人員 但有時(shí)開發(fā)還是要寫一些界面。 之前使用layui是時(shí)候 狠心升級(jí)下了。 只為了好看----------于是 ?小白教

    2024年01月16日
    瀏覽(20)
  • vue結(jié)合Cesium加載gltf模型

    vue結(jié)合Cesium加載gltf模型

    Cesium支持什么格式? ????????Cesium支持的格式包括:3D模型格式(如COLLADA、gITF、OBJ)、影像格式(如JPEG、PNG、GeoTIFF)、地形格式(如STL、Heightmap)、矢量數(shù)據(jù)格式(如GeoJSON、KMZ)、時(shí)間動(dòng)態(tài)數(shù)據(jù)格式(如CZML),以及其他各種數(shù)據(jù)格式。此外,Cesium還通過插件支持其他特

    2024年02月01日
    瀏覽(26)
  • vue3結(jié)合Cesium加載傾斜攝影3dtiles

    ? ? ? ? 這篇文章主要是為了記錄加載3dtiles時(shí)模型與地形有時(shí)候存在一些高度上的差異,為此將解決方法做一個(gè)記錄,便于其他讀者使用。 ????????加載傾斜攝影3dtitle ? ????????調(diào)整傾斜攝影高度 ????????調(diào)用方式:

    2024年02月02日
    瀏覽(45)
  • Cesium結(jié)合GIS天地圖 加載傾斜攝影3dtile + vue3

    Cesium結(jié)合GIS天地圖 加載傾斜攝影3dtile + vue3

    將傾斜攝影OSGB數(shù)據(jù)轉(zhuǎn)換為3dtile(轉(zhuǎn)換方式很多,可以利用第三方工具cesiumlab) 利用Cesium加載GIS地圖,我這里使用的是天地圖,可以加載其他地圖都行 加載3dtile數(shù)據(jù)到地圖中展示 以加載天地圖為例,需要先到天地圖官網(wǎng)去申請(qǐng)開發(fā)者,獲取一個(gè)token,以下代碼直接粘貼就行,注釋

    2024年02月11日
    瀏覽(84)
  • 【W(wǎng)ebGIS實(shí)例】(10)Cesium開場(chǎng)效果(場(chǎng)景、相機(jī)旋轉(zhuǎn),自定義圖片底圖)

    【W(wǎng)ebGIS實(shí)例】(10)Cesium開場(chǎng)效果(場(chǎng)景、相機(jī)旋轉(zhuǎn),自定義圖片底圖)

    漫游效果視頻: 【W(wǎng)ebGIS實(shí)例】(10)Cesium開場(chǎng)效果(場(chǎng)景、相機(jī) 點(diǎn)擊鼠標(biāo)后將停止旋轉(zhuǎn)并正常加載影像底圖: 可以直接看代碼,注釋寫得應(yīng)該比較清楚了: 調(diào)用: 剛進(jìn)入時(shí)就是直接加載這種圖片作為SingleTileImageryProvider的,因?yàn)檫@樣能夠很快得加載出完整效果,而且不會(huì)像

    2024年02月12日
    瀏覽(17)
  • 使用Django自帶的后臺(tái)管理系統(tǒng)進(jìn)行數(shù)據(jù)庫管理的實(shí)例

    使用Django自帶的后臺(tái)管理系統(tǒng)進(jìn)行數(shù)據(jù)庫管理的實(shí)例

    Django自帶的后臺(tái)管理系統(tǒng)主要用來對(duì)數(shù)據(jù)庫進(jìn)行操作和管理。它是Django框架的一個(gè)強(qiáng)大功能,可以讓你快速創(chuàng)建一個(gè)管理界面,用于管理你的應(yīng)用程序的數(shù)據(jù)模型。 使用Django后臺(tái)管理系統(tǒng),你可以輕松地進(jìn)行以下操作: 數(shù)據(jù)庫管理:你可以查看、添加、編輯和刪除數(shù)據(jù)庫中

    2024年02月15日
    瀏覽(24)
  • 使用DockerUI結(jié)合內(nèi)網(wǎng)穿透工具輕松實(shí)現(xiàn)公網(wǎng)訪問和管理docker容器

    使用DockerUI結(jié)合內(nèi)網(wǎng)穿透工具輕松實(shí)現(xiàn)公網(wǎng)訪問和管理docker容器

    DockerUI是一個(gè)docker容器鏡像的可視化圖形化管理工具。DockerUI可以用來輕松構(gòu)建、管理和維護(hù)docker環(huán)境。它是完全開源且免費(fèi)的。基于容器安裝方式,部署方便高效,瀏覽和維護(hù)docker單節(jié)點(diǎn)或集群節(jié)點(diǎn)worker和manager。DockerUI具有易于使用的界面。它不需要記住 docker 指令。只需下

    2024年02月05日
    瀏覽(53)
  • Openstack使用Dashboard進(jìn)行鏡像操作、管理實(shí)例等其他操作

    Openstack使用Dashboard進(jìn)行鏡像操作、管理實(shí)例等其他操作

    一、OpenStack 介紹 OpenStack為私有云和公有云提供可擴(kuò)展的彈性的云計(jì)算服務(wù)云計(jì)算服務(wù)云計(jì)算服務(wù)。項(xiàng)目目標(biāo)是提供實(shí)施簡(jiǎn)單、可大規(guī)模擴(kuò)展、豐富、標(biāo)準(zhǔn)統(tǒng)一的云計(jì)算管理平臺(tái)。 二、OpenStack 能做什么 OpenStack的主要目標(biāo)是管理數(shù)據(jù)中心的資源,簡(jiǎn)化資源分配。它管理三部分

    2024年02月11日
    瀏覽(51)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包