夜雨聆风学习资料网

ARTICLE · 1202890

仅凭一张照片就能定位到2米!这个开源AI工具让你化身“地理侦探”

仅凭一张照片就能定位到2米!这个开源AI工具让你化身“地理侦探”

无需GPS、无需文字、无需地标——geo-sleuth如何用几何与数据破解照片拍摄地之谜

你有没有过这样的经历——刷到一张绝美的风景照,被画面里的山水打动,却完全不知道这是哪里?或者手里有一张没有GPS信息的老照片,想找到它拍摄的确切位置?

过去,这需要经验丰富的地理专家逐帧分析、层层推理。而现在,一个名为 geo-sleuth 的开源项目让AI仅凭一张照片,就能把拍摄地点定位到2米以内。这个在GitHub上斩获2.4k Star的项目,正在重新定义“照片地理定位”这件事。

一、geo-sleuth是什么?

geo-sleuth 是一个AI代理技能(Agent Skill),专门用来找出一张照片是在哪里拍的。它的全称是“地理侦探”——正如其名,它像侦探一样从照片的蛛丝马迹中抽丝剥茧,最终锁定拍摄位置。

与常见的“以图搜图”不同,geo-sleuth 的厉害之处在于:它不需要照片里有文字、车牌或知名地标。只要画面里有一座桥、一座山、一片沙丘、一排电线杆,它就能通过OpenStreetMap地理几何数据、高程天际线匹配、卫星影像和街景视图,层层缩小搜索范围,最终给出相机的精确位置、朝向角度和误差半径。

它支持 Claude Code、Codex、Cursor、Gemini CLI、OpenCode 和 GitHub Copilot 等六大主流AI编程代理。只要你的AI工具能读取SKILL.md并运行Shell命令,就能装上这个技能开始“破案”。

三大实战案例一览

稻田与高架桥

沙漠天际线

温哥华樱花街

±2米 · 广东清远

100米内 · 青海大柴旦

3米 · 加拿大温哥华

表1:geo-sleuth三大实战案例成果概览

二、七大核心亮点:为什么这个项目这么火?

1. 一张照片,一句话:给你的AI助手一张照片,说一句“find where this photo was taken”,它就会返回相机位置、朝向角度和一张卫星证据图。交互极简,背后却是复杂的地理推理。

2. 无字无牌也能查:没有路牌、没有车牌、没有知名地标——OpenStreetMap几何数据、高程数据、卫星瓦片和街景视图独立支撑搜索。这意味着即使是一张“纯粹的风景照”,也能被定位。

3. 用几何代替猜测:桥墩间距变成距离标尺,阴影变成方位角,山脊线变成可以与高程数据匹配的“指纹”。geo-sleuth不靠猜,而是用几何计算说话。

4. 每个结论都有证据:任何一个结论都必须指向本次会话中实际运行的命令和它生成的文件。人口数量和知名度不是证据——可复现的计算结果才是。

5. 脚本排序,模型判断:二十多个专用脚本负责搜索、打分和排序;AI模型只在排名前几的候选中做最终判断。分工明确,效率与准确率兼得。

6. 一个技能,通吃所有代理:标准的Agent Skill格式——一个文件夹包含SKILL.md、scripts、references和data——同一份代码可以在Claude Code、Codex、Cursor、Gemini CLI、OpenCode和GitHub Copilot中运行。

7. 答案自带误差半径:返回的不只是坐标,还有误差半径、相机朝向、证据图和分级置信度。让你知道这个结果有多靠谱,而不是给你一个“看起来很确定”的数字。

三、快速上手:三步开始你的“地理侦探”之旅

第一步:安装技能

geo-sleuth 是一个标准的Agent Skill,安装非常简单。打开终端,运行以下命令即可一键安装到所有支持的AI代理:

npx skills add Oldcircle/geo-sleuth -g -a claude-code -a codex -a cursor -a gemini-cli -a opencode -a github-copilot -y

如果你更喜欢手动安装,也可以用git clone把仓库克隆到本地,然后把skills/geo-sleuth文件夹复制到对应代理的skills目录下。

第二步:运行环境检查

首次使用前,建议让AI代理运行一下 doctor.py 脚本,检查环境是否就绪。这个脚本会测试Python、uv、curl、内置查找表、可写工作目录以及浏览器启动是否正常。

uv run skills/geo-sleuth/scripts/doctor.py

如果需要检查网络服务连通性,可以加上 --network 参数。发现问题及时修复,后续使用才不会卡壳。

第三步:给AI一张照片,说出那句话

这就是全部的使用界面了。把一张照片交给你的AI代理,然后说:

“find where this photo was taken”

然后就等着吧。AI会读取SKILL.md,自动运行各个脚本,最后返回相机位置、朝向角度和一张卫星证据图。整个过程可能需要几十分钟——毕竟,它要在成千上万的候选地点中层层筛选。

四、三大实战案例:看AI如何“破案”

