← Back to skills
extension
Category: Data & AnalyticsNo API key required

Easy-AiGeo

单照片/多图SfM/航拍图/真实DEM/LiDAR点云 一键生成地形分析,输出等高线、坡面分级、坡向、曲率、表面积/体积与综合地形报表,成果为 GeoPandas 矢量。面向山地城市生态工程/勘察前期的低成本快速地形评估。支持 Depth-Anything V2(单图相对地形)、COLMAP SfM(多图真三维重建·路线B)、LiDAR点云转DEM、自动视角识别与地形报表生成。

personAuthor: user_fc23bfdahubcommunity

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 ...

环境(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)。

弱纹理大坡面识别(如左侧绿色防尘网边坡)

单目深度模型对大面积弱纹理坡面(绿色防尘网、均质土坡、混凝土面)容易"压平"——模型从像素中读不出足够梯度,就把坡面判成近平面。表现为坡度图上一大片蓝色(平缓)。

缓解办法:

  1. 换更好的模型:默认已升级为 v2-small,对这类场景的保持力比 V1 强。
  2. 开启"增强坡度显示":--enhance_slope(推荐)或手动 --relief 0.6,用大尺度低频起伏增强把被抹平的大坡面拉回来。
  3. 换角度/换照片:让坡面占画面主体、有清晰纹理或参照物,模型更容易估计出坡度。
  4. 最终兜底:对精度要求高的正式判断,改用无人机摄影测量或 LiDAR 真实 DEM。

局限与免责

  • 单照片结果仅为相对形态,不能当绝对高程使用;涉及正式 design 应以专业勘察为准。
  • 深度估计受光照、纹理、遮挡影响;陡崖/植被覆盖区误差大。
  • --enhance/--gamma/--enhance_slope/--relief/--detail 会改变相对起伏比例,仅用于可视化/形态增强,写材料时应注明"经相对起伏增强"。
  • 自动视角识别为启发式规则,非 100% 准确;判为 uncertain 时请人工复核。

使用说明(详细)

  • 零 GIS 基础用户先看:同目录 Easy-AIGeo_新手指南.md(含可直接复制粘贴的提示词模板、可定制清单、避坑说明)。
  • 完整参数表 / 问答示例 / 输出字段 / 典型工作流:见同目录 USAGE.md。