Easy-AIGeo — 照片一键转 DEM · 等高线 · 坡面分析 · 地形报表
什么时候用
- 现场只有一张普通照片,但需要快速拿到相对地形形态(等高线、坡度分级)做前期判断。
- 现场拍了多张重叠照片(或一段小视频截帧)→ 走 SfM 真三维重建(路线 B) 出近似真实 DEM,比单图准得多。
- 已有 DEM(GeoTIFF) / 航拍或无人机正射影像(已带高程或用作 DEM 参考) → 直接出等高线/坡面/报表。
- 有 LiDAR 点云(.las/.laz) → 一键转 DEM 再出全部成果。
关键认知(先用这个校准预期)
单张照片只能得到相对深度,不是真实高程。本工具输出的是"相对地形起伏模型(pseudo-DEM)"): 它保留了地表的凹凸形态与坡向,可生成相对等高线、做坡面分级,但不是绝对高程 DEM。 要变成米制相对地形,必须做尺度标定(见下);要绝对地理坐标需补 GCP 或改用双目/SfM。
依赖
- 向量/栅格核心(必须):
geopandas scikit-image rasterio matplotlib pillow numpy scipy - ML 深度估计(照片→DEM 才需要):
torch transformers- CPU 版即可;默认模型
depth-anything-v2-small首次运行自动下载(约 80MB)。 - 国内网络已内置镜像,无需手动设置
HF_ENDPOINT;若仍需手动可用HF_ENDPOINT=https://hf-mirror.com python scripts/photo_dem.py ...
- CPU 版即可;默认模型
环境(managed venv):
C:\Users\jinxj\.workbuddy\binaries\python\envs\default\Scripts\python.exe
Windows / Git Bash 运行提示:脚本路径用
C:/Users/...盘符形式,或先cd到 skill 目录再写相对路径scripts/photo_dem.py,否则/c/...会被转成c:\c\...而找不到文件。 图例中文会自动调用系统 CJK 字体(如 msyh.ttc),无需额外配置。
运行前必问(交互问答流程)
触发本 skill 时,先问 Q0 数据源类型,再按分支问后续问题,最后组装命令。 产出的成果才有可追溯的元信息,便于写进成果交付材料。
Q0(必须最先问)你给的是什么数据源?
直接问用户,并据此路由到不同处理分支:
| 用户回答 | --source | 走哪条处理链 | 精度/说明 |
|---|---|---|---|
| 现场照片(一张) | photo | 单目深度 → 相对地形(pseudo-DEM) | 相对形态,非真实高程 |
| 现场照片(多张重叠)/ 小视频截帧 | photo(自动识别多张) | SfM(COLMAP) 真三维重建 → DEM(路线 B) | 近似真实、可量测,最推荐 |
| 航拍图 / 无人机正射影像 | aerial(单张会警示) 或 dem(若已带高程) | 单张→相对地形+强警示;多张→SfM | 单张航拍别用伪DEM,改用真DEM/LiDAR/SfM |
| 已有 DEM(GeoTIFF) | dem | 直接出等高线/坡面/报表 | 真高程,最稳 |
| LiDAR 点云(.las/.laz) | lidar | 点云 → 网格化 DEM → 全部成果 | 真高程,最准 |
- 不要替用户猜:明确问"你手上是照片、航拍图、DEM 文件、还是 LiDAR 点云?"再决定命令。
- 多张照片/航拍图会自动走 SfM;若用户只有单张且要更准,提示"再多拍几张重叠角度照片可走 SfM 真三维重建"。
- SfM 需要本机装 COLMAP(未装会给出安装指引并中断,不静默失败)。
Q1(照片/SfM/LiDAR 分支问)尺度标定
- 单图 pseudo-DEM、SfM、LiDAR 都需要真实尺度才能把"相对起伏"变成"米":
- 问:照片/场景横向、纵向覆盖多少米?最大高差多少米?(
--width_m --height_m --depth_range_m) - 有参照物(人、车、房)就估;没有就让作者给经验值。LiDAR 若已带坐标单位可省略。
- 问:照片/场景横向、纵向覆盖多少米?最大高差多少米?(
Q2 设备 / 平台 + 坐标来源(DEM/SfM/LiDAR 出图需要经纬度时问)
- 问:坐标怎么来?
- 手机 → 启用设备 GIS 获取 GPS:
--device mobile --location_source gps --lat <gps_lat> --lon <gps_lon> - 电脑 → AI 估位置(
--location_source ai)或作者手填(--location_source manual)。
Q3 hillshade 光照时间
- 问:地形阴影用拍摄现场时间自动算太阳角,还是手动指定?
- 现场时间 →
--time 14:30 --date 2026-09-08 --tz 8 --lat <lat> --lon <lon> - 手动/不知道 → 默认方位 315°/高度 45°,或
--azimuth 300 --altitude 35
Q4 始终生成统计报告
- 不论哪种用法,
all命令都会自动产出analysis_report.json(含source_type、坐标来源、模型/方法名、光照参数、各级坡度面积占比、视角识别结果)。这是标准交付件,不要省略。
三个"一键"命令
0) 数据源路由总览(v1.6 核心)
all 子命令通过 --source(或按扩展名/张数自动推断)把任意输入路由到正确处理链:
| 输入 | 命令要点 | 处理链 |
|---|---|---|
| 单张现场照片 | all --input a.jpg | 单目深度 → 相对地形 |
| 多张重叠照片 / 视频截帧 | all --input a.jpg b.jpg c.jpg | SfM(COLMAP) → DEM(路线 B) |
| 航拍图(单张) | all --input air.jpg --source aerial | 相对地形 + 强警示(建议改真DEM/SfM) |
| 已有 DEM (.tif) | all --input dem.tif --source dem | 直接出全部成果 |
| LiDAR (.las/.laz) | all --input pc.las --source lidar | 点云 → 网格 DEM → 全部成果 |
--source 可省略(auto):.tif/.dem→dem,.las/.laz→lidar,多张图→photo(SfM),单张图→photo(单目深度)。
1) 一步出全部(按数据源类型自动路由:DEM + 等高线 + 坡面 + 图 + 报告)
python scripts/photo_dem.py all \
--input 现场照片.jpg \
--width_m 200 --height_m 150 --depth_range_m 40 \
--interval 5 --outdir ./out \
--model v2-small --smooth_depth 3 --enhance 0.3 --gamma 0.85 \
--enhance_slope \
--slope_style warm --show_labels \
--device mobile --location_source gps --lat 29.56 --lon 106.55 \
--time 14:30 --date 2026-09-08
--width_m/--height_m:照片横向/纵向覆盖的真实世界尺寸(米),用参照物或经验估计。--depth_range_m:场景内最大高差(米)。--interval:等高距(米)。--model:深度模型。默认v2-small(推荐,精度与速度均衡);可选v2-base/v2-large/small/base/large/midas。V2 对弱纹理/大尺度坡面的边缘保持明显优于 V1。--smooth_depth:深度图奇数核中值滤波(如 3/5),去噪。--enhance:0–1 对比拉伸,放大地形起伏。--gamma:<1 拉高低谷、放大相对起伏(如 0.8–0.9)。--enhance_slope:增强坡度显示(可选)总开关。开启后按推荐组合启用保边滤波 + 大尺度低频起伏增强 +(默认不启用)高频细节增强,专门改善"左半边弱纹理大坡面被压平"的问题。默认关闭。--guided:保边引导滤波半径(默认 0),抑制防尘网/植被纹理噪声、保留坡度边缘。单独使用需手动指定 >0 才生效。--relief:大尺度低频起伏增强强度(默认 0,范围 0–1),恢复被压平的大坡面(如左侧绿色防尘网坡面)。--detail:高频细节增强强度(默认 0,范围 0–0.5),锐化边缘/小尺度纹理;过大易产生碎等高线,建议谨慎使用。--slope_style:坡面配色,见下。--show_labels:等高线图上标注高程。- 不加
--input时加--synthetic可用合成 DEM 跑通整条流水线(无需 ML)。
增强坡度显示(可选)用法示例:
# 一键开启推荐组合(低频 relief 为主,避免碎线)
python scripts/photo_dem.py all --input 照片.jpg --enhance_slope ...
# 手动微调(例如只开大尺度低频增强)
python scripts/photo_dem.py all --input 照片.jpg --relief 0.6 ...
# 需要更锐利的边缘时再叠加 detail
python scripts/photo_dem.py all --input 照片.jpg --enhance_slope --detail 0.1 ...
2) 一键等高线(对已有 DEM)
python scripts/photo_dem.py contour --dem dem.tif --interval 5 --out contours
输出 contours.gpkg(图层名 Contour lines,GeoPandas LineString):
字段 contour_id(序号) / level_m(米制高程) / name(如 "15.0 m")。
3) 一键坡面分析(对已有 DEM)
python scripts/photo_dem.py slope --dem dem.tif --out slope_zones --report slope_report.json
输出 slope_zones.gpkg(分级面:平缓/较缓/较陡/陡/极陡)+ slope_report.json(各级面积占比、平均/最大坡度)。
4) 生成 ArcGIS Pro 风格综合地形报表(对已有 DEM / 推荐)
python scripts/photo_dem.py report \
--dem dem.tif \
--outdir ./terrain_report \
--interval 50 --base 300 \
--title "华山地形分析报表 (SRTM 90m)" \
--slope_style terrain \
--time 14:30 --date 2026-09-09 --lat 34.45 --lon 110.05
输出:
terrain_report.json:机器可读统计terrain_report.md:Markdown 报表terrain_report_layout.pdf:综合地形分析布局(含标题栏、图例条、4 图联排、指北针、比例尺、统计表)contours.gpkg/slope_zones.gpkg/aspect_zones.gpkg:等高线、坡度面、坡向面矢量
路线 B:多图 SfM 真三维重建(严谨路线)
适用:现场拍了 ≥2 张重叠照片、或一段小视频截帧。比单图 pseudo-DEM 准得多,产出近似真实、可量测的 DEM。
python scripts/photo_dem.py all \
--input 照片1.jpg 照片2.jpg 照片3.jpg \
--source photo \
--width_m 200 --height_m 150 --depth_range_m 40 \
--outdir ./sfm_out \
--time 14:30 --date 2026-09-08 --lat 29.56 --lon 106.55
- 工具自动调用 COLMAP 跑
automatic_reconstructor(SfM + 稠密重建)→ 读fused.ply点云 → 网格化为 DEM。 - 需本机预装 COLMAP:https://colmap.github.io/ (Windows 安装版把 bin 加入 PATH;或用
--colmap指定 exe 路径)。未安装会明确报错并给安装指引,不会静默失败。 - 尺度:SfM 坐标是任意尺度,必须用
--width_m/--height_m/--depth_range_m把起伏标定成米;要真实地理坐标需另加 GCP 配准。 - 这是最可信的路线:多图 → 真 DEM → 我们的 report 子命令出全部成果。
LiDAR 点云 → DEM
适用:手上有无人机/地面 LiDAR 的 .las / .laz 点云。
python scripts/photo_dem.py all --input 点云.las --source lidar --outdir ./lidar_out
- 点云 →
griddata线性插值网格(空缺用最近邻补)成高程 DEM,再走与 DEM 完全相同的等高线/坡面/报表流程。 - 保留点云原生坐标与单位(已是真实高程,最准);不需
--width_m/--height_m标定。 .laz需lazrs后端(已列入 requirements,已安装)。
与 ArcGIS Pro 功能的映射("直接参考 ArcGIS Pro")
| Easy-AIGeo 输出 | 对位 ArcGIS Pro 工具/功能 | 说明 |
|---|---|---|
| elevation 字段(min/max/mean/std/median/range)| Summary Statistics / Get Raster Properties | 高程基本统计 |
| slope(度数)| 3D Analyst → Surface → Slope | 梯度法坡度,按 5 级重分类 |
| aspect(8 方向 + Flat)| 3D Analyst → Surface → Aspect | 坡向玫瑰图/分级统计 |
| curvature(profile/plan)| 3D Analyst → Surface Parameters | 剖面曲率 / 平面曲率 |
| surface_area / volume_above_ref | 3D Analyst → Surface Volume | 表面积 vs 平面面积 + 参考平面上方体积 |
| contours.gpkg | 3D Analyst → Surface → Contour | 米制等高线,含 level_m/name 字段 |
| terrain_report_layout.pdf | ArcGIS Pro Layout / Generate Report | 地图框 + 标题 + 图例 + 统计表 |
坡面分级配色(多套,任选)
--slope_style 可选:
warm:YlOrRd 暖色(默认,红=陡)terrain:terrain 地形色(棕绿蓝)viridis:viridis 紫-绿-黄rdylgn:RdYlGn 红-黄-绿spectral:Spectral 光谱色ylgnbu:YlGnBu 黄-绿-蓝
输出物
dem.tif:相对地形起伏模型(GeoTIFF;有经纬度时自动用对应 UTM 带 CRS)contours.gpkg:等高线矢量(Contour lines 图层,含高程字段)slope_zones.gpkg:坡面分级面矢量aspect_zones.gpkg:坡向分级面矢量(report / all 生成)analysis_report.json:统一统计报告(等高线数+各级坡度+光照+坐标来源+模型+视角识别结果+增强坡度显示参数)slope_report.json:坡面专项统计overview.png:地形阴影 + 等高线 + 坡面分级三连图(直接贴汇报 PPT / 文档)terrain_report.json/terrain_report.md/terrain_report_layout.pdf:综合地形报表(含高程/坡度/坡向/曲率/表面积/体积/制图布局)
视角限制(很关键,避免误用)
- 本工具的深度模型按地面视角照片训练。不要直接对单张航拍/卫星正射图跑"照片→DEM":模型会把俯视图误判为近平面,输出平均坡度极低、与真实山地严重不符。
- 实测对比(大理团山公园同一区域):航拍图单照片深度 → 平均坡度仅 ~3.2°;而 SRTM 真实 DEM 为 ~10.6°。差异即失真量。
- 正确用法:
- 地面拍摄的现场照片(站在坡上拍山坡、沟谷)适合单照片深度估计。
- 航拍/卫星/无人机影像 → 改用真实高程数据(SRTM 90m / ASTER / 无人机 LiDAR 点云转 DEM),用
contour/slope/report子命令直接出矢量成果。 - 航拍/现场有多张重叠影像 → 走 SfM 真三维重建(路线 B),这是最准、最可信的路线。
- 这不是工具 bug,是单目深度的物理局限;成果说明应如实写清适用范围(单图相对地形 vs SfM/真 DEM)。
弱纹理大坡面识别(如左侧绿色防尘网边坡)
单目深度模型对大面积弱纹理坡面(绿色防尘网、均质土坡、混凝土面)容易"压平"——模型从像素中读不出足够梯度,就把坡面判成近平面。表现为坡度图上一大片蓝色(平缓)。
缓解办法:
- 换更好的模型:默认已升级为
v2-small,对这类场景的保持力比 V1 强。 - 开启"增强坡度显示":
--enhance_slope(推荐)或手动--relief 0.6,用大尺度低频起伏增强把被抹平的大坡面拉回来。 - 换角度/换照片:让坡面占画面主体、有清晰纹理或参照物,模型更容易估计出坡度。
- 最终兜底:对精度要求高的正式判断,改用无人机摄影测量或 LiDAR 真实 DEM。
局限与免责
- 单照片结果仅为相对形态,不能当绝对高程使用;涉及正式 design 应以专业勘察为准。
- 深度估计受光照、纹理、遮挡影响;陡崖/植被覆盖区误差大。
--enhance/--gamma/--enhance_slope/--relief/--detail会改变相对起伏比例,仅用于可视化/形态增强,写材料时应注明"经相对起伏增强"。- 自动视角识别为启发式规则,非 100% 准确;判为 uncertain 时请人工复核。
使用说明(详细)
- 零 GIS 基础用户先看:同目录 Easy-AIGeo_新手指南.md(含可直接复制粘贴的提示词模板、可定制清单、避坑说明)。
- 完整参数表 / 问答示例 / 输出字段 / 典型工作流:见同目录 USAGE.md。
Scan to join WeChat group