共计 2464 个字符,预计需要花费 7 分钟才能阅读完成。
DOM 与 DSM 基础概念
DOM(Digital Orthophoto Map,数字正射影像图)是通过航空摄影或遥感影像经过几何校正和拼接处理后的高精度二维图像。其特点是消除了地形起伏和相机倾斜造成的变形,具有统一的比例尺和坐标系统。

DSM(Digital Surface Model,数字表面模型)则是包含地表所有地物(如建筑物、树木等)高度信息的三维数字模型。与 DEM(数字高程模型)不同,DSM 保留了自然和人造地物的顶部高程信息。
在三维建模中,DOM 提供地表纹理信息,DSM 提供高程数据,二者结合可以生成具有真实纹理的三维场景。这种技术在智慧城市、地形分析、虚拟现实等领域有广泛应用。
数据准备与预处理
- 数据获取
- DOM 数据通常来源于航拍或卫星影像,需注意分辨率(建议 0.5m 以内)和坐标系统(推荐 UTM/WGS84)
-
DSM 数据可通过 LiDAR、摄影测量或雷达干涉测量获取,检查数据是否有空洞或异常值
-
数据对齐
- 确保 DOM 和 DSM 的坐标系统和分辨率一致
-
使用 GDAL 进行重采样和投影变换:
import gdal # DOM 重采样示例 dom_ds = gdal.Open('dom.tif') gdal.Warp('dom_aligned.tif', dom_ds, xRes=0.5, yRes=0.5, dstSRS='EPSG:32650') -
数据检查
- 验证数据覆盖范围是否重合
- 检查 DSM 是否存在负值或异常高程(如 9999 等填充值)
模型生成核心流程
- 数据加载
-
使用 rasterio 加载 DOM 和 DSM:
import rasterio with rasterio.open('dom.tif') as dom: dom_data = dom.read(1) # 读取第一个波段 with rasterio.open('dsm.tif') as dsm: dsm_data = dsm.read(1) -
网格生成
-
基于 DSM 创建三角网格(TIN):
from scipy.spatial import Delaunay # 创建采样点(简化示例)points = [(x,y,dsm_data[y,x]) for x in range(0, dsm.width, 10) for y in range(0, dsm.height, 10)] tri = Delaunay([(x,y) for x,y,z in points]) -
纹理映射
-
将 DOM 影像映射到三维网格:
import numpy as np from pyvista import PolyData vertices = np.array(points) mesh = PolyData(vertices, faces=tri.simplices) mesh.texture_map_to_plane(inplace=True) -
模型导出
- 导出为通用 3D 格式(如 OBJ):
mesh.save('output_model.obj', texture='dom.tif')
性能优化技巧
-
数据分块处理:对大范围区域采用分块处理策略
block_size = 1024 for x in range(0, width, block_size): for y in range(0, height, block_size): process_block(x, y, block_size) -
LOD 优化:根据视距动态调整模型细节层级
- GPU 加速:使用 OpenGL 或 CUDA 进行网格计算
常见问题解决方案
- 接缝问题:
- 原因:分块处理导致边缘不匹配
-
解决:保留重叠区域,后期融合
-
纹理扭曲:
- 原因:DOM 与 DSM 未精确对齐
-
解决:使用地面控制点 (GCPs) 重新配准
-
模型空洞:
- 原因:DSM 数据缺失
- 解决:使用邻域插值或手动修复
生产环境最佳实践
- 建立自动化处理流水线
- 实施质量检查流程(自动 + 人工)
- 使用版本控制系统管理数据处理脚本
- 记录完整的元数据信息
完整代码示例
# cass11_3d_modeling.py
import rasterio
import numpy as np
from scipy.spatial import Delaunay
from pyvista import PolyData
def generate_3d_model(dom_path, dsm_path, output_path):
"""
生成三维模型主函数
:param dom_path: DOM 文件路径
:param dsm_path: DSM 文件路径
:param output_path: 输出模型路径
"""
# 1. 数据加载
with rasterio.open(dom_path) as dom, rasterio.open(dsm_path) as dsm:
dom_data = dom.read(1)
dsm_data = dsm.read(1)
# 2. 创建采样点(每 50 像素采一个点)step = 50
coords = [(x, y, dsm_data[y, x])
for x in range(0, dsm.width, step)
for y in range(0, dsm.height, step)]
# 3. 生成三角网
points_2d = [(x, y) for x, y, z in coords]
tri = Delaunay(points_2d)
# 4. 创建三维网格
vertices = np.array(coords)
mesh = PolyData(vertices, faces=tri.simplices)
# 5. 纹理映射
mesh.texture_map_to_plane(inplace=True)
# 6. 导出模型
mesh.save(output_path, texture=dom_path)
if __name__ == '__main__':
generate_3d_model('dom.tif', 'dsm.tif', 'model.obj')
后续改进方向
- 尝试结合深度学习进行建筑物自动提取
- 研究实时 LOD 切换算法
- 探索 WebGL 在线可视化方案
通过本指南,你应该已经掌握了使用 Cass11 处理 DOM 和 DSM 数据生成三维模型的基本流程。建议从小的测试区域开始实践,逐步扩展到更大范围的建模任务。在实际项目中,记得做好数据备份和处理日志记录,这将大大提升工作效率和问题追溯能力。
正文完
