ArcGIS利用DEM生成三维地形:从数据准备到可视化实战指南

1次阅读
没有评论

共计 2457 个字符,预计需要花费 7 分钟才能阅读完成。

image.webp

1. 核心概念扫盲

DEM 数据格式

数字高程模型(DEM)本质是记录地表高程值的矩阵。GeoTIFF 是最常见的存储格式,其优势在于:

ArcGIS 利用 DEM 生成三维地形:从数据准备到可视化实战指南

  • 自带地理坐标信息(通过 TFW 文件或内嵌元数据)
  • 支持无损压缩(LZW/Deflate)
  • 像素值直接对应高程值(单位通常为米)

空间参考系统(CRS)

三维可视化必须统一坐标系统,重点关注:

  • 平面坐标系:如 UTM(适合局部区域)
  • 高程坐标系:通常使用 EGM96 大地水准面
  • 复合坐标系:例如 WGS84+EGM96 组合

地形渲染原理

ArcGIS 通过 TIN(不规则三角网)实现三维表达,其过程:

  1. 将 DEM 像素点转为三角形顶点
  2. 根据 Z 值构建三角面片
  3. 应用光照模型(如 Hillshade)增强立体感

2. 数据准备实战

数据获取渠道

  • 公开数据源:
  • NASA SRTM(30 米分辨率)
  • USGS 3DEP(1 米~10 米)
  • 阿里云 DEM 数据集

  • 商业数据:

  • Airbus WorldDEM4Ortho
  • 大疆智图生成 DSM

预处理关键步骤

  1. 分辨率选择:
  2. 城市区域建议≤5 米
  3. 山区可放宽到 10-30 米

  4. 无效值处理:

    # 使用 arcpy 处理 NoData 值
    arcpy.management.CopyRaster(
        input_raster, 
        output_raster, 
        pixel_type="32_BIT_FLOAT", 
        nodata_value=-9999)

  5. 坐标系统检查:

    # 验证空间参考
    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 转换

  1. 打开【3D Analyst Tools】→【Conversion】→【From Raster】→【Raster to TIN】
  2. 参数设置技巧:
  3. Z Tolerance:建议设为 DEM 分辨率的 2 倍
  4. 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. 五大常见陷阱

  1. 坐标系统不匹配
  2. 现象:地形位置偏移或拉伸
  3. 解决:使用【Project Raster】统一到相同 CRS

  4. Z 值单位错误

  5. 现象:地形过于平坦或陡峭
  6. 检查:arcpy.GetRasterProperties_management(dem, "TOP")

  7. 内存溢出

  8. 现象:处理大文件时崩溃
  9. 方案:启用 64 位后台处理

    arcpy.env.backgroundProcessing = True

  10. 纹理失真

  11. 现象:山体出现锯齿
  12. 优化:在 TIN 属性中启用【自然邻域法】插值

  13. 光照方向不合理

  14. 现象:阴影完全遮盖重点区域
  15. 调整:根据时区设置 azimuth(中国常用 315°)

延伸思考

  1. 如何结合 LiDAR 点云提升城市三维精度?
  2. 动态高程数据(如洪水淹没分析)的实时更新方案
  3. 在 Web 场景中发布三维地形服务的性能优化技巧

实际项目中,曾遇到某省级 DEM 在边界处出现 1.2 米的高程跳变,最终发现是不同航飞批次的数据拼接问题。通过设置边缘羽化参数(feather=10 像素)后解决。这提醒我们:原始数据质检同样重要!

正文完
 0
评论(没有评论)