第一次接触地形切片时,我被各种专业术语搞得晕头转向。简单来说,地形切片就像把一整块蛋糕切成小块,方便大家分着吃。在三维地图领域,我们需要把庞大的地形数据切割成小块,这样浏览器才能流畅加载和渲染。
GDAL(Geospatial Data Abstraction Library)是处理地理空间数据的瑞士军刀。它支持读取、写入和转换各种栅格和矢量地理空间数据格式。而Cesium Terrain Builder(CTB)则是专门为Cesium设计的工具,能把GDAL处理好的数据转换成Cesium能直接使用的Quantized Mesh格式。
为什么需要Docker?想象你有一台新电脑,要安装GDAL、CTB和各种依赖库,这个过程可能遇到各种环境问题。Docker就像一个打包好的工具箱,里面所有工具都配置好了,开箱即用。特别是CTB官方提供的Docker镜像,已经包含了所有必要组件,省去了繁琐的安装过程。
任何地形处理流程的第一步都是获取原始数据。常见的DEM(数字高程模型)数据格式包括GeoTIFF、HGT等。可以从公开数据源如NASA SRTM、USGS等下载。我最近处理的一个项目使用的是30米分辨率的SRTM数据,文件格式为GeoTIFF。
在Windows上安装Docker很简单:
安装完成后,打开命令提示符(Win+R,输入cmd)运行以下命令验证安装:
bash复制docker --version
如果看到版本号输出,说明安装成功。
CTB官方提供了预配置的Docker镜像,省去了自己编译安装的麻烦。运行以下命令获取最新镜像:
bash复制docker pull tumgis/ctb-quantized-mesh
这个镜像包含了GDAL、CTB和所有必要的依赖项,大小约1GB,下载速度取决于你的网络状况。
处理大范围地形数据时,可能有多张GeoTIFF文件。GDAL的VRT(虚拟数据集)功能可以把它们合并成一个逻辑上的单一数据集,而不需要实际合并文件。
假设我们有三个相邻的DEM文件:dem1.tif、dem2.tif和dem3.tif,创建VRT的命令如下:
bash复制gdalbuildvrt merged.vrt dem1.tif dem2.tif dem3.tif
VRT文件很小,只是一个XML描述文件,记录了如何组合这些TIFF文件。我处理过一个覆盖整个省份的项目,使用VRT成功合并了56个DEM文件,处理起来非常方便。
有了VRT文件后,就可以用CTB生成Cesium地形切片了。关键命令如下:
bash复制ctb-tile -f Mesh -C -N -o terrain merged.vrt
参数说明:
-f Mesh:指定输出为Quantized Mesh格式-C:创建地形瓦片-N:不生成法线(可以加快处理速度)-o terrain:输出目录名为terrain在我的i7处理器+32GB内存的机器上,处理100km×100km范围的30米分辨率DEM大约需要15分钟。处理时间主要取决于数据范围和分辨率。
为了让Cesium知道如何加载这些切片,还需要生成一个图层描述文件:
bash复制ctb-tile -f Mesh -C -N -l -o terrain merged.vrt
这个命令会生成一个layer.json文件,包含了切片的基本信息如范围、层级等。Cesium通过这个文件了解如何组织和使用地形切片。
Docker容器是临时的,关闭后里面的数据会丢失。为了保存生成的地形切片,需要使用数据卷(Volume)把容器内的目录映射到主机。
以下命令将主机的D:\docker\terrain目录映射到容器的/data目录:
bash复制docker run -it --name ctb -v "D:\docker\terrain":"/data" tumgis/ctb-quantized-mesh
这样处理后,所有生成的文件都会保存在主机的D:\docker\terrain目录下,即使容器关闭也不会丢失。
当处理省级或国家级的大范围地形时,可能会遇到内存不足的问题。这时可以考虑:
例如,将一个大的DEM分成4块:
bash复制gdalwarp -te xmin ymin xmax ymax -ts 2048 2048 input.tif output_part1.tif
记得保持各区块之间有适当重叠,避免接缝处出现问题。
CTB提供了多个参数可以调整切片效果:
-z:指定起始和结束的缩放级别--mesh-quality:控制网格简化质量(1-10)--keep-water-mask:保留水体标记例如,生成从级别10到15的切片,并提高网格质量:
bash复制ctb-tile -f Mesh -C -N -z 10 15 --mesh-quality 8 -o terrain input.vrt
如果遇到容器启动失败,首先检查:
可以尝试先运行简单的测试容器:
bash复制docker run hello-world
如果这个能运行,说明Docker基础环境没问题。
处理某些DEM文件时,GDAL可能会报错。常见原因包括:
解决方法:
bash复制gdalinfo problem.tif
如果切片生成成功但Cesium中不显示,检查:
一个快速测试方法是使用Cesium的本地服务器:
bash复制cd terrain
python -m http.server 8000
然后在浏览器中访问http://localhost:8000查看是否能看到layer.json文件。
去年我参与了一个智慧城市项目,需要将全市2000平方公里的地形数据转换为Cesium可用的格式。最初尝试手动安装GDAL和CTB,花了三天时间解决各种依赖问题。后来改用Docker方案,整个环境准备只用了不到半小时。
数据处理过程中,我们发现原始DEM有一些异常值(如海平面以下的数据点),导致生成的地形出现"黑洞"。通过GDAL的gdal_calc.py工具,我们添加了一个简单的过滤器:
bash复制gdal_calc.py -A input.tif --outfile=filtered.tif --calc="A*(A>0)"
这个命令将所有负值设为0,解决了地形异常问题。
另一个经验是关于切片层级的设置。最初我们生成了从0到18的所有级别切片,结果数据量高达300GB。后来分析发现,我们的应用场景最多只需要14级细节。调整后数据量减少到15GB,加载速度也大幅提升。