9P by GN⁺ | ★ favorite | 댓글 1개
  • tinyworldmap은 오프라인 우선 및 저대역폭 웹 앱을 위한 세계 지도이며, Leaflet과 함께 쓰도록 설계됨
  • 전체 줌 레벨을 지원하고 가장 완전한 버전은 gzip 450KB이며, 10년 된 저사양 휴대폰에서도 체감 지연이 없도록 클라이언트 렌더링을 프로파일링하고 테스트함
  • 기본 지도에는 OpenStreetMap에 추가된 인구 상위 10,000개 도시가 표시되며, 작성 시점 기준 인구 48,000명 이상 도시와 마을을 포함함
  • 사용 방식은 OpenStreetMap 타일을 대체하는 베이스맵 또는 오프라인 상태에서 OSM 타일 요청을 로컬 생성 타일로 바꾸는 fallback 지도 두 가지임
  • 지도 데이터는 OpenStreetMap처럼 ODBL 라이선스를 따르며, Leaflet 푸터 등에 OpenStreetMap과 tinyworldmap 저작자 표시가 필요함

tinyworldmap의 목적과 범위

  • tinyworldmap은 오프라인 우선 및 저대역폭 웹 앱을 위한 세계 지도임
  • Leaflet과 함께 쓰도록 설계됐으며, 모든 줌 레벨을 지원함
  • 가장 완전한 버전은 gzip 450KB, 압축 해제 시 1.1MB
  • 클라이언트 측 렌더링은 10년 된 저사양 휴대폰에서 광범위하게 프로파일링 및 테스트됐고, 체감 가능한 지연이 없었음
  • 데모는 Nightly demo, Stable demo, v3 announcement로 제공됨

기본 지도 데이터

  • 기본 설정에서는 OpenStreetMap에 추가된 인구 상위 10,000개 도시를 표시함
  • 작성 시점 기준으로 이 범위는 인구 48,000명 이상의 모든 도시와 마을을 포함함

Leaflet에서 쓰는 두 가지 방식

  • 베이스맵으로 사용

    • tinyworldmap을 Leaflet 베이스맵으로 쓰려면 head 태그에 배포 스크립트를 추가함
    • 안정 버전 스크립트는 https://tinyworldmap.com/dist/v3/tiny-world-all-10000.js이며, 지도 표시를 위한 모든 데이터를 포함함
    • Leaflet 타일 레이어 대신 다음 형태로 L.GridLayer.TinyWorld를 추가함
    new L.GridLayer.TinyWorld({maxZoom: 19}).addTo(map)
    
  • 오프라인 fallback 지도로 사용

    • 오프라인 우선 웹 앱에서 이미지 기반 지도를 모든 줌 레벨에 캐싱하는 것은 타일 수가 많아 불가능하며, 전체 크기가 종종 테라바이트 단위가 됨
    • 이 저장소는 지도 포함 웹 앱의 오프라인 기능을 위해 서비스 워커를 제공함
    • 서비스 워커가 설치되면 fallback 지도가 미리 로드됨
    • 방문한 페이지는 캐시됨
    • 베이스맵은 캐시에서 제외됨
    • 서버에 접근 가능할 때는 캐시 데이터가 사용되지 않음
    • 사용자가 오프라인이면 웹사이트가 캐시에서 제공되고, 서비스 워커가 OSM 타일 서버 요청을 가로채 tinyworldmap으로 대체 타일을 로컬 생성함
    • 서비스 워커를 등록하기 전에 서비스 워커 안의 IMPORTANT 표시 구간을 모두 수정해야 함
    • 등록 후 Leaflet 타일 레이어의 저작자 표시에는 OpenStreetMap과 tinyworldmap을 함께 포함해야 함
    • Hitchmap은 tinyworldmap을 fallback으로 쓰는 프로덕션 앱 예시임
    • 서비스 워커 지원 브라우저에서 웹사이트를 열고 잠시 기다린 뒤 인터넷을 끄고 새로고침하면 fallback 지도로 앱이 정상 동작해야 함
    • 서비스 워커 설치에는 시간이 걸릴 수 있음

지도 스타일과 맞춤 지도

  • 생성자는 render 옵션을 받아 지도 모양을 바꿀 수 있음
  • 각 레이어의 style 옵션은 Canvas의 CanvasRenderingContext2D에 적용됨
  • 예를 들어 state_borders 레이어에 fillStyle을 지정해 스타일을 바꿀 수 있음
let render = {
    state_borders: {
        style: {fillStyle: '#f00'}
    }
}

new L.GridLayer.TinyWorld({maxZoom: 19, render}).addTo(map)
  • 조직에 도로 지도, 도시 지도, 다른 언어의 지도, OSM 또는 비-OSM 데이터를 포함한 맞춤 콘텐츠 지도가 필요하면 business@tinyworldmap.com으로 견적을 요청할 수 있음

