About

도쿄 카메라가 사이타마 지도에 찍힌 이유 — 지도 서비스의 진짜 비용은 좌표에 있다

대괄호를 노이즈로 지웠다가 동명 지역으로 빨려 들어갔고, 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건

내 1차 수집(사이타마 대상) 결과다.

YouTube 검색 후보   182건
지오코딩 통과        36건   ← 80% 가 여기서 탈락

지오코딩은 지명 · 주소 문자열을 위경도로 바꾸는 일이다. 탈락 이유는 대부분 「제목에서 지명을 못 뽑음」 아니면 「뽑았는데 대상 지역 밖」 이었다. 그런데 통과한 쪽에도 틀린 게 섞여 있었다. 지도를 훑다가 도쿄 하천 카메라가 사이타마에 꽂혀 있는 걸 봤다.

함정 1 — 노이즈로 지운 대괄호가 유일한 주소였다

일본 하천 감시 카메라 제목은 이렇게 생겼다.

【呑川】池上映像監視局[大田区池上1]

【LIVE】 같은 머리표를 지우는 김에 대괄호 [] 도 같이 지웠다. 남은 지명 조각이 동명의 다른 지역으로 빨려 들어갔다.

【呑川】池上映像監視局[大田区池上1]   → 埼玉県ふじみ野市池上 (실제: 도쿄 오타구)
【新河岸川】笹目橋映像監視局[板橋区…] → 埼玉県戸田市笹目     (실제: 도쿄 이타바시구)
【綾瀬川】内匠橋映像監視局[足立区…]   → 群馬県富岡市内匠     (실제: 도쿄 아다치구)

함정 2 — bbox 는 옆 현을 못 막는다

세 번째 줄은 군마현이다. 사이타마 bbox(위경도 사각형) 검사를 걸어 두었는데 통과했다. 도미오카시(경도 138.90, 위도 36.24)가 그 사각형 안에 들어간다. 사이타마 서쪽 산간과 군마 동쪽이 경도로 겹치기 때문이다.

Gunma Saitama Tokyo Saitama bbox (lat/lng rectangle) Tomioka, Gunma (138.90, 36.24) inside the box, outside Saitama schematic, not to scale

행정구역을 사각형으로 근사하면 경계에서 반드시 샌다.

함정 3 — 고쳤더니 폴백이 틀렸다

대괄호 주소를 1순위 후보로 올렸다. 이번엔 이렇게 됐다.

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 로 연락 주면 된다.

동작 흐름

1

영상 제목에서 지명 · 주소 후보를 뽑는다 (대괄호 안 주소를 지우지 않는다)

2

대괄호 주소가 있으면 그것만 쓴다. 대상 밖이면 폴백 없이 버린다

3

지오코더가 돌려준 정규 주소의 접두(埼玉県)로 대상 지역을 판정

4

bbox 는 보조, 거부 로그를 다시 읽어 필터를 검증

참고 자료

← Finder 색 태그는 AI 가 아니라 과거의 내가 붙였다 — xattr 속 「빨간색\n6」 문자열 봇 차단은 헤더 하나가 아니다 — 막는 쪽에서 본 다섯 층 →