??本文在cesium 1.52.0下測試
Cesium支持的地形格式
cesium目前支持的格式有下面的兩種地形格式,分別是:
在heightmap 1.0 terrain format說明頁面上送朱,官方明確指出這種格式已經(jīng)廢棄了冠息,推薦使用quantized-mesh崩掘,關(guān)于兩種格式的對比,推薦閱讀這篇文章。
The quantized-mesh format follows the same tile structure as heightmap tiles, but each tile is better optimised for large-scale terrain rendering. Instead of creating a dense, uniform triangle mesh in the browser, an irregular triangle mesh is pre-rendered for each tile. It's a better representation of the landscape, having less detail in flat areas while increasing the density in steep terrain. The mesh terrain is also more memory efficient and renders faster.
在Cesium 1.52.0下測試戈擒,Cesium
還是支持HeightMap
格式的,未來的Release版本有可能還會繼續(xù)支持艰毒。
鑒于歷史原因筐高,項(xiàng)目之前一直使用HeightMap
,最近才遷移成Quantized-Mesh
,但構(gòu)建離線的地形服務(wù)流程基本一致柑土。
基本的構(gòu)建流程為:
- 獲取源DEM文件蜀肘,如SRTM的tif文件
- gdalbuildvrt合并多個(gè)DEM文件(可選)
- 使用ctb-tile,vrt(tif)文件作為輸入稽屏,生成瓦片
- 托管靜態(tài)瓦片資源
- 配置Cesium TerrainProvider
詳細(xì)構(gòu)建流程
第一步的DEM獲取有很多方式扮宠,CGIAR CSI或者SRTM Tile Grabber都提供了不錯(cuò)的交互下載方式。
第二步中的gdalbuildvrt是GDAL中的一個(gè)工具狐榔,可到GDAL的官網(wǎng)下載坛增。
第三步的ctb-tile是一個(gè)命令行工具用來創(chuàng)建Cesium支持的地形瓦片。如果只制作
HeightMap
可使用這個(gè)docker image homme/cesium-terrain-builder薄腻,如果制作Quantized-Mesh
轿偎,可使用這個(gè)docker image tumgis/ctb-quantized-mesh。第四步搭建一個(gè)Node server托管靜態(tài)文件被廓。
第五步是配置cesium TerrainProvider的url坏晦。
如果沒有Docker環(huán)境,首先安裝docker環(huán)境嫁乘,建議安裝Docker for Mac / Windows昆婿,不推薦使用Docker Toolbox。
Docker Toolbox is for older Mac and Windows systems that do not meet the requirements of Docker for Mac and Docker for Windows. We recommend updating to the newer applications, if possible.
這里以構(gòu)建Quantized-Mesh
為例蜓斧,首先獲取image仓蛆。
docker pull tumgis/ctb-quantized-mesh
在一個(gè)新的容器中執(zhí)行。
docker run -v /Volumes/HD/test/work/CH/terrainBuilder:/data -ti -i tumgis/ctb-quantized-mesh:latest bash
合并tiffs挎春,生成.vrt文件看疙。
root@31dd6fa3b480:/data/q_mesh# gdalbuildvrt tiles.vrt ./tiffs/*.tif
創(chuàng)建一個(gè)terrain文件夾存儲切割后的瓦片,運(yùn)行ctb-tile生成瓦片直奋,這個(gè)步驟可能時(shí)間較長能庆,可以出去喝杯咖啡。
root@31dd6fa3b480:/data/q_mesh# ctb-tile -f Mesh -C -N -v -o ./terrain/ ./tiles.vrt
// 執(zhí)行結(jié)果
0...10...20...30...40...50...60...70...80...90...100 - done.
創(chuàng)建Cesium layer.json描述文件脚线。
root@31dd6fa3b480:/data/q_mesh# ctb-tile -f Mesh -C -N -l -o ./terrain/ ./tiles.vrt
// 執(zhí)行結(jié)果
0...10...20...30...40...50...60...70...80...90...100 - done.
到此搁胆,cesium Quantized-Mesh
的地形瓦片就生成完畢。
最后在程序中使用:
viewer = new Cesium.Viewer('cesiumContainer', {
shouldAnimate: true,
imageryProvider: Cesium.createTileMapServiceImageryProvider({
url: Cesium.buildModuleUrl(MAP_PATH)
}),
terrainProvider: new Cesium.CesiumTerrainProvider({
url: TERRAIN_PATH, // 指定你的地形瓦片url
}),
}
注:使用Node編寫server的時(shí)候邮绿,需要額外的header設(shè)置渠旁。
app.use(function(req, res, next) {
let filePath = path.join(__dirname, url.parse(req.url).pathname);
let pathTmep = path.extname(filePath)
// 瓦片以.terrain作為文件名后綴
if (pathTmep === '.terrain') {
res.set({
'Content-Type': 'application/octet-stream',
'Content-Encoding': 'gzip',
});
// Content-Disposition: attachment;filename=2948.terrain
res.set('Content-Disposition', 'attachment;filename='+path.basename(filePath))
}
next();
})
Quantized-Mesh vs HeightMap
選取一個(gè)4*3的矩形區(qū)域作為數(shù)據(jù)源:
采用的流程都是先將上述12個(gè)tif合并成一個(gè).vrt文件,然后使用ctb-tile來進(jìn)行切割船逮。從最終得到的數(shù)據(jù)集的大小來看顾腊,Quantized-Mesh更節(jié)省空間,運(yùn)行時(shí)會更節(jié)省內(nèi)存:
Quantized-Mesh | HeightMap | |
---|---|---|
文件大小 | 747M | 1.02G |
占用空間 | 1.44G | 1.50G |
效果對比:
-
Quantized-Mesh
-
HeightMap