지도 타일
우리가 흔히 보는 지도는, 사용자가 어떤 줌 레벨에서 지도를 보고 있느냐에 따라 표시해야 하는 정보의 양이 달라진다. 예를 들어,
- 줌 레벨 0에서는 전 세계 지도를 단 1×1, 즉 한 개의 타일로 표현한다.
- 줌 레벨 1에서는 2×2, 즉 4개의 타일로 표현한다.
- 줌 레벨 15인 경우에는 2^15 × 2^15라는 방대한 수의 타일을 갖게 된다.
또한 줌 레벨에 따라 동일한 좌표의 타일이라 하더라도, 실제로 표시해야 하는 정보의 종류나 양이 달라질 수 있다. 예를 들어, 줌 레벨 5에서는 지하철 노선도를 표시하지 않다가, 줌 레벨 6부터는 해당 지하철 정보를 포함하도록 구성할 수 있다. 이는 지도 타일을 어떻게 제작하느냐에 따라 각각 달라진다.
지도 라이브러리의 동작 방식
사용자가 특정 지역을 보고 있을 때, 지도 라이브러리는 화면의 위치 정보와 줌 레벨 등을 활용하여 해당 영역에 필요한 타일들만 요청, 표시한다.
아래의 예시 이미지를 보면, 줌 레벨 3에서 X=4~7, Y=2~4 범위에 해당하는 타일들을 전부 불러오고 있다. 한편, 한 타일에 담기는 정보가 많을수록 그 타일의 용량(파일 크기)도 커진다. 실제로 예시에서 3/6/3 좌표(줌 레벨/ X/ Y)의 타일은 203KB인데, 비해 상대적으로 정보가 적어 보이는 3/6/4 좌표 타일은 21KB에 불과하다.
저장 공간 문제
이러한 수 많은 타일 데이터를 일반적으로 클라우드 스토리지에 저장하는데, 여기서 문제가 발생한다. 예시로 간단한 정보만 표시하는 타일도 최소 21KB 용량을 차지한다고 할 때, 줌 레벨을 최대 20까지 지원해야 하는 서비스라면 모든 타일을 저장·호스팅하기 위해 상당한 용량과 비용이 소요된다. 물론 파일의 양이 많아짐에 따라 관리가 힘들어지는 문제도 존재한다.
PMTiles는 이러한 용량 및 관리 문제를 해결하기 위해 고안된 방식이다. 타일 데이터를 효율적으로 압축, 중복 제거하여, 보다 적은 용량으로 쉽게 지도 타일을 호스팅할 수 있게 해준다.
PMTiles
PMTiles란 무엇인가?
PMTiles는 기존 지도 타일 저장 방식에서 흔히 발생하는 문제들을 해결하기 위해 고안된 단일 파일 타일 저장 포맷이다. 예를 들어, 전 지구 범위의 지도 타일을 저장하려면 수억 개에 달하는 파일을 업로드하고 관리해야 하는 부담이 있으며, 이로 인해 막대한 업로드 비용과 관리 비용이 발생한다. 또한 중복되는 타일이 많아지면 불필요하게 파일 용량이 증가하고, 필요 타일을 불러오기 위해 발생하는 HTTP 요청도 크게 늘어나게 된다.
이러한 문제들을 해결하고자 PMTiles는 Z/X/Y 형태로 인덱싱된 여러 개의 타일 파일을 하나로 묶어 단일 파일 형태로 아카이빙한다. 이후 이 단일 파일을 S3와 같은 스토리지에 업로드하면, HTTP Range 요청을 통해 사용자가 필요한 타일만 효율적으로 불러올 수 있도록 설계되어 있다.
이를 통해 기존 디렉터리 구조로 이루어져 각 타일을 올리기 위해 수억개 이상의 파일을 업로드 해야하는 문제를 해결하여 관리가 쉽게 만들었으며 기존 구조에서 중복되는 타일 문제들을 PMTiles 생성 시 가공하는 작업을 가치기에 내부적으로 단 한번만 저장되어 전체 파일의 크기를 아주 큰 폭으로 줄여 클라우드 비용을 절약할 수 있다는 장점도 있다. 물론 파일의 크기가 줄었기에 HTTP 요청을 통해 가져오는 파일의 용량도 줄어 네트워크 비용 또한 절감된다고 말할 수 있다.
장점:
- 대규모 파일 관리 부담 완화
PMTiles는 하나의 파일로 타일 전체를 담기 때문에, 디렉터리 구조로 수억 개의 파일을 개별적으로 관리·업로드해야 하는 번거로움을 크게 줄여준다. - 중복 타일 제거로 인한 용량 절감
PMTiles 생성 과정에서 중복되는 타일을 한 번만 저장하기 때문에, 파일 크기를 매우 크게 줄일 수 있다. 특히 기존 벡터 베이스 맵 타일 셋을 PMTiles 포맷으로 변경 시 최대 70% 이상의 용량 절감 효과가 보여진다. 파일 크기가 줄어들면 자연스럽게 네트워크 전송량도 감소하여, HTTP 요청을 통해 실제로 다운로드받는 데이터 양이 줄어드는 이점이 있다. - 클라우드 비용 및 네트워크 비용 절감
앞서 언급한 용량 절감과 요청 수 감소 효과로 인해, 대규모 지도를 호스팅할 때 발생하는 스토리지 비용과 트래픽 비용이 동시에 줄어든다.
단점 및 고려사항:
- 읽기 전용 특성
PMTiles는 한 번 생성하면 기존 데이터를 수정할 수 없다. 새로운 데이터나 변경 사항이 생기면, 파일 전체를 다시 생성해야 한다. 예를 들어, 전 세계 데이터를 기반으로 만든 PMTiles에 한국 지하철 데이터를 추가하려면, 기존 파일을 수정할 수 없어 통째로 다시 빌드해야 한다.- 실제로, 전 세계 데이터를 기반으로 한국 지하철 데이터를 추가하는 데 8시간의 컴퓨팅 리소스가 소요되었다.(*사양, 타일 용량에 따라 다름)
- 갱신 주기가 길다면 문제 없음
전 세계 단위 지도를 자주 업데이트할 필요가 없는 경우, 읽기 전용이라는 단점은 크게 부각되지 않는다. 또, 이러한 생성 과정을 클라우드 환경에서 백그라운드로 수행할 수 있어, 실제 사용자가 대기하는 시간이 길지는 않을 수 있다.
결론
기존 지도 타일 방식도 각자의 장단점이 있고, PMTiles 또한 명확한 장점과 단점이 존재한다. 따라서 타일셋 업데이트 빈도, 스토리지 및 트래픽 비용, 중복 타일 규모 등을 종합적으로 고려하여 PMTiles 사용 여부를 결정하는 것을 권장한다. 대규모 정적 타일셋을 배포하고, 자주 변경할 필요가 없는 환경이라면 PMTiles는 매우 효율적인 해결책이 될 수 있다.
참고
https://formulae.brew.sh/formula/pmtiles
pmtiles
Homebrew’s package index
formulae.brew.sh
만약 PMTiles를 사용해보고자 한다면 위 링크의 패키지를 사용하여 PMTiles 파일들을 핸들링 할 수 있다.
또한 아래 링크에서 PMTiles 기반의 지도 배포에 대한 여러가지 방법을 설명해주니 이를 사용하고자 한다면 꼭 참고하길 바란다.
Protomaps Documentation | Protomaps Docs
docs.protomaps.com
https://pmtiles.io/?url=https%3A%2F%2Fdemo-bucket.protomaps.com%2Fv4.pmtiles#map=5.46/35.509/117.191
PMTiles Viewer
pmtiles.io
'frontend' 카테고리의 다른 글
MapLibre 기반으로 커스텀 타일을 기존 타일에 오버라이드 하기 (0) | 2025.03.22 |
---|---|
여러개의 PMTiles 파일을 병합하여 스토리지에 올리기 (0) | 2025.03.15 |
토스 테스트 자동화 플랫폼 구축 영상 요약 (0) | 2025.01.07 |
Cypress의 단점을 극복하기 위한 puppeteer 기반의 e2e 테스트 프레임워크 개발(2) (0) | 2024.12.20 |
Cypress의 단점을 극복하기 위한 puppeteer 기반의 e2e 테스트 프레임워크 개발(1) (0) | 2024.12.16 |