
写真がどこで撮影されたかを特定するエージェントスキル — OpenStreetMapのジオメトリ、標高スカイライン、衛星画像、ストリートビューを使い、その根拠を提示します。Claude Code、Codex、Cursor、Gemini CLI、OpenCode、GitHub Copilotで動作します。
写真がどこで撮影されたかを特定し、その過程を提示するエージェントスキル。
対応環境
…および SKILL.md を読み、シェルコマンドを実行するその他のエージェント。
テキストなし。ナンバープレートなし。ランドマークなし。橋が1つ、山が1つ。2 m 以内まで特定。
npx skills add Oldcircle/geo-sleuth
プロンプトが表示されたらエージェントを選択してください。その後、エージェントに写真を見せ、以下のように伝えてください:
この写真が撮影された場所を探して
初回使用時は、インストール済みのスキルにある scripts/ フォルダから doctor.py を実行し、失敗したチェックがある場合は対応してください(要件とセットアップ を参照)。これがインターフェースのすべてです。エージェントは SKILL.md を読み、スクリプトを実行し、カメラの位置、向いている方向、そして衛星画像による証拠画像を返します。フォルダを手動でコピーしたい場合は、インストール を参照してください。
SKILL.md とプレーンな Python スクリプト — なので、同じフォルダが Claude Code、Codex、Cursor、Gemini CLI、OpenCode、GitHub Copilot で動作します。これらの写真には GPS データが含まれていません。各ケースでは、スキルが写真から読み取った情報、検索範囲をどのように絞り込んだか、そして結果が確認済みのカメラ位置からどの程度離れていたかを記載しています。
![]() |
![]() |
![]() |
| 1 · 米田と高架橋 鉄道橋 × 空のシルエット × 橋脚数。 |
2 · 砂漠の空のシルエット 送電線 × 空のシルエット × 1° 傾いたスマホ。 |
3 · 桜の街路 街路樹オープンデータ × 影 × ストリートビュー。 |
| ±2 m 広東省清遠市 |
100 m 以内 青海省大柴旦 |
3 m カナダ・バンクーバー |
EXIF データが削除されたスマホの写真:収穫された米田の端にある白いオーブン、遠くに長い高架橋、右側に急峻な山。フレーム内に文字は一つもありません。このスキルがインストールされたエージェントにメッセージを送るだけで、カメラの位置と向きが返ってきました。
photo → 27,335 → 171 → 14,372 → 22 → 3 → 1 → ±2 m
| ステップ | 行ったこと | 候補数 |
|---|---|---|
| 写真を読み取る | 高架橋の柱は架線柱なので、電化鉄道のようです。橋脚の間隔を定規として使用(32 m スパン仮定):左側の区間は約 0.5 km 先、右側は 1 km 以上先です。急峻な山が約 3 km 先にあります。米は収穫済みですが草はまだ緑色なので、霜はまだ降りていません。 | 賭けとしての中国南部、証明ではない |
| 地域スキャン | OpenStreetMap から地域のすべての鉄道橋を取得:27,335 セグメント。400 m ごとに地点をサンプリングし、各地点の標高データから 360° の空のシルエットを計算しました。付近に平坦な地面があり、数 km 以内に明確な山があり、その隣に平坦な地平線がある地点を残しました。 | 171 サイト |
| 空のシルエット適合 | 各サイトの周囲に候補となるカメラ位置を配置し、そこから見える尾根の線をレンダリング:14,372 位置。上位 20 位は互いに 0.1° 以内だったので、追加制約を加えました:橋は左側で近く、右側で遠くなければなりません。 | 22 |
| オーバーレイ確認 | 上位 3 つの尾根の線を写真に戻して描画しました。#1(福州)はオーブンの背後に隠れた膨らみがあり、そのためスコアが高くなりました。#3(恵州)は写真が平坦な部分が傾いています。#2(清遠)は山の麓からフレームの端まで一致しました。 | 1 |
| 橋脚数 | 写真内の 17 本の橋脚は、カメラからの 17 方位角になります。それらが鉄道路線と交差する地点は、等間隔でなければなりません。空のシルエットと組み合わせることで:まず長さ約 300 m の帯域、次に単一の地点に絞り込まれました。 | ±2 m |

