東京のカメラが埼玉の地図に載った理由 — 地図サービスの本当のコストは座標にある
角括弧をノイズとして消したら同名の地域に吸い込まれ、bboxは隣の県を止められなかった
日本各地のYouTubeライブカメラを地図に並べたサービス(tomarigi.me)を見て、埼玉版を自分で作ってみた。やってみると、地図サービスを真似するコストはコードではなく座標にあった。 Leafletの地図とYouTubeの埋め込みはすぐ付く。残りの時間は全部「この動画はどこにあるのか」との戦いに消えた。その戦いで踏んだ罠が三つ、最後に残した防衛線がひとつ。
サービスが積み上げている資産はマッピングひとつ
2026-08-22にtomarigiをブラウザの開発者ツールで覗いた。Next.jsの上にLeaflet(Canvasレンダラー)、データは /api/spots 一回で約330KB・1,312件を丸ごと受け取る。サムネイルは img.youtube.com を直接使っている。レコードは実質これだけだ。
{"id":"...","name":"【LIVE】京都 随心院ライブ中継カメラ",
"lat":34.955,"lng":135.82,"category":"landmark",
"video_id":"5Ica9fIP_Ng","is_live":true}
動画は元の配信者のYouTube埋め込みで再生される。サービスが積み上げているのは video_id ↔ 緯度経度 のマッピングひとつだ。その1,312件をどう集めたのかは、公開された資料を見つけられなかった。
182件中36件
自分の一回目の収集(埼玉対象)の結果だ。
YouTube検索の候補 182件
ジオコーディング通過 36件 ← 80%がここで脱落
ジオコーディングは地名や住所の文字列を緯度経度に変える処理だ。脱落の理由はほとんどが「タイトルから地名を取れない」か「取れたが対象地域の外」だった。ところが通過したほうにも間違いが混ざっていた。地図を眺めていたら、東京の河川カメラが埼玉に刺さっていた。
罠1 — ノイズとして消した角括弧が唯一の住所だった
河川監視カメラのタイトルはこういう形だ。
【呑川】池上映像監視局[大田区池上1]
【LIVE】 のような頭の飾りを消すついでに、角括弧 [] も一緒に消した。残った地名のかけらが、同じ名前の別の地域に吸い込まれた。
【呑川】池上映像監視局[大田区池上1] → 埼玉県ふじみ野市池上(実際: 東京都大田区)
【新河岸川】笹目橋映像監視局[板橋区…] → 埼玉県戸田市笹目 (実際: 東京都板橋区)
【綾瀬川】内匠橋映像監視局[足立区…] → 群馬県富岡市内匠 (実際: 東京都足立区)
罠2 — bboxは隣の県を止められない
三行目は群馬県だ。埼玉のbbox(緯度経度の四角形)チェックを入れていたのに通った。富岡市(経度138.90、緯度36.24)がその四角形の中に入る。埼玉の西の山間部と群馬の東側が、経度で重なっているからだ。
行政区域を四角形で近似すると、境界で必ず漏れる。
罠3 — 直したらフォールバックが間違えた
角括弧の住所を第一候補に上げた。今度はこうなった。
第1候補 [調布市東つつじヶ丘2] → 東京の住所 → 対象外 → 脱落
第2候補 チャンネル名「入間川」 → 埼玉県狭山市入間川 → 通過(誤り)
候補を信頼度順に積んで順に試す設計だった。最初は頑丈だと思っていた。でも角括弧の住所があるなら、それが唯一の真実だ。それが対象外なら、フォールバックせずに捨てるべきだった。確かな情報が「違う」と言ったことを、それより不確かな情報にひっくり返させてはいけない。
最後の防衛線 — 座標ではなく文字列
def in_target?(geocoded)
geocoded[:address].start_with?('埼玉県')
end
ジオコーダーが返した正規化済みの住所が 埼玉県 で始まるかを見る。bboxは補助として残しただけだ。取り直すと他県の混入は0件、最終的に58件が残った。そのうち埋め込みが許可されていて地図上でそのまま再生できるのは24件だった。
弾いた67件も見直した。ほぼすべて正しく捨てたものだった。埼玉っぽく見えた3件は「大宮」だったが、大宮は奈良県奈良市にも東京都杉並区にもある。失敗ログがフィルターの正しさの証拠になった。
bbox・文字列・境界ポリゴン
| 方法 | よく防ぐもの | 取りこぼすもの |
|---|---|---|
| bboxの四角形 | まったく別の地方 | 隣の県(境界は四角形ではない) |
| 住所の前方一致 | 隣の県、同名の地域 | ジオコーダーが住所そのものを間違えて返すとき |
| 行政区域の境界ポリゴン | 境界付近の座標 | 境界データを別に持ち運ぶ必要がある |
県単位で絞るなら、住所の文字列ひとつで足りた。市区の境界まで正確にしたいときにポリゴンを足せばいい。
地図や位置データを集めていて座標がどうもずれるなら、たいていコードよりデータのクレンジングの問題だ。一緒に見てほしければ https://www.negabaro.com/contact から連絡してほしい。
動作フロー
動画タイトルから地名・住所の候補を取る(角括弧の住所は消さない)
角括弧の住所があればそれだけを使う。対象外ならフォールバックせず捨てる
ジオコーダーが返した正規住所の前方一致(埼玉県)で対象地域を判定
bboxは補助。弾いたログを読み直してフィルターを検証