保姆级教程!手把手教你把DEM数据变成Cesium地形切片
前言
在 WebGIS 开发领域,Cesium 凭借其强大的开源生态,已成为三维GIS可视化引擎的首选。构建高质量的三维应用离不开高精度的地形数据支撑。在常规的外网开发、个人学习中,我们通常的做法是注册一个 Cesium Ion 账号,创建 token,最后通过 token 来调用 Cesium Ion 提供的全球地形,确实方便快捷。
然而,在内网涉密环境或商业化私有部署场景下,受限于网络隔离、数据隐私及授权合规性等因素,依赖在线 Token 的方案已经不再适用。这时就需要我们自己来构建一套三维地形切片服务。本文将详细记录在 Windows 环境下,从 DEM 数据处理到最终生成地形瓦片的完整工作流。通过本教程,你将掌握低成本搭建离线地形服务的核心技能。

工具准备
下面是我们需要用到的工具列表:
- QGIS - 开源GIS数据处理工具
- OpenTopography DEM Downloader - QGIS插件,用于下载DEM数据
- Docker Desktop - 用于给ctb-quantized-mesh提供运行环境
- tumgis/ctb-quantized-mesh - 著名开源Cesium地形切片工具 Cesium Terrain Builder 的docker镜像版本,本教程的主角,用于生成地形切片
如果你电脑上还没有这些工具,你需要先下载QGIS软件,然后在插件市场下载 OpenTopography DEM Downloader 插件,并到官网注册账号申请一个免费的token。然后下载DockerDesktop,并在docker的镜像市场下载 tumgis/ctb-quantized-mesh 镜像
QGIS官网下载地址:https://qgis.org/download/
DockerDesktop官网下载地址:https://www.docker.com/products/docker-desktop/
Docker安装提示
关于DockerDesktop的Windows版本选择:
- AMD64(x86_64 ):绝大多数 Windows 电脑(Intel i5/i7/i9 或 AMD Ryzen)都是这个架构。
- ARM64:如果你用的是 Surface Pro X 或其他基于 Snapdragon 处理器的 Windows 电脑,需要下载 ARM 版本。
DockerDesktop安装后,进入到软件主界面,它可能会提示你更新wsl,这是一个运行在Windows上的Linux子系统,你需要以管理员身份打开powershell,执行安装命令。安装时由于网络原因可能会安装失败,建议尝试先开启网络代理,然后执行下面的安装命令
1 | wsl --update --web-download |

操作步骤
下面我将以四川省为例,分两个部分介绍详细的地形切片生成步骤:
1.数据准备 - DEM源数据获取
首先打开QGIS软件,打开数据源管理器,添加两份数据:一份xyz卫星影像瓦片作为我们的底图,一份中国省级行政区划的矢量数据
ArcGIS卫星影像数据源:https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}
四川省行政区划矢量数据源:https://geo.datav.aliyun.com/areas_v3/bound/510000_full.json

图层添加完成后如图所示:

然后打开 OpenTopography DEM Downloader 插件,选择要下载的 DEM 数据源(我这里选的90m精度的 DEM),选择范围(从图层计算),填入你申请的token,选择保存文件的路径,最后点击运行,等待DEM下载完成即可
官网token申请:https://opentopography.org/

下载完成后,可以看到它的范围实际上是一个覆盖四川范围的矩形,可以自行根据需要按行政区划裁剪(非必须),到这一步我们的数据准备工作就完成了!

2.地形切片
有了DEM原始数据,接下来就是使用切片工具将DEM数据切片。
首先打开DockerDesktop,搜索tumgis/ctb-quantized-mesh下载镜像:

接下来进入命令行操作:打开cmd,输入如下命令,启动容器
1 | docker run -v D:/docker/ctb:/data -it tumgis/ctb-quantized-mesh:latest bash |
该命令执行后,会将电脑上D盘下的
/docker/ctb路径作为docker容器的挂载路径,路径可根据自己实际需要更改;命令执行成功后,会进入容器的空间内部,运行环境变成Linux。
将之前我们下载的DEM数据移到/docker/ctb路径下,执行命令ls,就能看到文件:
1 | root@dc3892683b11:/data# ls |
根据官方文档说明,先在cmd执行命令,创建vrt文件:
1 | gdalbuildvrt tiles.vrt sc_90m_dem.tif |
tips:文件名太长时,输入开头按tab可自动补全
执行成功的截图:

然后来到关键一步,创建存放的切片的文件夹,执行切片命令:
1 | mkdir terrain && ctb-tile -f Mesh -C -N -o terrain tiles.vrt |
执行结果如下:

看到0说明任务已经开始,这是它进度条的样式,任务完成后会跟上面一样显示done。
来到最后一步,执行如下命令,生成layer.json文件:
1 | ctb-tile -f Mesh -C -N -l -o terrain tiles.vrt |
所有步骤做完以后打开文件夹查看,文件结构如下,这就是我们完整的地形切片数据:

3.地形发布与Cesium加载
现在我们有了地形切片的静态资源,要在Cesium中加载它,我们还需要使用Nginx将其代理,使其能通过http协议访问。由于tumgis/ctb-quantized-mesh插件生成的.terrain文件默认是经过gzip压缩的,Nginx代理时还要为所有.terrain文件添加响应头:gzip:on,告知浏览器解压后使用。下面是Nginx关键配置:
1 | server { |
代理后,所有terrain文件夹下的资源即可通过http访问,浏览器输入http://localhost/terrain/layer.json 若能成功访问并下载json文件,即说明服务发布成功。

最后在Cesium中加载地形:
1 | //异步加载地形 |