더 작은 지도 파일 옵션

  • 경계선 없는 버전

    • tiny-world-cities-10000.js(on)은 전체 버전에서 주 경계, 국가 경계, 해안선을 제외한 데이터를 포함함
    • 이 버전은 gzip 기준 300KB, 압축 해제 기준 825KB를 줄임
    • 경계선 없는 버전은 포함 데이터가 모두 정밀하다는 장점이 있음
    • 전체 버전의 국가 경계는 높은 줌 레벨에서 정확하지 않아, 국가 경계나 해안선에 맞는 도형을 오버레이할 때 어색하게 보일 수 있음
    • 그런 경우 경계선 없는 버전이 더 나아 보이는 경우가 많음
  • 도시 라벨 없는 버전

    • 도시 라벨이 없는 파일은 두 가지임
    • tiny-world-borders.js(on): 주 경계를 생략함
    • tiny-world-nocities.js(on): 주 경계를 유지함
    • 도시 라벨은 압축 해제 시 410KB, 압축 시 172KB를 차지함
  • 도시 수를 줄인 버전

    • 도시 라벨 포함 파일은 2,000개, 4,000개 도시 버전도 제공됨
    • 파일명에서 100002000 또는 4000으로 바꾸면 됨
    • | 포함 도시 수 | 인구 기준 |
    • | --- | --- |
    • | 10,000 | 48,000명 초과 |
    • | 4,000 | 137,000명 초과 |
    • | 2,000 | 287,000명 초과 |

라이선스와 저작자 표시

  • tinyworldmap 데이터는 OpenStreetMap 데이터처럼 ODBL 라이선스를 따름
  • ODBL은 저작자 표시를 요구함
  • 안내된 방식대로 설정했다면 Leaflet 푸터에 OpenStreetMap과 tinyworldmap 저작자 표시가 포함돼야 함
  • 그렇지 않으면 OpenStreetMap과 tinyworldmap 저작자 표시를 별도로 추가해야 함

댓글과 토론

