Mars3D如何使用IMG 格式的 DEM 数据
核心思路
IMG 格式是二进制栅格数据,需先转换为 Mars3D 支持的地形格式(如 Cesium 地形瓦片 或 GeoTIFF),再通过地形图层加载
工具安装(Mac笔记本)
安装工具GDAL
brew install gdal
确认GDAL安装成功
gdalinfo --version
转换操作
将 IMG 格式转换为可加载的地形格式
有两种方案
IMG → GeoTIFF(适用于小范围数据)
img转tif执行下面命令
gdal_translate -of GTiff input_dem.img output_dem.tif
(input_dem.img 是你的 IMG 文件,output_dem.tif 是输出的 GeoTIFF 文件)
加载转换后的GeoTiff数据
const map = new mars3d.Map("mars3dContainer", {
center: [116.3, 39.9, 5000], // 数据覆盖的中心点
zoom: 10
});
// 添加转换后的 GeoTIFF 地形
const terrainLayer = new mars3d.layer.TerrainLayer({
type: "dem",
url: "/data/terrain/output_dem.tif", // 转换后的 GeoTIFF 路径
show: true,
exaggeration: 1.2 // 地形夸张系数
});
map.addLayer(terrainLayer);
GeoTIFF → Cesium 地形瓦片(适用于大范围数据,推荐)
使用第三方工具 dem2terrain
安装
npm install -g dem2terrain
遇到的问题
1、安装npm install -g dem2terrain报错
要解决 dem2terrain 安装报错的问题,需针对 Node-gyp 编译环境依赖 进行配置。以下是 macOS 系统的分步解决方案:
安装必要的编译工具
# 安装 Xcode 命令行工具(提供 C++ 编译器)
xcode-select --install
# 安装 Python 3.9(Node-gyp 对高版本 Python 兼容性较好)
brew install python@3.9
先找到 Python 3.9 的可执行文件路径去配置环境变量
which python3.9
输出类似 /opt/homebrew/opt/python@3.9/bin/python3.9,记下路径。
设置环境变量 npm_config_python
export npm_config_python=/opt/homebrew/opt/python@3.9/bin/python3.9
2、dem2terrain -i merged_dem.tif -o ./cesium_terrain_tiles -e terrarium -z 2-15 报错
报的是权限问题
要解决 zsh: permission denied: dem2terrain 的权限问题,可按以下步骤操作:
执行以下命令查找文件的真实路径:
find /Users/zhangyandan/.nvm -name "dem2terrain" 2>/dev/null
执行以下命令为 dem2terrain 赋予可执行权限:
chmod +x /Users/zhangyandan/.nvm/versions/node/v20.18.1/bin/dem2terrain
执行切片:
dem2terrain -i merged_dem.tif -o ./cesium_terrain_tiles -e terrarium -z 2-15

如果需要改变坐标系使用 dem2terrain 直接指定坐标系
dem2terrain 支持直接设置目标坐标系为 EPSG:4326,命令如下
dem2terrain -i merged_dem.tif -o ./cesium_terrain_tiles_4326 -e terrarium -z 2-15 --epsg 4326
- 参数说明:
--epsg 4326强制将输出瓦片的坐标系指定为 WGS84 地理坐标系。
若 dem2terrain 转换地理坐标系有问题,可先通过 GDAL 将合并后的 GeoTIFF 重投影为 EPSG:4326,再进行切片
gdalwarp -t_srs EPSG:4326 merged_dem.tif merged_dem_4326.tif
切片为 Cesium 地形瓦片:
使用 dem2terrain 或 ctb-tile 对重投影后的文件切片:
dem2terrain -i merged_dem_4326.tif -o ./cesium_terrain_tiles_4326 -e terrarium -z 2-15
在 Mars3D 中加载
将生成的瓦片目录部署到项目静态资源目录(如 public/terrain/cesium_terrain_tiles),通过以下代码加载
const map = new mars3d.Map("mars3dContainer", {
center: [120.0, 30.0, 5000], // 数据覆盖的中心点(根据实际范围调整)
zoom: 10,
terrain: {
type: "provider",
provider: new Cesium.CesiumTerrainProvider({
url: "/terrain/cesium_terrain_tiles", // 瓦片目录路径
requestVertexNormals: true // 启用地形光照(可选)
}),
exaggeration: 1.0 // 地形夸张系数
}
});
准备工作
- 确保所有
.img文件坐标系一致(如均为 WGS84); - 文件名建议包含地理范围信息(如
dem_30N_120E.img、dem_31N_120E.img),方便确认拼接顺序。
生成 VRT 虚拟数据集(中间步骤)
VRT(Virtual Raster)是一种虚拟拼接格式,可将多个文件 “逻辑合并” 为一个,避免直接修改原始文件:
# 进入 .img 文件所在目录
cd /path/to/your/img_files/
# 生成 VRT 文件(合并所有 .img 文件)
gdalbuildvrt merged_dem.vrt *.img
*.img表示当前目录下所有.img文件(若需指定部分文件,可替换为具体文件名,如dem1.img dem2.img);merged_dem.vrt是输出的虚拟数据集文件。
将 VRT 转换为单幅 GeoTIFF
通过 gdal_translate 将虚拟数据集转换为实际的合并后 GeoTIFF:
gdal_translate merged_dem.vrt merged_dem.tif
转换为 Cesium 地形瓦片(推荐)
替代方案:直接加载合并后的 GeoTIFF(小范围数据)
若合并后的 GeoTIFF 文件较小(如 < 100MB),可直接通过 TerrainLayer 加载:
const terrainLayer = new mars3d.layer.TerrainLayer({
type: "dem",
url: "/terrain/merged_dem.tif", // 合并后的 GeoTIFF 路径
show: true,
exaggeration: 1.2
});
map.addLayer(terrainLayer);
关键注意事项
- 文件坐标系一致性:所有
.img文件必须使用同一坐标系(如 WGS84),否则合并后会出现错位。可通过gdalinfo 文件名.img检查每个文件的坐标系。 - 数据重叠处理:若文件间有重叠区域,GDAL 会自动取平均值,无需手动处理。
- 性能优化:
- 大范围数据(如省级以上)必须切片为 Cesium 瓦片,否则加载速度极慢;
- 小范围数据(如城市级)可直接加载合并后的 GeoTIFF,简化流程。
更多推荐



所有评论(0)