本以为编译cesium-terrian-tools编译应该没那么难,不想问题重重,不想后人重蹈覆辙,也记录下点点滴滴。
- 目前网上存在的cesium代码版本主要有两个分支:
- 原始网站【不能生成layer文件,且经久不更新,使用gdal2版本】:https://github.com/geo-data/cesium-terrain-builder
- docker分支版本 【可以生成layer文件,gzip需要单独设置修改,gdal版本和原网站要求不同】ahuarte47/cesium-terrain-builder at master-quantized-mesh (github.com)
编译geo-data版本
链接编译,无法link GDALCreateOverviewDataset,gdal版本不对,可以暂行注释掉,应该是个扩展功能可以不管
//poSrcOvrDS = GDALCreateOverviewDataset( poSrcDS, iOvr, FALSE);
poSrcOvrDS = nullptr;// GDALCreateOverviewDataset(poSrcDS, iOvr, FALSE, FALSE);
}
ahuarte47 版本
-
git clone 后,记得要切换到最新代码,默认没有切换到最新代码,【坑】
-
gdal 307 或gdal204 使用时,可能出现部分重载函数声明不一致,需要改ctb源码即可解决
-
网上其他设置:
- 中文支持: GDALAllRegister后添加CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "NO");
-
cesium 发布地形,默认需要关闭gzip,才可以被cesium加载
-
发布命令:
- 生成瓦片(本源码修改了默认不输出gzip格式,参考网上https://zhuanlan.zhihu.com/p/60908864)
cmdctb-tile.exe --output-dir H:/ctb_output H:/shenzhen_dem/L15/shenzhen_dem.tif -f Mesh
- 生成layer
cmdctb-tile.exe --gzip --output-dir H:/ctb_output H:/shenzhen_dem/L15/shenzhen_dem.tif -f Mesh -l
上图为证:
Cesium-1.106版本加载terrian
cesium测试代码:
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
html,
body,
#cesiumContainer {
width: 100%;
height: 100%;
margin: 0;
padding: 0;
overflow: hidden;
}
</style>
<!-- Include the CesiumJS JavaScript and CSS files -->
<script src="../Build/CesiumUnminified/Cesium.js"></script>
<style>
@import url(../Build/CesiumUnminified/Widgets/widgets.css);
html,
body,
#cesiumContainer {
width: 100%;
height: 100%;
margin: 0;
padding: 0;
overflow: hidden;
}
</style>
</head>
<body>
<div id="cesiumContainer"></div>
<script>
Cesium.Ion.defaultAccessToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiI0NzkzYjFkNi1mODZhLTRkNjAtYWE1YS1jYzE5NzBjNjhkNjciLCJpZCI6MTQyMjI1LCJpYXQiOjE2ODYyMzUxODl9.l8y5SN0ALIwPZh9eM8Al14DBpfMjHdeG7uqb69tH6nU';
<!-- const viewer = new Cesium.Viewer('cesiumContainer'); -->
const viewer = new Cesium.Viewer('cesiumContainer', {
terrainProvider: new Cesium.EllipsoidTerrainProvider({}),//移除自带地形
baseLayerPicker:false,
homeButton:false,
infoBox:false,
timeline:false,
navigationHelpButton:false,
geocoder:false,
sceneModePicker:false,
animation:false,
fullscreenButton:false
});
//viewer.imageryLayers.removeAll();
var terrainProvider = new Cesium.CesiumTerrainProvider({
url: './ctb_shenzhen_nogzip/'
});
viewer.scene.terrainProvider = terrainProvider;
viewer.camera.flyTo({
//destination: Cesium.Cartesian3.fromDegrees(121.8040466308, 29.9597, 2500)
// 深圳
destination: Cesium.Cartesian3.fromDegrees(114.1040466308, 22.5, 2500)
});
</script>
</body>
</html>
## 参考:
[基于Docker使用CTB生成地形切片并加载 - 当时明月在曾照彩云归 - 博客园 (cnblogs.com)](https://www.cnblogs.com/jiujiubashiyi/p/17104115.html)
非压缩:[Cesium地形切片--CTB(cesium-terrain-builder)填坑指南 - 知乎 (zhihu.com)](