UVE · 开源工具
Guide · 实景三维数据链路

从三维模型到建筑图斑:实景三维数据链路完整流程

倾斜摄影模型 → 正射影像 → 建筑物轮廓 → 入库。这条路看起来是三个工具串联, 实际上每一段都有自己的坑,而且大部分坑不会报错,只会在最后的成果里以"位置偏了""边缘不对""图斑没法用" 的形式暴露出来。下面按生产顺序拆开讲。

链路总览

典型的四段,本文覆盖前三段(第四段是人工质检,无法自动化):

倾斜摄影模型 / 3D Tiles
        │  ① 换成 OBJ(Cesium ion 导出、Metashape、其他转换工具)
        ▼
   OBJ + metadata.xml
        │  ② ObjOrthoRender:分块渲染 + 写地理参考
        ▼
   带坐标系的 GeoTIFF(DOM)
        │  ③ Footprint-Creater:分割 + 校验 + 规则化
        ▼
   buildings.shp(可入库)
        │  ④ 人工质检:套合、拓扑、属性
如果你的模型已经够准、影像也是自己的传感器,第 ③ 步用现成权重就够了。 只有当现成模型的精度在你的影像上明显不够时,才需要插入"训练自己的模型"这一段。

环节一:三维模型 → 正射影像

制图、变化检测、建筑物提取都需要二维影像,但模型是三维的。 这一步的本质是沿 Z 轴正交投影,同时把模型局部坐标换算回真实地理坐标。

# 先用自带样例确认环境正常(约 60 秒)
python render_orthophotos.py --input examples/sample --output out --gsd 0.5

# 处理自己的模型
python render_orthophotos.py \
  --input  /path/to/obj_tiles \
  --output /path/to/dom \
  --gsd 0.05 \
  --workers 4 \
  --merge-mode all

三个关键点

环节二:正射影像 → 建筑物图斑

这一步最容易被低估。直接拿语义分割掩码转矢量,得到的是锯齿边、粘连块和碎屑, 导入 GIS 之后几乎不可用。真正耗时间的是"掩码 → 可入库图斑"之间那段处理。

python web_app.py    # 打开 http://localhost:5000 上传影像

# 或者按下面的参数在界面里配
BLOCK_SIZE       1024     # 分块推理尺寸,按显存调
BLOCK_OVERLAP     512     # 建议保持 50%
MIN_AREA_M2     100.0     # 最小建筑面积
BUFFER_EXPAND_M   0.6     # 平滑膨胀,米
BUFFER_SHRINK_M   0.3     # 平滑腐蚀,通常取膨胀的一半
SIMPLIFY_TOL      0.3     # Douglas-Peucker 公差,米
RECT_IOU_THRESH  0.90     # 与最小外接矩形重合度超过此值则矩形化

三个关键点

可选环节:现成模型不够准就自己训

什么情况下该训:高密度城区建筑粘连、屋顶材质差异大导致漏检、 阴影方向不同导致边界系统性偏移。判断标准很简单——看错误是否有规律。 随机误差靠加数据,系统性偏差只能靠换模型。

cp prepare/DATA.example.TXT prepare/DATA.TXT   # 填入影像与矢量路径
python prepare/prepare_dataset_multiprocess.py  # 滑窗切片
python train.py                                 # HRNet-W48 + FCNHead
python predict.py --input mosaic.tif \
  --checkpoint work_dirs/hrnet_w48_footprint/iter_40000.pth
标签质量决定上限。矢量与影像套合不准时,模型学到的是系统性边界偏移, 加再多数据也救不回来。训之前务必抽几处叠加核对。

环节三:结果能不能入库,怎么判断

交付前至少查这四件事,都能在 QGIS 里几分钟完成:

检查项怎么查不合格的表现
坐标系图层属性看 CRS显示未知或与底图错位
套合精度叠到原影像,抽 10 处看边整体平移或旋转 → 回查 GSD 与 SRSOrigin
几何有效性拓扑检查器跑自相交有自相交面 → 简化公差可能过大
面积分布统计字段直方图出现大量 < 20 m² 图斑 → 最小面积阈值偏低

常见问题速查

正射影像整体偏移了几百米?

九成是 metadata.xml 的 SRSOrigin 与出模时不一致。其次是 SRS 写成了 EPSG:4326 而实际是 3857。

输出一片全黑?

OpenGL 没起来。Docker 下确认 DISPLAY=:99 与 Xvfb;本机跑先执行 glxinfo | grep OpenGL 看有没有 3.3+。

提取结果边缘锯齿严重?

说明跳过了规则化,或者 SIMPLIFY_TOL 设得过小。默认 0.3 m 是配合 0.05–0.1 m GSD 的经验值。

大范围生产时合并阶段内存爆掉?

改用 --merge-mode subfolder,或用 --subdir 按区块分批处理。all 模式会把全部影像并成一张巨型 TIFF。

能直接处理 3D Tiles 吗?

不能,链路第一段需要先把 3D Tiles 转成 OBJ(Cesium ion 导出或第三方转换工具)。本工具从 OBJ 开始。

相关项目