CesiumJs 簡單操作模型

来源:https://www.cnblogs.com/liuchenxing/archive/2022/10/21/16813376.html
-Advertisement-
Play Games

一、所需的地形文件和模型以及 CesiumJs 包 操作之前,我們需要兩份對應的文件,一份是地形文件(可無),一份是對應的模型文件,本次展示的模型是轉換成了 3Dtiles 類型的。 如果我們只做基礎的模型展示,只需要引入一個 js 和 一個 css 文件即可 <script src="js/Ces ...


一、所需的地形文件和模型以及 CesiumJs 包

  操作之前,我們需要兩份對應的文件,一份是地形文件(可無),一份是對應的模型文件,本次展示的模型是轉換成了 3Dtiles 類型的。
  如果我們只做基礎的模型展示,只需要引入一個 js 和 一個 css 文件即可

<script src="js/Cesium194/Cesium.js"></script>
<link href="js/Cesium194/Widgets/widgets.css" rel="stylesheet" />

  cesiumjs 包下載地址

  然後將處理好的模型文件和地圖文件放入項目中即可,也可以採用遠程讀取方式
  tileset.json 是模型的屬性放置文件,載入此文件可以渲染模型
  secnetree.json 裡面存放了模型的結構信息,如果需要展示模型的結構,只需要載入此文件,並對裡面的內容進行序列化

 

二、放置顯示模型的區域

  首先我們需要一個放置模型的區域位置

<div id="cesiumContainer" style="width: 100%; height: 100%"></div>

 

三、載入地圖

  定義一個對象,初始化對象,並載入地圖
  url 的內容為地形文件

 1 var viewer = new Cesium.Viewer("cesiumContainer", {
 2             geocoder: false,
 3             selectionIndicator: false,
 4             animation: false,
 5             baseLayerPicker: false,
 6             timeline: false,
 7             sceneMode: Cesium.SceneMode.SCENE3D,
 8             sceneModePicker: false,
 9             navigationHelpButton: false,
10             useDefaultRenderLoop: true,
11             showRenderLoopErrors: true,
12             fullscreenButton: false,
13             infoBox: true,
14             baselLayerPicker: false,
15             vrButton: false,  // VR
16             homeButton: false,
17             imageryProvider: new Cesium.WebMapTileServiceImageryProvider({
18                 url: 'https://t0.tianditu.gov.cn/img_w/wmts?tk=testkey',
19                 layer: 'img',
20                 style: 'default',
21                 tileMatrixSetID: 'w',
22                 format: 'tiles',
23                 maximumLevel: 18
24             }),
25         });
26         viewer.terrainProvider = new Cesium.CesiumTerrainProvider({
27             url: "DEM/dixingfile",
28             baseLayerPicker: false,
29         });;
30 
31 //初始化對象中,所有屬性的解釋
32 var viewer = new Cesium.Viewer('cesiumContainer',{
33         animation:false,//是否顯示左下角的儀錶盤
34         baseLayerPicker:false,//是否顯示圖層選擇器按鈕,右上角那個地圖圖標
35         fullscreenButton:false,//是否顯示全屏按鈕
36         vrButton:false,//是否顯示VR按鈕
37         geocoder:false,//是否顯示搜索按鈕
38         homeButton:false,//是否顯示主頁按鈕
39         infoBox:false,//是否顯示提示信息
40         sceneModePicker:false,//是否顯示右上角的模式切換按鈕
41         selectionIndicator:false,//是否顯示選取指示器組件
42         timeline:false,//是否顯示下邊的時間軸
43         navigationHelpButton:false,//是否顯示右上角的幫助按鈕
44         navigationInstructionsInitiallyVisible:true,//是不顯示導航
45         scene3DOnly:true,//是否指定僅為三維模式,全部使用三維模式可節約GPU資源
46         clock : new Cesium.Clock(),//用於控制當前時間的時鐘對象  
47         selectedImageryProviderViewModel:undefined,//當前圖象圖層的顯示模型,設置baseLayerPicker為true才生效
48         imageryProviderViewModels : Cesium.createDefaultImageryProviderViewModels(),//可供BaseLayerPicker選擇的圖像圖層ProviderViewModel數組
49         selectedTerrainProviderViewModel:undefined,//當前地形圖層的顯示模型,設置baseLayerPicker為true才生效
50         terrainProviderViewModels:Cesium.createDefaultTerrainProviderViewModels(),//可供BaseLayerPicker選擇的地形圖層ProviderViewModel數組
51         // imageryProvider : new Cesium.OpenStreetMapImageryProvider( {    
52         //     credit :'',    
53         //     url : ''    
54         // } ),//圖像圖層提供者
55         terrainProvider : new Cesium.EllipsoidTerrainProvider(),//地形圖層提供者,
56         // skyBox : new Cesium.SkyBox({    
57         //     sources : {
58         //         positiveX : 'stars/TychoSkymapII.t3_08192x04096_80_px.jpg',
59         //         negativeX : 'stars/TychoSkymapII.t3_08192x04096_80_mx.jpg',
60         //         positiveY : 'stars/TychoSkymapII.t3_08192x04096_80_py.jpg',
61         //         negativeY : 'stars/TychoSkymapII.t3_08192x04096_80_my.jpg',
62         //         positiveZ : 'stars/TychoSkymapII.t3_08192x04096_80_pz.jpg',
63         //         negativeZ : 'stars/TychoSkymapII.t3_08192x04096_80_mz.jpg'
64         //     } 
65         // }),//用於渲染星空的SkyBox對象  
66         skyAtmosphere:new Cesium.SkyAtmosphere(),//設置天空大氣層
67         fullscreenElement:document.body,//全屏時指定的元素
68         useDefaultRenderLoop:true,//是否開啟預設的迴圈渲染器
69         targetFrameRate:10,//使用預設渲染迴圈時的目標幀速率
70         showRenderLoopErrors:true,//顯示渲染錯誤信息
71         useBrowserRecommendedResolution:false,//使用瀏覽器的解析度進行渲染
72         automaticallyTrackDataSourceClocks : true,//自動追蹤最近添加的數據源的時鐘設置  
73         contextOptions : undefined,//傳遞給Scene對象的上下文參數
74         sceneMode:Cesium.SceneMode.SCENE3D,//設置地圖場景模式
75         mapProjection:new Cesium.GeographicProjection(),//設置地圖投影坐標系
76         // globe:false,//在場景中使用的地球儀。如果設置為false,則不會添加地球儀。
77         orderIndependentTranslucency:true,//設置無關的透明性
78         creditContainer:null,//設置包含CreditDisplay的DOM元素或ID。
79         dataSources:new Cesium.DataSourceCollection(),//設置數據源
80         terrainExaggeration:1.0,//用來放大地形的標量
81         shadows:true,//設置陰影是否由光源投射。
82         terrainShadows:Cesium.ShadowMode.RECEIVE_ONLY,//設置地形圖的陰影
83         mapMode2D:Cesium.MapMode2D.INFINITE_SCROLL,//設置二維地圖是可旋轉的還是可以在水平方向無限滾動。
84         projectionPicker:false,//是否顯示投影選擇器
85         requestRenderMode:true,//如果為true,則僅當根據場景中的更改確定需要時才會渲染幀
86         maximumRenderTimeChange:true,//設置請求呈現之前允許的最大模擬時間更改
87     });

 

