共计 2457 个字符,预计需要花费 7 分钟才能阅读完成。
1. 核心概念扫盲
DEM 数据格式
数字高程模型(DEM)本质是记录地表高程值的矩阵。GeoTIFF 是最常见的存储格式,其优势在于:

- 自带地理坐标信息(通过 TFW 文件或内嵌元数据)
- 支持无损压缩(LZW/Deflate)
- 像素值直接对应高程值(单位通常为米)
空间参考系统(CRS)
三维可视化必须统一坐标系统,重点关注:
- 平面坐标系:如 UTM(适合局部区域)
- 高程坐标系:通常使用 EGM96 大地水准面
- 复合坐标系:例如 WGS84+EGM96 组合
地形渲染原理
ArcGIS 通过 TIN(不规则三角网)实现三维表达,其过程:
- 将 DEM 像素点转为三角形顶点
- 根据 Z 值构建三角面片
- 应用光照模型(如 Hillshade)增强立体感
2. 数据准备实战
数据获取渠道
- 公开数据源:
- NASA SRTM(30 米分辨率)
- USGS 3DEP(1 米~10 米)
-
阿里云 DEM 数据集
-
商业数据:
- Airbus WorldDEM4Ortho
- 大疆智图生成 DSM
预处理关键步骤
- 分辨率选择:
- 城市区域建议≤5 米
-
山区可放宽到 10-30 米
-
无效值处理:
# 使用 arcpy 处理 NoData 值 arcpy.management.CopyRaster( input_raster, output_raster, pixel_type="32_BIT_FLOAT", nodata_value=-9999) -
坐标系统检查:
# 验证空间参考 sr = arcpy.Describe(dem).spatialReference if sr.type != "Projected": arcpy.ProjectRaster_management(dem, dem_prj, "WGS 1984 UTM Zone 50N")
3. ArcGIS Pro 操作流程
3.1 Raster to TIN 转换
- 打开【3D Analyst Tools】→【Conversion】→【From Raster】→【Raster to TIN】
- 参数设置技巧:
- Z Tolerance:建议设为 DEM 分辨率的 2 倍
- Maximum Points:根据硬件性能调整(通常 50-100 万)
3.2 垂直夸张系数
- 平原地区:Z-factor 设为 3 - 5 倍
- 丘陵地带:1.5- 2 倍
- 高山区域:保持 1 倍
3.3 山体阴影增强
推荐参数组合:
# Python 脚本生成山体阴影
out_hillshade = arcpy.sa.Hillshade(
in_raster=dem,
azimuth=315, # 光照方位角(西北方向)altitude=45, # 太阳高度角
model_shadows="SHADOWS",
z_factor=0.0001) # 用于米到度单位的转换
4. Python 自动化脚本
完整处理示例:
import arcpy
from arcpy.sa import *
def dem_to_3d(dem_path, output_scene):
try:
# 环境设置
arcpy.env.workspace = os.path.dirname(dem_path)
arcpy.env.overwriteOutput = True
# 步骤 1:坐标系统检查
sr = arcpy.Describe(dem_path).spatialReference
if sr.linearUnitName != 'Meter':
raise Exception("DEM 单位不是米制,请先转换")
# 步骤 2:生成山体阴影
hillshade = Hillshade(dem_path, azimuth=315, altitude=45)
hillshade.save("temp_hillshade.tif")
# 步骤 3:创建 TIN
arcpy.ddd.RasterTin(out_tin=os.path.join(output_scene, "terrain_tin"),
in_features=f"{dem_path} Shape.Z masspoints",
max_points=1000000)
# 步骤 4:构建场景
aprx = arcpy.mp.ArcGISProject("CURRENT")
scene = aprx.createScene(output_scene)
scene.importDocument(os.path.join(output_scene, "terrain_tin"))
return "处理成功"
except arcpy.ExecuteError:
print(arcpy.GetMessages(2))
except Exception as e:
print(str(e))
5. 性能优化策略
大数据处理方案
-
分块处理:
# 使用 Raster Split 工具分割大文件 arcpy.management.SplitRaster( dem_path, "output_folder", "split_dem_", "SIZE_OF_TILE", tile_size="2000 2000") -
LOD 设置原则:
- 近景:0-500 米,1:1 精度
- 中景:500-2000 米,降采样 50%
- 远景:>2000 米,使用概化 TIN
6. 五大常见陷阱
- 坐标系统不匹配
- 现象:地形位置偏移或拉伸
-
解决:使用【Project Raster】统一到相同 CRS
-
Z 值单位错误
- 现象:地形过于平坦或陡峭
-
检查:
arcpy.GetRasterProperties_management(dem, "TOP") -
内存溢出
- 现象:处理大文件时崩溃
-
方案:启用 64 位后台处理
arcpy.env.backgroundProcessing = True -
纹理失真
- 现象:山体出现锯齿
-
优化:在 TIN 属性中启用【自然邻域法】插值
-
光照方向不合理
- 现象:阴影完全遮盖重点区域
- 调整:根据时区设置 azimuth(中国常用 315°)
延伸思考
- 如何结合 LiDAR 点云提升城市三维精度?
- 动态高程数据(如洪水淹没分析)的实时更新方案
- 在 Web 场景中发布三维地形服务的性能优化技巧
实际项目中,曾遇到某省级 DEM 在边界处出现 1.2 米的高程跳变,最终发现是不同航飞批次的数据拼接问题。通过设置边缘羽化参数(feather=10 像素)后解决。这提醒我们:原始数据质检同样重要!
正文完