以下三个案例中的照片都没有GPS数据。每个案例都详细记录了geo-sleuth从照片中读取了什么线索、如何缩小搜索范围,以及最终结果与真实相机位置的误差。

案例一:稻田边的高架桥,定位精度±2米

一张被剥离了EXIF信息的手机照片:收割后的稻田边有一个白色灶台,远处是一座长长的高架桥,右边是一座陡峭的山。整张照片里没有一个汉字。就这么一张看似普通的风景照,geo-sleuth把它定位到了广东清远,误差只有±2米。

整个推理过程堪称精彩:

推理步骤

具体做了什么

剩余候选数

读取照片

高架桥上的杆子是接触网支柱,说明这是电气化铁路。桥墩间距当作标尺(按32米跨度估算):左侧段约0.5公里远,右侧超过1公里。右侧约3公里处有一座陡峭山峰。

华南地区(推测)

区域扫描

从OpenStreetMap拉取整个区域内所有铁路桥:27,335段。每400米采样一个点,用高程数据计算360度地平线。保留附近平坦、几公里内有清晰山峰的点。

171个地点

天际线匹配

在每个地点周围放置候选相机位置,渲染从各位置看到的山脊线:共14,372个位置。前20名彼此相差不到0.1度,于是增加约束:桥必须是左近右远。

22个

叠加检验

把前三名的山脊线画回照片上对比。第1名(福州)的凸起被灶台挡住了才得分高;第3名(惠州)在照片平坦处出现坡度;第2名(清远)从山脚到画框边缘完美贴合。

1个

桥墩计数

照片中的17个桥墩变成17个方位角。它们与铁路线的交点必须均匀分布。结合天际线匹配,先圈出约300米的范围,再锁定到一个点。

±2米

表2:案例一推理过程——从27,335段铁路桥到最终±2米精度

图1:17个桥墩被标记在高架桥上——间距宽窄变成距离标尺

图2:前三名候选地点的山脊线叠加对比(福州、清远、惠州)

图3:geo-sleuth生成的证据图——相机位置、视野范围、铁路与山峰

整个推理过程耗时约72分钟,其中一半时间在等待计算。但结果是惊人的:一张没有任何文字信息的稻田照片,被精准定位到了2米以内。

案例二:沙漠里的一道地平线,修正1度倾斜后锁定位置

前景是一座沙丘,背后是一排光秃秃的深色山脉,山脚下有几根电线杆。画面里没有文字、没有道路、没有建筑,反向图片搜索只返回了大西北的通用沙漠照片。

这个案例最精彩的地方在于“发现问题并解决问题”的过程:

推理步骤

具体做了什么

剩余候选数

读取照片

电线杆是唯一的人造物体,说明相机在输电线路几公里范围内。砂石和裸岩指向中国西北地区。

4个省

电力线×地形

拉取新疆、甘肃、宁夏、青海所有电力线,沿线用高程数据扫描,保留山脉填满视野的地点。

1,537个地点

天际线匹配

提取照片中的山脊线,与每个地点看到的山脊对比。青海前25名得分都在9.6-11.7像素之间,真实地点排第9。

卡住了

发现倾斜

手机端平差1度,2048像素画面边缘的山脊会偏移约18像素——正好是候选之间的差距大小。真实地点的误差在画面上呈一条斜线,斜率就是倾斜角。

重新匹配

把倾斜角一起求解后,真实地点的误差从11.1像素降到6.2像素,而第二名是9.4像素。

1个地点

卫星验证

视线1公里内有三座新月形沙丘和一个帐篷营地。750/330/110千伏电力线 bundle 在东边1-2公里处,这就是为什么电线杆只出现在照片左侧。

一座沙丘

表3:案例二推理过程——从1,537个候选到锁定一座沙丘

图4:原始照片——沙丘山脊、深色山脉和山脚下的电线杆

图5:电力线扫描图——金色为OSM电力线,橙色为候选地点,红星为相机位置

图6:修正1度倾斜前后对比——上图误差呈斜线,下图修正后趋势消失

图7:沙漠案例证据图——相机站在沙丘脊线上,面向205度

更厉害的是盲测重跑:后来给一个全新的AI代理这张照片,只提示一句“在中国”,它扫描了青海5,334条电力线,拟合了792个地点,最终定位在距离真实相机位置87米处,耗时32分钟。

案例三:温哥华街头的樱花树,3米精度锁定街区

人行道上方一棵盛开的樱花树。从车牌和街道设施可以判断是在温哥华,但这座城市有近一万个街区,要找到具体是哪条街,才是真正的挑战。

这个案例展示了geo-sleuth如何利用开放数据解决问题:

推理步骤

具体做了什么

剩余候选数

读取照片

蓝白色BC省车牌、草植分隔带上的深绿色路灯、温哥华特色住宅。

温哥华

街道树木数据

温哥华公开了每棵行道树的物种、胸径和地址。筛选胸径≥40厘米的开花樱桃树,再要求一个街区至少有3棵。

