Cesium 生成terrain地形資料----CTB方式及步驟
阿新 • • 發佈:2018-11-08
背景:專案前端使用Cesium,地形服務一直使用外網的,常常因為翻牆訪問的問題,導致地形資料取不到,進而導致地球不能載入,故決定搭建自己的地形服務,徹底解決這個問題。博文包含以下幾個過程:
- 下載原始地形資料,格式為.tif。
- 處理地形資料,將零散的地形檔案整合成一個地形檔案。
- 配置CTB環境
- 使用ctb-tile指令將地形檔案(.tif)加工成.terrain檔案。
- 釋出地形服務並使用Cesium呼叫。
一、下載原始地形資料
- 下載地址(精度90m):
http://srtm.csi.cgiar.org/SELECTION/inputCoord.asp - 如果你剛好需要的也是全國地形,可以從樓主網盤下載,更快更方便(密碼zyt9):
網盤包含兩部分內容:
- dem.rar:原始資料,需要自行使用ArcMap工具整合。
- 合併後的資料:經過ArcMap工具處理的資料,已經整合成了一個地形檔案,可以直接跳到第三步。
在網站下載流程:
- 開啟網頁http://srtm.csi.cgiar.org/SELECTION/inputCoord.asp。如圖:
- 根據需要選擇方便的選取方式:
MutilpleSelection:點選哪個選哪個,可以選擇多個,雙擊取消。
EnableMouseDrag:框選,框選了什麼範圍就是什麼範圍。
InputCoordinates:輸入最西,最東。最南,最北的座標來下載該範圍內的所有資料。 - 選擇好範圍後,點選“Click here to Begin Search”,進入下一步。
- 可以看到剛剛選擇了幾個資料,點選每個資料的DownLoad,下載資料(這個地方比較繁瑣,需要耐心)。
- 下載完資料後解壓所有的壓縮包,並將tifwen檔案拷貝到統一的資料夾內,這裡的內容和我網盤中的dem.rar是一樣的:
二、處理地形資料
由於CTB工具不支援DEM為NoData值和float的資料,所以需要對資料進行處理。
- 多個tif必須縣合併鑲嵌成一張tif
- pixeltype從float轉為int
- NoData值處理為0
我使用的是ArcGis10.5,開啟ArcMap:
開啟 ArcToolbox->Data Management Tools->Raster->Raster Dataset ->Mosaic。
這個處理過程很久,可以在Result面板裡檢視轉換過程。成功後,處理NoData值,處理公式為:
Con(IsNull("xxxx.tif"),0,"xxxx.tif")//xxxx.tif對應你的合併後的檔案
三、配置CTB環境
- 下載CTB工具包:資源
- 將ctb和gdal-data拷貝至合適的目錄下如:D:\soft\CTB
- 配置環境變數:
四、使用CTB生成.terrain檔案:
注意:執行前請確保輸出資料夾存在且是空的,同時保證磁碟有足夠的空間,全球資料大約800G。生成瓦片的等級不要太高,中國範圍內單18級就需要大約700G。
開啟cmd控制檯,輸入指令如:
ctb-tile -o D:\terrain\china\terrain -s 14 -e 0 -r nearest -c 4 C:\Users\Administrator\Documents\ArcGIS\dem_result\noData\new.tif
這個過程更加費時間,需要等待很久,直到執行結束。
五、釋出並使用Cesium呼叫
- 將生成的檔案拷貝到Tomcat伺服器下。
- 拷貝“覆蓋至生成tiles結果”目錄中的layer.json檔案和0資料夾至生成結果目錄下:
- 呼叫程式碼:
var terrainLayer = new Cesium.CesiumTerrainProvider({ url: "https:/localhost:8080/mapcache/cesium/terrain", // 預設立體地表 }); scene.terrainProvider = terrainLayer;
至此,地形釋出完成。如有錯誤之處歡迎指正。
後記:有朋友反饋,太大的地形處理出來之後有問題,使用的時候會報錯,這裡我在給出一個簡單的工具:CesiumLab
操作方式仍然需要執行完第二步,也就是整合地形檔案為一個tif,然後使用CesiumLab的地形處理工具處理,親測可用,0-12級,需要約2天時間。