build cesium offline terrain

??本文在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)建流程為:

    1. 獲取源DEM文件蜀肘,如SRTM的tif文件
    1. gdalbuildvrt合并多個(gè)DEM文件(可選)
    1. 使用ctb-tile,vrt(tif)文件作為輸入稽屏,生成瓦片
    1. 托管靜態(tài)瓦片資源
    1. 配置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


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末挖胃,一起剝皮案震驚了整個(gè)濱河市杂靶,隨后出現(xiàn)的幾起案子承耿,更是在濱河造成了極大的恐慌,老刑警劉巖伪煤,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件加袋,死亡現(xiàn)場離奇詭異,居然都是意外死亡抱既,警方通過查閱死者的電腦和手機(jī)职烧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來防泵,“玉大人蚀之,你說我怎么就攤上這事〗菖ⅲ” “怎么了足删?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長锁右。 經(jīng)常有香客問我失受,道長,這世上最難降的妖魔是什么咏瑟? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任拂到,我火速辦了婚禮,結(jié)果婚禮上码泞,老公的妹妹穿的比我還像新娘兄旬。我一直安慰自己,他們只是感情好余寥,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布领铐。 她就那樣靜靜地躺著,像睡著了一般宋舷。 火紅的嫁衣襯著肌膚如雪绪撵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天肥缔,我揣著相機(jī)與錄音莲兢,去河邊找鬼。 笑死续膳,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的收班。 我是一名探鬼主播坟岔,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼摔桦!你這毒婦竟也來了社付?” 一聲冷哼從身側(cè)響起承疲,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鸥咖,沒想到半個(gè)月后燕鸽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡啼辣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年啊研,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸥拧。...
    茶點(diǎn)故事閱讀 40,096評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡党远,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出富弦,到底是詐尸還是另有隱情沟娱,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布腕柜,位于F島的核電站济似,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏盏缤。R本人自食惡果不足惜碱屁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蛾找。 院中可真熱鬧娩脾,春花似錦、人聲如沸打毛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽幻枉。三九已至碰声,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間熬甫,已是汗流浹背胰挑。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留椿肩,地道東北人瞻颂。 一個(gè)月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像郑象,于是被迫代替她去往敵國和親贡这。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容