1,095棵树,97个街区

阴影与坡度

车影向左且朝向相机,说明太阳在右前方。相机一侧的院子高于人行道,说明那侧是上坡。测量72个街区的横坡,检查大树在哪一侧。

几个街区

逐棵比对

W 60th Ave 100号街区北侧种满了大樱桃树。南侧前方30-60米是7.6厘米的树苗,下一棵大树在约75米外。照片显示的正是:近右方没有高树,远处有粉色树冠。

1个街区

街景验证

2009年和2024年的街景都能看到石墙台阶、绿色路灯和白色房子。带屋顶露台的房子在2024年街景和照片中都有。相机在北侧人行道,朝东拍摄。

3米

表4:案例三推理过程——从温哥华全市到3米精度锁定

图8:温哥华全市行道树分布图——184,517棵树、1,095棵大樱桃、97个候选街区

图9:照片与2024年、2009年街景画面对比

图10:樱花案例证据图——粉色圈为数据中的大樱桃树,绿色圈为树苗

这个案例同样是盲测:全新AI代理拿到照片后没有任何提示,53分钟后定位在距离真实相机位置3米处。

五、技术原理:三层架构,脚本干活AI做判断

geo-sleuth 的设计哲学非常清晰:脚本负责决定、感知和排序,AI模型只在顶尖候选中做最终判断。整个系统分为三层:

第一层是决策层。由 board.py 负责——管理候选板、线索、似然比、排除条件、排名和下一步扫描方向。哪个候选可以排除、什么证据有效、接下来扫哪里,都由脚本规则来决定,而不是靠AI“拍脑袋”。

第二层是感知层。这一层有二十多个专用脚本各司其职:OCR识别文字、反向图片搜索、卫星瓦片CLIP零样本打分、街景DINOv2+SIFT匹配、高程天际线计算等等。脚本先搜索、打分、排序,把前几名交给上层。

第三层是判断层。由AI模型负责——从画面中提取线索、提出假设、在排名靠前的几个候选中做最终选择。AI不做穷举,只做判断。

最重要的原则是:每个结论都必须指向本次会话中实际运行过的命令和它生成的文件。排除需要有读取或计算证据;观察和猜测只能降低候选权重,不能直接排除。这保证了整个推理过程是可追溯、可复现的。

工具箱一览:二十多个脚本,一个脚本一件事

功能

脚本

环境检查、浏览器启动、网络探测

doctor.py

EXIF信息:GPS、拍摄时间、焦距、朝向

exif.py

OCR文字识别(整图/裁剪/瓦片)

ocr.py

反向图片搜索(百度、Yandex)

revimg.py

一键信息采集:元数据+裁剪+OCR+反搜

intake.py

日照与阴影:纬度带、时间、朝向

sun.py

OSM地理查询:要素共现、线路走廊

osm.py

高程分析:天际线、山脊提取、批量评分

terrain.py

卫星影像扫描与匹配

sat_scan.py / match.py

相机姿态解算:位置/高度/朝向/误差

pose.py / geo.py

表5:geo-sleuth核心脚本工具箱(节选)

六、使用要求与注意事项

要跑起来geo-sleuth,你需要准备好以下环境:

·Python 3.10 或更高版本

·uv(Python包管理器)和 curl

·一个能运行Shell命令的AI代理(Claude Code、Codex、Cursor等)

·Google Chrome 或 Playwright Chromium(用于反向图片搜索)

·可选:NVIDIA CUDA GPU(加速match.py和sat_scan.py的模型推理)

首次运行时,相关脚本会自动下载依赖和模型权重,可能需要较长时间和较多磁盘空间(约2.4GB)。match.py和sat_scan.py会自动检测CUDA、MPS,然后回退到CPU。

特别提醒:geo-sleuth 的官方文档明确指出——请在你自己的照片或你有权分析的照片上运行它,永远不要用来寻找未经同意的人。技术是中立的,使用它的方式决定了它的价值。

七、结语:当AI学会像地理侦探一样思考

geo-sleuth 最令人印象深刻的,不是它能定位照片——而是它“展示工作过程”的方式。每一步推理都有数据支撑,每一个结论都可追溯到具体的命令和输出文件。它不是一个黑箱,而是一本打开的推理笔记。

在这个AI能力飞速发展的时代,geo-sleuth 展示了一种非常务实的思路:把能写成代码的规则都写成脚本,让AI只做它最擅长的事——在有限的候选中做判断。这种“脚本排序、模型判断”的分工,或许比追求一个端到端的大模型更可靠、更可解释。

如果你是OSINT爱好者、地理游戏玩家,或者只是对“一张照片能讲出多少故事”感到好奇,不妨试试这个工具。给你的AI代理装上geo-sleuth,然后递给它一张照片——看看它能为你解开什么样的地理谜题。

项目地址:github.com/Oldcircle/geo-sleuth(MIT开源协议)

相关学习资料