当我们需要在内网环境或网络不稳定条件下部署Cesium三维地球时,离线地形数据加载成为刚需。本文将彻底解决这个痛点,通过完整的工具链实操演示,带你从零完成广东地区90米分辨率地形数据的获取、处理与发布全流程。
工欲善其事必利其器,我们需要三款核心工具构建离线地形处理流水线:
提示:所有工具安装路径建议使用纯英文目录,避免后续处理中出现路径解析问题
工具配置关键点:
| 工具 | 版本要求 | 配置要点 | 下载来源 |
|---|---|---|---|
| GlobalMapper | 14.1及以上 | 安装后选择中文界面版 | 官网或授权渠道 |
| CesiumLab | 2.0+ | 无需特别配置 | cesiumlab.com官方下载 |
| Nginx | 1.18+ | 修改conf文件发布静态资源 | nginx.org稳定版 |
安装验证方法:
bash复制# 检查GlobalMapper是否安装成功
开始菜单 → 搜索"GlobalMapper Chinese"
# 验证CesiumLab运行
双击桌面快捷方式 → 查看主界面是否正常加载
# 测试Nginx服务
start nginx
tasklist /fi "imagename eq nginx.exe"
我们选择地理空间数据云平台的SRTM DEM 90米分辨率数据作为数据源,这是目前免费可获取的较高质量全球地形数据。以广东省为例,具体操作流程:
下载后的数据包为压缩文件,解压后得到如下文件结构:
code复制GD_DEM/
├── srtm_59_05.tif
├── srtm_59_06.tif
├── srtm_60_05.tif
└── srtm_60_06.tif
GlobalMapper的强大之处在于能无缝合并多个DEM图幅:
合并过程可能耗时较长(广东地区约5-10分钟),建议勾选"生成统计信息"以便后续验证数据质量。
将合并后的GeoTIFF导入CesiumLab进行地形切片:
python复制# 伪代码展示切片参数逻辑
class TerrainConfig:
def __init__(self):
self.input_path = "G:/GD_merged.tif"
self.output_dir = "G:/terrain_tiles"
self.tile_type = "散列文件" # 兼容性最佳
self.max_zoom = 14 # 广东地区建议值
self.water_mask = True # 启用水域效果
self.normal_map = True # 生成法线贴图
关键参数说明:
切片完成后,检查输出目录应包含以下结构:
code复制guangdong/
├── layer.json
├── 0/
│ ├── 0/
│ │ └── terrain.terrain
│ └── 1/
│ └── terrain.terrain
└── 1/
├── 0/
│ └── terrain.terrain
└── 1/
└── terrain.terrain
使用文本编辑器打开layer.json,验证关键元数据:
json复制{
"tilejson": "2.1.0",
"format": "heightmap-1.0",
"available": [ "0/0/0", "0/0/1", "0/1/0", "0/1/1" ],
"attribution": "Generated by CesiumLab",
"version": "1.0.0",
"projection": "EPSG:4326"
}
修改nginx.conf添加地形数据服务节点:
nginx复制server {
listen 8080;
server_name localhost;
location /terrain {
alias G:/terrain_tiles/guangdong;
autoindex off;
add_header 'Access-Control-Allow-Origin' '*';
expires 30d;
}
}
配置要点:
启动命令:
bash复制nginx -t # 测试配置
nginx -s reload # 热重载配置
在HTML中初始化带离线地形的Viewer:
javascript复制const viewer = new Cesium.Viewer('cesiumContainer', {
terrainProvider: new Cesium.CesiumTerrainProvider({
url: '/terrain',
requestVertexNormals: true,
requestWaterMask: true
}),
baseLayerPicker: false,
imageryProvider: new Cesium.TileMapServiceImageryProvider({
url: '/offline_map'
})
});
// 地形夸张系数调节
viewer.terrainExaggeration = 1.2;
viewer.scene.globe.depthTestAgainstTerrain = true;
性能优化技巧:
viewer.scene.globe.tileLoadProgressEvent.addEventListenerviewer.scene.screenSpaceCameraController.minimumZoomDistanceCesium.CesiumTerrainProvider.fromUrl + localStorageQ1 地形显示为纯色平面
Q2 出现地形裂缝
Q3 性能卡顿
javascript复制// 调试代码示例
viewer.scene.globe.tileLoadProgressEvent.addEventListener(function(remaining) {
console.log(`待加载瓦片: ${remaining}`);
});
实际项目中,广东某智慧城市平台采用本方案后,地形加载时间从网络环境的12秒降至本地200毫秒,同时减少了90%的带宽消耗。关键在于: