这张照片在哪拍的?AI 查到 2 米误差|开源技能 geo-sleuth
配套媒体
本页对应的 PPT 与演示视频
下载没反应?点这里复制直链
侧边栏预览窗口(Electron webview)会拦截下载,把下面的链接复制到 Chrome / Edge 地址栏打开即可保存。
../../geo-sleuth-recommend.pptx../../geo-sleuth-recommend.mp4本文目录
这张照片在哪拍的?AI 查到 2 米误差|开源技能 geo-sleuth
朋友发来一张照片:田野边一个白色砖窑,背后一列高铁桥,远处一座山。没有路牌,没有车牌,没有文字,EXIF 也被剥了。他问:这在哪?
传统 OSINT 的答案是"猜"。而 GitHub 上一个叫 geo-sleuth 的 Agent Skill 把这件事做成了可复现的推演:从 27,335 段候选缩到 1 个点,误差半径 ±2 米。
它不是"让大模型看图说话",而是20 个专用脚本负责穷举与打分,大模型只在最后几个候选里做判断。今天已 789 星、MIT 开源,装一行命令就能用。
一、先看它到底做到了什么
作者在 README 里放了一张实拍图:照片里只有一座铁路桥、一座山,别的什么都没有。

结论是 ±2 米。整个过程分六步,每一步都有脚本留下的证据文件:

先看它的官方演示动图——从原始照片到相机位置、朝向和卫星证据图:



这就是它最反直觉的一点:照片里明明什么都"读不出来",它照样能找到位置。
二、逆推过程拆解:27335 → 171 → 22 → 1
作者把每一步的候选数都写了出来,这个漏斗本身就是最好的技术说明。
第 0 步:读图,把能读的榨干

intake.py 一条命令跑完 Step 0–3:读 EXIF(GPS、拍摄时间、等效焦距、朝向)、整图 OCR + 放大裁剪 OCR、生成反图搜图的拼图版。
对这張图它读到的是:高架桥上的杆子是接触网杆 → 这是电气化铁路;按 32 米跨径估算,左段约 0.5 公里、右段超过 1 公里;3 公里外有陡山;稻子已收割但草还绿 → 华南,但这是下注不是证明。
注意最后半句——作者明确标注这是"猜测"而不是"证据"。这个区分是整个项目的核心设计。
第 1 步:区域扫描,把整片区域的铁路桥全拉出来

terrain.py scan 通过 OpenStreetMap Overpass 拉取区域内所有铁路桥:27,335 段,然后每 400 米采样一个点,用高程数据(Terrarium)算出该点的 360° 地平线轮廓。筛选条件是三合一:附近地面平坦 + 几公里内有明确山峰 + 山旁边地平线是平的。
结果:171 个候选点。
第 2 步:天际线拟合,把 171 缩到 22

在每个候选点周围摆相机位(累计渲染 14,372 个机位),从每个机位渲染出"从那儿看过去山脊线长什么样",和照片里的山脊线比对。
前三名出来之后,作者手工加了一条约束:桥必须在画面左侧很近、右侧很远(这正好对应第 0 步"左段近、右段远"的跨径估算)。
于是:22 个候选。
叠回原图验证时非常打脸:第 1 名(福州)山脊有个包被烤炉挡住了所以得分高;第 3 名(惠州)照片里是平的它却下坡;第 2 名(清远)从山脚到画面边缘全对。
第 3 步:桥墩当尺子,锁定 2 米

这是最漂亮的一步。imgprep.py piers 标出照片里的 17 个桥墩,每一个墩都是相机看到的一个方位角。

geo.py spacing 的逻辑是:这些射线打到铁路线上时,交点必须等间距——因为桥墩本来就是等间距的。
交点先把结果压到一个约 300 米长的带状区域,再和天际线一夹,只剩一个点。
最终:±2 米。

输出不是一句"大概是那儿",而是:坐标 ± 误差半径、相机朝向、卫星证据图、分级置信度。
三、为什么它比"让 AI 看图"靠谱
这个项目最值得学的不是任何单个算法,而是它的举证责任分配。

五、什么场景值得用
- 旧照片考古:翻出十年前的老照片,没有 GPS,没有水印,只有田野和一座山
- 核实网络图片:网图配错地点,越传越离谱
- 旅行与写作:想知道照片里那座桥到底是什么桥
- 安全与合规:照片溯源、防伪核验的基础能力(注意 OSM 数据 ODbL,发布查询结果时要署名 © OpenStreetMap contributors)
局限也要说清楚:官方 Roadmap 里还写着"要建一个公开的盲测集,给出端到端准确率数字"——也就是说,目前没有一个公开的准确率指标;高程与天际线拟合的合成地形运营商级测试也还在 To-do 列表里。所以"±2 米"是官方案例的结果,不是普适保证。
结语
AI 拍照定位这件事一直有点玄学:模型看图、编一个听起来合理的地方给你,你没法验证。
geo-sleuth 的价值在于它把"验证"这件事做成了硬约束——每一个结论都要摊开一个命令和一个文件,能算的绝不用嘴说。这套路子不只是拍照定位用得上,任何让 Agent 下判断的任务都该这么设计。
作者只在这张案例上花了几步就做到 ±2 米,而你现在只需要一条 npx 命令。
开源地址:github.com/Oldcircle/geo-sleuth(MIT,789⭐)