核心思路

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.imgdem_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);

关键注意事项

  1. 文件坐标系一致性:所有 .img 文件必须使用同一坐标系(如 WGS84),否则合并后会出现错位。可通过 gdalinfo 文件名.img 检查每个文件的坐标系。
  2. 数据重叠处理:若文件间有重叠区域,GDAL 会自动取平均值,无需手动处理。
  3. 性能优化
    • 大范围数据(如省级以上)必须切片为 Cesium 瓦片,否则加载速度极慢;
    • 小范围数据(如城市级)可直接加载合并后的 GeoTIFF,简化流程。

更多推荐