Hacker News 의견들
  • 아이디어는 마음에 듦. 너무 멀리 축소해서 방금 요청한 대륙 타일을 서버가 렌더링할 때까지 기다려야 하는 문제를 풀어주니까 좋음
    다만 Detroit 교외인 West Bloomfield Township과 Waterford Charter Township의 상대 위치는 알 수 있는데, 어느 주에 있는지나 Great Lakes가 존재하는지도 모르는 사용 사례가 뭔지는 잘 모르겠음
    해안선에는 훨씬 더 많은 데이터를 쓰고, 대도시권 세분화에는 훨씬 덜 쓰면 좋겠음

    • 방향은 좋지만 100대 섬, 50대 호수, 200대 강 같은 식의 주요 지형은 꼭 포함해야 할 것 같음
    • 도로와 철도도 마찬가지임. 차에 두는 도로 지도라면 필요하지만, 그 외에는 도로 위치를 알 필요가 별로 없음
      다른 가능한 정보를 너무 많이 가려버림
    • 호기심에 몇 군데 찍어봤는데, 미국 Virginia의 Alexandria는 강 반대편에 있고 Bahrain은 꽤 처참하게 나옴
    • 이 부분은 v2에서 개선됐음
  • 멋지지만 해안선 디테일이 너무 낮음. 영국의 몇몇 마을은 바다 위에 떠 있고, 반대로 Greenland와 Northern Canada가 꼭짓점을 다 가져가고 있음
    Mercator 투영에 따른 디테일 수준은 이미 고려한 것 같지만, 사람이 거의 살지 않는 지역의 우선순위를 낮추면 좋겠음

    • 좋은 프로젝트임. 포함할 장소를 고를 때 Wikidata의 QRank도 쓰면, 인구가 적어도 유명한 섬들이 나타날 수 있을 듯함
      QRank의 SQLite DB도 예전에 HN에 올라온 적 있음
      [1] https://qrank.wmcloud.org/
      [2] https://github.com/hikeratlas/qrank
    • 도시 디테일과 해안선 디테일의 비율이 이상하게 도시 쪽으로 치우쳐 있음. 정확한 국경이나 해안선보다 도시를 더 많이 넣는 쪽으로 보임
      Netherlands의 한 주가 나라 본토와 끊겨 섬처럼 표시되는데 실제로는 그렇지 않음. 그런데 그 주 안의 도시 이름은 다섯 개나 알고 있고, 그중 몇 개는 거의 겹쳐 있음
      반면 Afsluitdijk를 넣은 건 개인적으로 불필요한 디테일 같지만, 어떤 땅을 그릴지와 단순 해상 인프라를 프로그램으로 구분하기 어렵다는 건 이해됨
      이슈 트래커에 티켓을 열어야겠지만 모바일에서 로그인하지 않아 지금은 HN 댓글이 최선임. 비슷하게 느끼는 사람이 있으면 이 댓글을 근거로 비율 조정, 도시 간 최소 거리 도입, 전체 파일 축소 같은 개선을 제안해도 좋겠음
    • 이 때문에 섬이나 군도 지역에서는 거의 쓸 수 없게 됨. Philippines도 섬이 많긴 하지만 꽤 큰 섬들이 여럿 있는데 지도로는 쓸 만하지 않음
      French Polynesia는 지도에 존재하지도 않음
    • 피오르드를 제거하고 다른 곳에 더 많은 디테일을 넣은 nightly 버전을 공개했음. 전반적으로 해상도도 더 높음
      원래 그렇게 하지 않은 이유는 오래된 휴대폰, 특히 Firefox for Android에서 많은 다각형을 그리다 크래시가 날 수 있어서였음. 이후 그리기 절차를 최적화했지만 주의가 필요함
      [1] https://tinyworldmap.com/beta.html
    • 단순화가 전반적으로 허술함. Caribbean에서는 나라 전체가 빠져 있음
      이건 기본적인 품질 관리에서 걸러야 할 부분임
  • 비슷한 걸 만들었음. 오프라인 우선, 매우 작고, 벡터 기반인데 국제화에 초점을 맞췄음
    UN의 모든 언어로 제공됨. 다만 Spanish는 그냥 까먹어서 빠졌고, 몇 시간 안에 만들 수 있을 텐데 부끄러움
    국가와 도시 이름은 UN에 등록된 공식 명칭을 씀. 그래서 UK의 공식 짧은 이름은 “United Kingdom of Great Britain and Northern Ireland”임
    https://map.ache.one/en

    • 괜찮지만 버그가 꽤 있음. “Cape town”이 South Sudan에 표시되는데 정작 나라 이름은 없고, Eritrea도 이름이 빠져 있음. Somalia 블록은 색이 다른 두 개로 나뉘어 있음
      가벼운 지도를 그리고 국제화를 처리하는 건 비교적 쉬웠음. 공개 데이터 소스와 라이브러리가 여럿 있기 때문임
      진짜 어려운 부분은 순전히 행정적 정의임. 대부분의 국가와 연결된 데이터가 있으면 지도 소스와 반드시 어긋나는 부분이 생기고, 결국 직접 맞춤 지도를 만들어야 함
      “국가”가 무엇인지에 대한 합의가 없음. Western Sahara는 공식적으로는 국가지만 실질적으로는 Morocco가 계속 점령해왔고, Somalia는 Somaliland와 Puntland가 사실상 독립국처럼 움직이지만 공식 인정은 없음. Greenland, Niue 등은 그 중간 어딘가에 있음
    • 어떻게 만들었는지 설명을 찾지 못했지만 지도는 아름다움. Tiny World Maps에도 관련 내용이 있긴 한데, 거기도 제작 방식 설명은 충분하지 않음
      국가 단위로 해본 경험상 더러운 해킹이 들어간 수작업 과정이었고, 제대로 맞췄는지 테스트하는 게 제일 힘들었음. 특히 적절한 일반화 수준과 사람들이 자기 지역 지도에서 기대하는 모습이 어려움
      이 지도를 크게 개선하는 데 들이는 노력이 가치 있다고 보는지 궁금함
    • 별표가 가장 큰 도시를 뜻하는지 수도를 뜻하는지 모르겠지만, 후자라면 Tanzania는 틀렸음
      별표는 Dar Es Salaam에 있는데 라벨은 Dodoma로 되어 있음. Dodoma가 실제 수도지만 나라 중앙 쪽에 더 있음
    • “i18n”이라는 약어 자체가 별로 국제화되어 있지 않음
  • 귀엽다. 예전에 완전히 같지는 않지만 비슷한 걸 만든 적 있음
    https://web.archive.org/web/20020611095429/http://www.cs.man.ac.uk/~hancockd/CityZen/index.html
    선분 2만 개, 장소 3,350개, 뷰어와 퀴즈까지 전부 합쳐 162KB였음

  • 피드백 고마움. 선택 배경을 설명하자면, 최근까지 이 프로젝트의 주된 초점은 국가 형태가 아니었음
    오랫동안 README에 있던 국경 없는 버전이 유일한 버전이었고, 전 세계를 추가하는 게 가능하다고 생각하지 않았음. 그런데 가능했음
    피오르드를 제거하고 요청이 많았던 섬을 포함해 다른 곳에 더 많은 디테일을 넣은 nightly 버전을 공개했음. 전반적으로 해상도도 더 높음
    원래 그렇게 하지 않은 이유는 오래된 휴대폰, 특히 Firefox for Android에서 많은 다각형을 그리다 크래시가 날 수 있어서였음. 이후 그리기 절차를 최적화했지만 주의가 필요함
    [1] https://tinyworldmap.com/beta.html

  • 인구 상위 10,000개 도시가 최선의 필터인지는 잘 모르겠음
    이 방식은 큰 나라의 도시를 우선하게 되고, 작은 나라들은 대부분의 도시가 빠질 가능성이 큼
    각 나라별 상위 X개 도시를 넣는 보조 필터가 있어야 함. 그래야 작은 나라의 주요 도시도 잡힐 것 같음

    • 도시의 중요도를 재는 다른 척도도 있음
      국가 수도, 지역 수도, 세계 도시, 지역 내 중심성 같은 기준이 기본 조건을 보완하는 데 유용할 수 있음
      이 논의에는 지리학자와 지도 제작자가 더 쓸모 있는 조언을 줄 수 있을 것 같음
  • 세계에서 가장 큰 정착지 10,000개를 고르면 인구 48,000명까지 내려간다는 게 흥미로웠음
    이 숫자가 놀라운 건지 아닌지 아직 판단 중임

    • 미국 도시를 인구순으로 상위 100개쯤 보면 대략 20만 명 수준까지 내려간다는 건 오래전부터 알고 있었음
      200개로 늘려도 여전히 10만 명 이상임. Wikipedia 기준 #333인 Daly City, CA가 인구 100,007명임: <https://en.wikipedia.org/wiki/List_of_United_States_cities_b...>
      이런 규모 분포는 다른 많은 스케일링 상황처럼 로그-로그 그래프에서 대체로 선형에 가까움
      China에서는 인구 100만 미만 도시가 나오기 전까지 106위까지 가야 함. 미국에는 그런 도시가 9개뿐임
      India는 방금 확인해보니 인구 100만 초과 도시가 46개이고, 100위인 Malegaon은 47.1만 명, 300위인 Aurangabad도 여전히 10만 명을 넘음
      다만 “도시”는 매우 임의적인 정의임. 세계 최대급 도시 중 일부는 다른 나라 기준으로는 대도시권, 심지어 주나 성에 해당할 수 있음
      면적 기준 최대 도시는 오히려 인구가 매우 적음. Greenland의 Sermersooq는 인구 24,148명, 면적 575,300km²로 Rhode Island의 약 144배이고, 미국 주 중에서는 Texas와 Alaska만 더 큼. Alaska도 12% 정도만 더 큼
      도시 지리학은 복잡한 분야라서 보통 대도시 통계권, 시가지 면적, 인구 같은 여러 스케일과 정의를 함께 비교함. 그래야 정치적 경계의 임의성을 완화하고 전체 인구·경제적 영향력을 더 잘 반영할 수 있음
  • 국경이 이렇게 거친데도 파일 크기가 이 정도라는 게 꽤 놀라움
    전체 데이터 크기가 유용성과 파일 크기의 균형점보다 한참 아래에 있는 것 같음. 예를 들어 두 배 크기여도 국경이 이렇게 울퉁불퉁하지는 않았을 것임

    • 전체 파일은 gzip 압축 없이 약 700KB
      “국경과 해안선을 제외한 완전판의 모든 데이터가 있으며, 이로써 크기가 200KB 줄어든다”는 설명을 보면, 약 29%가 국경·해안 데이터이고 71%가 도시 이름과 위치임
      개인적으로는 많은 도시를 제거할 수 있을 것 같음. 특히 서로 겹쳐 있는 도시들은 회색 땅덩어리와 도시명이 보일 정도로 확대해야만 보이니, 그 대신 해안선을 더 정확하게 만드는 편이 낫겠음
      일반적인 세계 지도상의 위치가 얼마나 자주 필요한지도 잘 모르겠음. 예를 들어 지금 보고 있는 관심 지점의 웹사이트에서, 그곳에 가는 데 쓸 주변 고속도로와 대중교통 노선을 담은 저용량 지도가 더 자주 필요하지 않을까
      지구 전체를 몇 km² 단위로 나눈 버전을 만들면, 10분의 1 크기로도 꽤 유용한 디테일을 담을 수 있을 것 같음. 전 지구 저다각형 지도도 국제우주정거장 추적 같은 용도는 있겠지만 훨씬 드물어 보임
  • 인구가 4만 명보다 적더라도 수도는 반드시 포함하고, 어떤 식으로든 별표 표시를 해야 함

  • 정말 멋짐. 휴대폰에서 이렇게 빨리 로드되는 게 인상적임
    공간 데이터를 Paths로 압축한 아이디어가 아주 좋음
    ODbL 라이선스를 피하려면 OSM 대신 Natural Earth 데이터를 쓰는 것도 좋겠음
    공간 데이터를 Paths로 변환하는 도구도 포함하면 정말 좋을 것 같음