四、添加模型

  在將模型添加進去,並且定位模型坐標點,設置視角
  url 指向的文件為模型文件,只需要載入 tileset.json 文件即可,因為這個文件存放了模型的信息內容

 1 var MainPosition = Cesium.Cartesian3.fromDegrees(110.3245336, 31.1508983, -20); //模型的經緯度信息
 2 var modelMatrix = Cesium.Transforms.headingPitchRollToFixedFrame(MainPosition, new Cesium.HeadingPitchRoll(Cesium.Math.toRadians(-174.9), 0, 0));
 3 
 4 tileset = viewer.scene.primitives.add(new Cesium.Cesium3DTileset({
 5             url: "Cesium3DTiles/modelCLM/3dtiles/tileset.json",
 6             modelMatrix: modelMatrix,
 7         }));
 8 
 9         viewer.camera.flyTo({
10             duration: 0.5,
11             destination: Cesium.Cartesian3.fromDegrees(110.32784593574513, 31.15503131147595, 600.6198524134546),  //定位坐標點,建議使用谷歌地球坐標位置無偏差
12             orientation: {
13                 heading: Cesium.Math.toRadians(215),
14                 pitch: Cesium.Math.toRadians(-25),
15                 roll: Cesium.Math.toRadians(0.12880948542545628)
16             }
17         });

  截至到這裡,模型就基本可以展示出來了,下麵是對模型的一些操作

 

五、模型點擊事件

  在點擊模型的時候,模型構件是有對應的詳細信息的,所以我們可以通過事件獲取得到這些模型的屬性信息
  可以通過 feature.getPropertyNames() 拿到模型信息,然後使用對應的形式來處理這些信息
  如果你不清楚你的模型有哪些屬性,可以去模型文件 tileset.json 中查找所有屬性。預設點擊後會顯示出所有信息。

 1 var handler3D = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
 2         handler3D.setInputAction(function (movement) {
 3             var feature = viewer.scene.pick(movement.position);
 4             if (feature instanceof Cesium.Cesium3DTileFeature) {
 5 
 6                 //模型構件的信息數據
 7                 //預設點擊後,會顯示模型所有屬性信息,可通過下麵遍歷方式,取自己所需要查看的即可
 8                 var propertyNames = feature.getPropertyNames();
 9 
10                 for (var i = 0; i < propertyNames.length; ++i) {
11                     var propertyName = propertyNames[i];
12                     console.log(propertyName)
13                     name1 = feature.getProperty("name")
14                 }
15             }     
16         }, Cesium.ScreenSpaceEventType.LEFT_CLICK);

 

