
一个 agent skill,用于找出照片的拍摄地点——OpenStreetMap 几何数据、海拔天际线、卫星影像和街景——并展示其推理过程。适用于 Claude Code、Codex、Cursor、Gemini CLI、OpenCode 和 GitHub Copilot。
一个 agent skill,能找到照片的拍摄地点——并展示它的推理过程。
适用于
……以及其他任何能读取 SKILL.md 并运行 shell 命令的 agent。
没有文字,没有车牌,没有地标。一座桥,一座山。定位误差在 2 米以内。
npx skills add Oldcircle/geo-sleuth
按提示勾选你用的 agent。然后把一张照片交给你的 agent,说:
找出这张照片是在哪拍的
这就是全部的交互方式。你的 agent 会读取 SKILL.md、运行脚本,然后给出机位、镜头朝向和一张卫星证据图。想自己复制文件夹?见安装。
SKILL.md 加上普通的 Python 脚本——所以同一个文件夹在 Claude Code、Codex、Cursor、Gemini CLI、OpenCode 和 GitHub Copilot 里都能运行。这几张照片都没有 GPS 信息。每个案例写了 skill 从照片里读到什么、怎么一步步缩小范围、结果离确认的机位有多远。
![]() |
![]() |
![]() |
| 1 · 稻田与高架 铁路桥 × 天际线 × 数桥墩。 |
2 · 沙漠天际线 高压线 × 天际线 × 手机歪了 1°。 |
3 · 樱花街 行道树开放数据 × 影子 × 街景。 |
| ±2 m 广东清远 |
100 m 以内 青海大柴旦 |
3 m 加拿大温哥华 |
一张手机照片,EXIF 信息已被抹除:收割完的稻田边一个白色烤炉,远处一条长长的高架,右边一座陡峭的山。画面里没有一个字。给装了这个 skill 的 agent 发一条消息,它就给出了机位和镜头朝向。
照片 → 27,335 → 171 → 14,372 → 22 → 3 → 1 → ±2 m
| 步骤 | 它做了什么 | 剩余候选 |
|---|---|---|
| 读图 | 高架上的杆子是接触网支柱,说明是电气化铁路。把桥墩间距当尺子用(跨距 32 米,假设):左段距拍摄点约 0.5 公里,右段超过 1 公里。陡峭的山约 3 公里外。稻子已经收割,但草还是绿的,说明还没下霜。 | 华南,是判断,不是证明 |
| 区域扫描 | 从 OpenStreetMap 取出该区域内所有铁路桥:27,335 段。每 400 米采样一个点,用高程数据计算每个点 360° 的地平线。保留附近地势平坦、几公里内有明显山峰、且旁边地平线平坦的点。 | 171 处 |
| 天际线拟合 | 在每个候选点周围布置候选机位,渲染每个机位看到的山脊线:14,372 个机位。前 20 名彼此相差不到 0.1°,于是加了一条约束:桥必须左近右远。 | 22 |
| 叠图检查 | 把前三名的山脊线画回照片核对。第一名(福州)有一处凸起正好藏在烤炉后面,所以得分高;第三名(惠州)在照片平坦的地方却有坡度;第二名(清远)从山脚到画面边缘都贴合。 | 1 |
| 数桥墩 | 照片里的 17 根桥墩变成从机位出发的 17 条方位线。它们打在铁路线上的交点必须间距均匀。结合天际线结果:先收窄到约 300 米长的一段,再收窄到一个点。 | ±2 m |




前景是一道沙丘,后面一排深色裸山,山脚有几座电塔。画面里没有字、路和房子,以图搜图只搜到一些泛泛的西北沙漠照片。

照片 → 1,537 处 → 卡在 10 px 上下 → 解出 1° 歪斜 → 1 处 → 一道沙脊