前言
我相信使用过Cesium的小伙伴一定不会陌生CesiumLab,将DEM数据导入CesiumLab的地形切片模块工具,设置一下切片参数,喝杯咖啡,等待任务完成,然后发布服务,最后使用API调用服务,大功告成......一开始,我也是如此的成功,不就是将DEM切成Cesium指定的地形格式嘛,CesiumLab是最佳的选择(毕竟是CesiumLab团队深耕的免费工具)。但是,这只是开始,试想一下,如果我们想实现自动化切片该怎么办?毕竟CesiumLab是个桌面端程序,图形交互界面,想要直接集成CesiumLab比较困难,况且,CesiumLab并未开放命令行调用接口,需要购买源码才能拥有该权限,哎,为了一个命令行调用接口,需要上升到购买源码地步,果断,放弃集成CesiumLab。既然放弃了集成CesiumLab技术路线,花时间自己写一个,又不太实际,好在,Cesium的地形格式是开源的,截至目前为止,有Heightmap-1.0和Quantized-Mesh-1.0格式,最重要的是,已有国外的大神提供了源码级别的切片工具,在Github上可以找到(比较深藏不露),有没有很激动,又为自己省下了一大笔钱。
地形合并,一般的技术路线是先合并DEM,再切片。但有些时候,DEM的切片并不是在同一时间段发生的,也不总是一个人操作的,这样子就会面临这么一个现状:我们拥有多份切片数据(可能有些切片数据没有相应的原始数据),现在想要进行合并,如果按照之前的方式,先合并DEM,再切片,原先的DEM可能没有,而且重新切片所带来的时间消耗是令人煎熬的。因此,这个时候,直接合并切片是最佳的选择,既不用担心找不到原始的DEM,又节省时间。
我基于以上场景,各种搜集资料,并最终得以实现,与大家分享一下。如有不对的,还请大神们帮忙纠正。
地形格式介绍
掌握Cesium的地形格式是基本功,我们不能直接跳过这一步骤,并且需要阅读Cesium的官方文档,才是最准确无误的。
- Heightmap-1.0
Heightmap-1.0是Cesium早期使用的地形切片格式,每个瓦片存储65*65个高度值,通过Cesium API进行解析、构网、渲染、查询等。优点是切片简单,存储小,缺点是精度不高等。
Heightmap-1.0官方文档github.com- Quantized-Mesh-1.0
Quantized-Math-1.0是Cesium现在及未来使用的地形切片格式,会慢慢的替代Heightmap-1.0格式,因此,我们应该优先掌握该格式。
Quantized-Mesh-1.0官方文档github.com地形工具
仅支持Heightmap-1.0格式的CTB开源工具github.com 支持Heightmap-1.0和Quantized-Mesh-1.0的CTB开源工具github.com地形工具编译
既然已经把源码的Github地址附上了,第一步,当然是下载下来啦,任意下,推荐第二个。
因为我是在Win10系统编译的,所以,我这边就基于Win10系统罗列编译的依赖与步骤:
- 依赖
- 依赖安装与编译
1.visual studio 2019
- 一键安装,喝杯咖啡。
2.gdal安装与编译
- 解压,注意解压路径一定要纯英文和没有空格。
- 修改./nmake.opt文件(最好使用vs2019打开),将57行的GDAL_HOME改成解压后的GDAL的实际路径,将191行的#WIN64=YES改为WIN64=YES(即把#去掉)。
- 管理员运行x64 Native Tools Command Prompt for VS 2019工具,输入nmake -f makefile.vc MSVC_VER=1910 WIN64=1开始编译,喝杯咖啡,完成后,依次输入nmake -f makefile.vc install、nmake -f makefile.vc devinstall,最后,配置环境变量,将./data配置为GDAL_DATA。
- 完成gdal的安装与编译。
3.zlib安装与编译
- 解压,注意解压路径一定要纯英文和没有空格。
- 使用管理员打开vs2019,然后打开./contrib/vstudio/vc14/zlibvc.sln解决方案,右键zlibvc项目,找到生成事件,把命令行的bat文件路径改成绝对路径,最后直接右键解决方案,选择生成。
- 复制./zconf.h、./zlib.h、./contrib/vstudio/vc14/x64/ZlibDllDebug/zlibwapi.dll、./contrib/vstudio/vc14/x64/ZlibDllDebug/zlibwapi.lib到一个目录下(该目录需要自己新建)。
- 完成zlib安装与编译。
4.cmake安装
- 一键安装,喝杯咖啡。
CTB编译
- 打开cmake gui,配置source code路径和build路径,勾选Advanced。
- 配置GDAL_INCLUDE_DIR为GDAL编译后的include文件夹,GDAL_LIBRARY为GDAL编译后的.lib文件。
- 配置ZLIB_INCLUDE_DIR是zlib动态库所在文件夹,ZLIB_LIBRARY_DEBUG , ZLIB_LIBRARY_RELEASE是zlib的.lib文件。
- 配置完成后点击Configure,选择编译平台为MSVC2019,然后点击Generate,即可在build路径下生成MSVC2019的sln工程文件。
CTB安装与命令
- 新建一文件夹,将上一步生成exe文件和zlib库放在该文件夹下,打开CMD命令行,输入ctb-info.exe --version,若返回ctb版本号,则说明安装成功。
- 切瓦片(Quantized-Mesh-1.0格式):ctb-tile -f Mesh -C -o {outputDir} {demPath}
- 生成meta文件:ctb-tile -f Mesh -C -l -o {outputDir} {demPath}
- 可以使用ctb-tile -h命令获取帮助
CTB更改源码
由于ctb默认采用gzip压缩,因此普通的服务器如IIS和Tomcat发布地形切片后,前端解析渲染时会报错,要么就是使用cesium-terrain-server作为服务器,要么修改源码,使其默认不使用gzip压缩即可。
地形合并
由于地形切片是基于全球范围进行切片的,因此合并的时候,只需要合并相同的{z}/{x}/{y}.terrain和layer.json文件即可。