六、點擊地圖任意點,獲取經緯度及高度

  當我們遇到比較大的模型時,可以會在模型上進行一些操作,這時,我們需要拿到模型某個位置的經緯度及高度信息,可以通過以下方法拿到

 1 let handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
 2         handler.setInputAction(function (event) {
 3             let ray = viewer.camera.getPickRay(event.position);
 4             let cartesian = viewer.scene.globe.pick(ray, viewer.scene);
 5             let cartographic = Cesium.Cartographic.fromCartesian(cartesian);
 6             let lng = Cesium.Math.toDegrees(cartographic.longitude); // 經度
 7             let lat = Cesium.Math.toDegrees(cartographic.latitude); // 緯度
 8             let alt = cartographic.height; // 高度
 9             let coordinate = {
10                 longitude: Number(lng),
11                 latitude: Number(lat),
12                 altitude: Number(alt)
13             };
14             console.log(coordinate);
15         }, Cesium.ScreenSpaceEventType.LEFT_CLICK);

 

七、獲取整個模型的所有構件信息

  如果我們需要在載入完模型後拿到模型部分位置的信息,或者是對整個模型的某個部件進行處理,那麼我們可以在模型載入完成後,將模型對象存入指定的位置。一定要在添加模型的位置去執行此方法,其他位置可能拿不到信息

 1  //構件數據放入對象中
 2 tileset.tileLoad.addEventListener(function (tile) {
 3     processTileFeatures(tile, function (data) {
 4        tileset3dDate.push(data);
 5    });
 6 });
 7             
 8 function processTileFeatures(tile, callback) {
 9     var content = tile.content;
10     var innerContents = content.innerContents;
11     if (Cesium.defined(innerContents)) {
12     var length = innerContents.length;
13     for (var i = 0; i < length; ++i) {
14        processContentFeatures(innerContents[i], callback);
15      }
16    } else {
17        processContentFeatures(content, callback);
18     }
19 }
20 
21 function processContentFeatures(content, callback) {
22    var featuresLength = content.featuresLength;
23    for (var i = 0; i < featuresLength; ++i) {
24         var feature = content.getFeature(i);
25         callback(feature);
26     }
27 }

載入模型的基本操作就這麼多,更多詳細的方法屬性和個性化的設置方法可參考官方文檔
cesium 屬性文檔
cesium 案例展示
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 目的 通過本篇文章帶大家理解一下 Databend 的存儲結構。Databend 內置的 Table 引擎為 Fuse table engine,也是接下來要花重點篇幅要講的。 另外,Databend 還支持外置的 Hive table 及 Icebreg Table ( 即將到來)。Fuse ta ...
  • StoneDB 作為開源項目,一直秉持開源開放的基本原則,我們的社區版代碼現在已經完全在 Github 上開源,並不斷提高代碼的可讀友好性,同時,為了讓大家更好地理解我們是如何打造一款一體化 HTAP 開源資料庫的,我們會定期把一些核心技術的研發實現思路分享給大家,也算是拋磚引玉,如果讀者有更好的實 ...
  • 最近居家中,對自己之前做的一些工作進行總結。正好有Doris社區的小伙伴吐槽向量化的導入性能表現並不是很理想,就借這個機會對之前開發的向量化導入的工作進行了性能調優,取得了不錯的優化效果。借用本篇手記記錄下一些性能優化的思路,拋磚引玉,希望大家多多參與到性能優化的工作總來。 1.看起來很慢的向量化導 ...
  • 首先要知道JavaScript是使用垃圾回收的語言,它會每隔一段時間就會釋放記憶體進行閑置資源回收。像函數中的局部變數,函數執行時在內部使用了變數,棧記憶體會分配空間以保存相應的值。在函數使用結束後,這個局部變數就不需要了,占用的記憶體就會被釋放。 那我們若是想要使這個變數不被清理,一直處於被使用中,那就 ...
  • 題目描述:判斷字元串中重覆次數最多的字元 // 解決思路: // 1.判斷字元重覆的方法 // 創建空數組,利用鍵值對形式對每個字元進行計數 // 用到 採用for迴圈結合if判斷 對象[鍵] 是否有值,無則undefined // arr.charAt(i)取得arr中i索引號下的元素 // 2. ...
  • 安裝nvm、node、npm 下載nvm安裝包,推薦使用1.1.7,我個人使用1.1.8會有中文亂碼的報錯 點擊exe文件,註意修改nvm的安裝根目錄以及node的安裝根目錄,後者是以後管理多版本node的源文件儲存地址 打開系統cmd,依次輸入一下目錄 nvm -version 檢查nvm是否安裝 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 網頁實現列印 可以選擇性的列印某一部分 的vue組件 1.引入 把print.js 下載到本地,然後放在src 下麵添加文件夾里. print.js // 列印類屬性、方法定義 /* eslint-disable */ const Pri ...
  • 1 v-model 1.1 理解 v-model v-model 是 vue3 中的一個內置指令,很多表單元素都可以使用這個屬性,如 input、checkbox 等,咱可以在自定義組件中實現 v-model。v-model 本質上是一個語法糖: 綁定父組件傳遞過來的 modelValue 屬性; ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...