系統定位
geo-sleuth 是由 Agent 操作 Python 腳本的照片定位技能。它以候選地點與證據紀錄組織調查,適用於分析本人拍攝或已獲授權的照片。
| 輸入或產出 | 內容 |
|---|---|
| 輸入 | 原始照片與已知背景;提示仍需驗證 |
| 主要結論 | 支持到哪一層級的拍攝位置與不確定範圍 |
| 幾何資料 | 有證據支持時提供 WGS84 座標、誤差半徑及拍攝方位 |
| 支持材料 | 證據圖、實際命令與產出檔案 |
| 未解部分 | 替代候選、受阻路徑與尚缺的證據 |
決策
- board.py
- 候選、證據與排序
感知
- 前處理與查表
- 地圖與地形計算
- 影像相似度排序
判斷
- Agent 檢查高排名候選
- 核對證據
- 說明不確定性
腳本管理候選與計算,Agent 依實際產出判斷;排名不等於定位已確認。
這是一個技能資料夾,需由可讀取 SKILL.md 並執行 shell 的 Agent 使用。它不提供獨立的照片定位網站。
安裝與診斷
- 未完成:
Python 3.10 或更新版本。
- 未完成:
已安裝
uv與curl。 - 未完成:
可執行 shell 並檢視圖片的 Agent。
- 未完成:
完整保留技能資料夾及其輔助模組。
- 未完成:
需要反向圖片搜尋時,已安裝 Chrome 或 Playwright Chromium。
透過 skills CLI 安裝時,由互動介面選擇使用的 Agent:
npx skills add Oldcircle/geo-sleuth這條安裝路徑需要可用的 Node.js/npm 工具鏈;Python 腳本本身依 uv 管理依賴。若要從原始碼查閱及執行,使用以下路徑:
git clone https://github.com/Oldcircle/geo-sleuth
cd geo-sleuth
uv run skills/geo-sleuth/scripts/doctor.py --json需要檢查服務連線時,再執行:
uv run skills/geo-sleuth/scripts/doctor.py --network --jsondoctor.py --network 不上傳照片,也不載入 OCR 或 ML 模型。首次透過 uv run 執行時,依賴安裝仍可能使用網路。
反向搜尋的瀏覽器未安裝時,可依官方方式安裝 Chromium:
uvx playwright install chromium核心工具
以下卡片列出腳本或子命令名稱。從 clone 根目錄執行時,在名稱前加上 uv run skills/geo-sleuth/scripts/;已安裝的技能則使用實際路徑。
照片前處理
intake.py
建立前置資料
整理 metadata、裁切、OCR 與反向搜尋;--no-rev 可跳過照片上傳的反搜分支。
候選管理
board.py
紀錄與比較證據
管理候選、線索狀態與排序;check 的輸出仍需閱讀,不能只看退出碼。
地圖幾何
osm.py
建立地理候選
依 OSM 特徵及線性設施查詢;資料稀疏不代表真實地景不存在。
山稜線比對
terrain.py
地形掃描與視線限制
由高程計算地平線並比較山稜;單一吻合視線不足以確認相機位置。
衛星影像排序
sat_scan.py
縮小影像檢查範圍
以 CLIP 排序網格或候選點;Agent 仍需核對高排名縮圖。
地面影像排序
match.py
比較街景候選
使用 DINOv2 或 CLIP,並可用 SIFT 重排;相似分數不等於位置證明。
證據交付
evidence.py
組合地圖與比較圖
由既有影像及 JSON spec 繪製證據;不會代替前面的定位計算。
| 照片線索 | 可選工具 | 驗證限制 |
|---|---|---|
| 可讀文字或標示 | ocr.py、clues.py、poi.py | 放大後才出現的文字需回原圖核對 |
| 陰影或太陽 | sun.py | 驗證時間、鏡像與拍攝方向的假設 |
| 山稜與線性設施 | terrain.py、osm.py、geo.py | 需另一項獨立幾何限制確認位置 |
| 已知位置的影像控制點 | pose.py | 位置辨識與座標品質影響解算結果 |
| 區域或國別線索 | regions.py、gazetteer.py | 不要預設知名地點是唯一候選 |
候選板與證據規則
線索依狀態記錄,避免把推測寫成測量:
| 狀態 | 含義 | 用法 |
|---|---|---|
observed | 影像中的觀察 | 記錄可見特徵,保留裁切或原圖 |
read | 讀到的文字或資料 | 指向可核對的來源檔案 |
inferred | 由線索提出的假設 | 提示與 metadata 衝突時,重新檢查影像 |
computed | 腳本的計算結果 | 指向本次實際命令與輸出 |
observed 與 inferred 可改變候選權重,但不能直接作為排除依據。排除需要符合證據條件,且檔案存在不代表其內容已被正確解讀。
| 操作 | 規則 |
|---|---|
| 加入候選 | 列出合理的整組候選,不以人口或知名度挑一個答案 |
| 記錄反證 | 先降權;未檢查的候選不能當成已排除 |
| 排除區域或道路 | 證據範圍必須支持排除範圍;使用 --covers 記錄涵蓋位置 |
| 細化地點 | 以 --parent 保持候選的包含關係 |
| 無法區分 | 依 next 建議做共同的區分測試,再安排掃描 |
| 多個離散候選 | 選支持最高的主候選並列出替代項,不取座標中點 |
候選板的 share 是目前紀錄候選間的相對分數,不能當成已校準的照片定位命中率。最終報告的信心分級與候選排序分開處理。
操作原則
先檢查資料涵蓋率
OSM 或街景沒有資料時,改用有依據的其他來源;沒有查到不能作為地點不存在的證據。
保留原始解析度
README 展示圖不等於案例原始輸入。先保留原圖,再以裁切核對線索;不要用縮圖重現作者報告的誤差。
分開獨立證據
同一標示的重複照片不算多項獨立支持;以穩定地形或公共設施核對候選。
設定調查預算
先約定所需層級與停止條件;服務失敗時換可行路徑,避免持續重送相同的失敗請求。
match.py 與 sat_scan.py 首次使用會安裝 ML 依賴並下載權重。裝置預設嘗試順序如下,可透過 GEO_DEVICE 選擇支援的裝置:
CUDA。
MPS。
CPU。
模型權重下載與影像處理需預留時間及磁碟空間。Agent 使用費依宿主工具與模型方案而定,不因技能程式碼採 MIT 就保證整次調查沒有成本。
公共地景範例
範例使用本人拍攝、可合法分析的公共步道照片 public-landscape.jpg。目標先設定為片區層級,且不執行對未同意者的定位。
以下命令是操作規格,本次未分析照片。從 clone 根目錄建立新的案例資料:
uv run skills/geo-sleuth/scripts/intake.py public-landscape.jpg --out-dir case-landscape/intake --no-rev
uv run skills/geo-sleuth/scripts/board.py --board case-landscape/board.json init --photo public-landscape.jpg --case public-landscape先檢查以下產出;初始 board 尚未包含定位證據:
| 檔案 | 檢查內容 |
|---|---|
case-landscape/intake/intake.md | 成功、失敗與略過的步驟 |
case-landscape/intake/intake.json | result 與各步驟的 status |
case-landscape/intake/edges/ | 裁切是否支持原先觀察 |
case-landscape/board.json | 以該照片建立的空候選紀錄 |
可將以下工作規格交給已載入技能的 Agent:
Analyze public-landscape.jpg, which I took on a public trail. Aim for area-level identification first. Begin with case-landscape/intake and case-landscape/board.json. Ask before uploading the photo to reverse-image search. Record every executed command and its output file. Compare all justified candidates. Do not invent coordinates or precision. Report alternatives, failed routes, and missing evidence if the location remains unresolved.Agent 應依實際線索選路徑。地圖與幾何資料確認後,才建立 case-landscape/spec.json:
| 欄位或依賴 | 條件 |
|---|---|
map | 指向 tiles.py fetch 圖檔;旁需有同名 JSON 地理參照檔 |
camera | 有證據支持的 WGS84 相機位置 |
heading、hfov | 由實際測量或有依據的相機幾何決定 |
panels | 可核對的地面比較影像;路徑相對於 spec |
先檢查地圖 sidecar 的 failed_tiles 與實際影像,再組合證據圖:
uv run skills/geo-sleuth/scripts/evidence.py case-landscape/spec.json --out case-landscape/evidence.jpg接著檢查候選板:
uv run skills/geo-sleuth/scripts/board.py --board case-landscape/board.json check --evidence case-landscape/evidence.jpg若印出 FAIL,先停止並修正。內容檢查通過後,再將候選紀錄合併至結果檔:
uv run skills/geo-sleuth/scripts/board.py --board case-landscape/board.json report --merge case-landscape/result.jsonreport --merge 整理候選紀錄,不會替照片計算真實座標。若證據不足,交付已支持的層級與待補資訊,不要為了填滿欄位產生一個位置。
精度與信心分級
技能要求誤差半徑不大於 100 m 時,需有兩項獨立限制的交會,或至少三項不變特徵的地面影像吻合。這是證據門檻,不能取代來源品質與相機幾何的檢查。
| 報告層級 | 高信心條件 | 中信心條件或限制 |
|---|---|---|
| 城市 | 可讀文字或已確認地標等證據 | 多項獨立弱線索一致 |
| 片區 | 至少三項俯視特徵唯一吻合,候選區已檢查且無第二個匹配 | 最相似地點仍有未檢查的替代候選 |
| 道路 | 至少兩項獨特地面特徵吻合 | 版面與一項特徵一致;無地面影像時需高片區信心及方位自查 |
| 建物 | 兩項獨立相機位置限制,加至少三項地面特徵吻合 | 只具備其中一組支持 |
| 樓層 | 兩種類型的參考一致 | 單一參考;低信心時不提供 |
各層級分開評分,報告到最細且達到中信心以上的層級。單一山稜線吻合只限制視線;不能直接寫成公尺級相機位置。
候選板的 --level 與報告的信心表不同。建立候選時使用該 CLI 支援的層級,不要把報告名稱直接當成參數:
| 候選板支援的層級 |
|---|
country、admin1、admin2、city、district、area、road、point |
限制與注意事項
| 狀況 | 處理方式 |
|---|---|
| doctor 回傳 0 | 仍需閱讀 WARN 與修正建議 |
| intake 回傳 0 | 可能是 partial;檢查報告與逐步 status |
| 反向搜尋沒有結果 | 檢查是否搜尋失敗、CAPTCHA 或服務不可用 |
| 地圖出現黑色區塊 | tiles.py fetch 可能仍正常結束;檢查 failed_tiles,勿把缺圖當反證 |
| 地形 tile 缺失 | 預設會失敗;使用 --allow-missing 後的缺口不能當有效地形 |
| 街景比對低分 | 檢查視角與拍攝年代;未 refine 不等於零個匹配 |
| 大區域 OSM 查詢逾時 | 縮小範圍或改路徑,不反覆重送同一請求 |
| 重新執行 board init | 既有檔案需另外處理;不要用 --force 抹掉待保留的調查紀錄 |
證據圖使用 WGS84 對齊的底圖。從其他地圖讀到座標時,先確認 datum:
| 名稱 | 常見用途 |
|---|---|
| WGS84 | GPS、OSM 與高程資料 |
| GCJ-02 | 部分中國地圖服務 |
| BD-09 | 百度經緯度 |
| Baidu Mercator | 百度地圖及全景 API 的投影座標 |
程式碼授權與資料授權分開確認:
| 項目 | 條款或處理 |
|---|---|
| 技能程式碼 | MIT |
| Wikipedia 衍生查表資料 | CC BY-SA 4.0,保留原始來源與姓名標示要求 |
| 發佈 OSM 查詢結果 | 依 ODbL 與來源要求標示 OpenStreetMap contributors |
| 衛星與街景影像 | 依各服務條款,不因本專案 MIT 而自動取得任意散佈權 |
案例目錄與 .geo-cache/ 可能保留來源資訊。對外分享前檢查檔案內容,勿公開未授權的照片或私密位置。
官方案例與評估界線
README 列出以下新 Agent 重跑紀錄;數字屬作者報告,本次未重現:
| 案例 | 提示 | 作者報告的距離 | 時間 |
|---|---|---|---|
| 沙漠山稜 | 在中國 | 距已確認相機位置 87 m | 32 min |
| 溫哥華櫻花街景 | 無 | 距已確認相機位置 3 m | 53 min |
這兩張照片先前都已解出,相關經驗也已寫入技能,因此 README 將它們定位為回歸檢查。它們不是未見照片的整體準確率;公開的未見照片盲測集仍列在 roadmap。
個別算子的檢索排名不能代表端到端定位成功。評估自己的用途時,保留未解出的案例與實際調查成本。
後續操作
| 下一項工作 | 操作 |
|---|---|
| 服務失效 | 重跑 doctor 的相關診斷,記錄失敗路徑 |
| 調整模型裝置 | 檢查 GEO_DEVICE 與目前 torch 支援狀況 |
| 新國別資料 | 查看 region pack 與查表來源,再決定可用範圍 |
| 回報錯誤 | 提供第一次偏離的步驟與最小可核對資料,不張貼私人住宅或可識別個人的內容 |
維護中的工具訊息與說明以英文為主;OCR 與來源文字保留原文,由 Agent 用讀者語言解釋。凍結的 zh-final tag 不能替代目前主線文件。
本手冊查核修訂為 1a9ecee153b02e2db2e62352002fa5b17bbd819d,技能文件標示 v2。本次未執行:
照片定位或案例重跑。
照片上傳與地圖服務查詢。
技能安裝或模型下載。