준비
먼저 최신 맥이라고 하더라도 노트북의 성능으로는 지도 타일을 만드는데 시간이 매우 오래 걸리기에 지도 타일을 만들기 위한 ec2인스턴스를 잠깐 빌려준다.
64vcpu, 128기가 이상의 메모리, 500기가 ssd 이상 성능을 가진 인스턴스를 빌리는게 가장 좋지만
백그라운드에서 돌아가게 할거이기에 시간이 좀 걸려도 상관 없으니 32vcpu, 128기가 메모리, 500기가 ssd정도로 타협한 m5.8xlarge 인스턴스를 사용한다 만약 이래도 메모리가 부족 문제가 발생한다면 더 높은 메모리의 인스턴스를 사용한다.
타일 다운로드
이후 해당 인스턴스에 ssh를 통해 접속 후 아래 명령어를 실행하여 전세계 PMTiles 파일을 다운받아준다.
wget https://build.protomaps.com/20250303.pmtiles
위 지도 타일은 25년 3월 3일 기반 최신화된 지도 타일이며 호스트로 검색 시 다양한 버전의 타일이 있으니 알맞는 타일을 다운받아 사용하면 된다.
Protomaps Documentation | Protomaps Docs
docs.protomaps.com
https://jjongsk.tistory.com/entry/%EC%A7%80%EB%8F%84-%ED%83%80%EC%9D%BC%EA%B3%BC-pmtiles
지도 타일과 PMTiles
지도 타일우리가 흔히 보는 지도는, 사용자가 어떤 줌 레벨에서 지도를 보고 있느냐에 따라 표시해야 하는 정보의 양이 달라진다. 예를 들어,줌 레벨 0에서는 전 세계 지도를 단 1×1, 즉 한 개의
jjongsk.tistory.com
PMTiles가 무엇인지, 어떤식으로 사용하는지에 대해서는 위 링크에 자세하게 적혀져 있다. 지도에 관심이 있거나 개발을 할 일이 있는 사람이면 참고하면 좋을 것 같다.
커스텀 지도 타일을 만드는 이유는 한국의 지하철 노선도를 지도에서 보여주고 싶어서이다. 이를 위해 공공 한국 지하철 노선도 데이터를 사용해서 직접 PMTiles형태로 바꿔준 파일을 인스턴스에 옮겨준다. 명령어는 아래와 같다. 지도 파일 생성 방법은 따로 설명하지 않겠다.
scp -v -i "[pem파일 이름].pem" /Users/kjsik11/Downloads/korea-subway.pmtiles ec2-user@ec2-xx-xx-xx-xx.[region].compute-1.amazonaws.com:~
만약 커스텀 데이터를 기존 타일에 추가해줄 필요가 없다면 새로운 지도타일 파일을 만들 필요도 없기에 인스턴스를 띄우고 타일을 생성해주는 부분은 건너띄어도 무관하다. 단순하게 세계 지도 타일 PMTiles파일을 다운받은 뒤 아래에서 설명하는 방식대로 배포후 사용하기만 하면 된다.
타일 병합
정상적으로 위 과정을 진행했다면 두 개의 PMTiles가 존재할텐데 이를 합쳐주는 과정을 진행해야한다. 여기에는 많은 컴퓨팅 파워가 필요하며 속도는 cpu의 코어 개수에 의존하며 메모리를 많이 사용하기에 일반적인 pc로는 실행이 불가능하거나 오랜 시간이 소모될 수 있다. 이전에 맥으로 테스트 해봤을떄 약 4일정도 걸렸었던 것 같다.
이후 PMTiles를 합쳐주기 위해 tippecanoe를 설치해줘야한다.
https://github.com/mapbox/tippecanoe
GitHub - mapbox/tippecanoe: Build vector tilesets from large collections of GeoJSON features.
Build vector tilesets from large collections of GeoJSON features. - mapbox/tippecanoe
github.com
버전을 맞춰야 하기에 되도록 git clone 보다는 brew install방식의 설치를 권장한다.
먼저 git을 설치해준다
sudo yum update -y
sudo yum install git -y
git version
linux brew를 설치하기 위해 명령어를 입력해준다.
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
설치후 출력된 명령어를 입력하여 brew 경로를 추가해준다. 예시는 아래와 같다.
echo >> /home/ec2-user/.bashrc
echo 'eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"' >> /home/ec2-user/.bashrc
eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"
다음으로 아래 명령어를 입력해 최신 버전의 tippecanoe를 설치해준다.
brew install tippecanoe
설치가 완료되었다면 아래 명령어를 통해 세계 지도 타일과 내가 추가한 커스텀 타일을 합쳐준다. 이 작업은 nohub 명령어를 통해 백그라운드에서 실행된다.
nohup tile-join -o merged.pmtiles 20250303.pmtiles korea-subway.pmtiles > tile-join.log 2>&1 &
백그라운드에서 실행하지 않고 현재 진행상황을 실시간으로 확인하고 싶다면 아래 명령어를 사용하면 된다. 아래 명령어를 사용할경우 현재 어떤 줌 레벨의 타일을 생성중인지 실시간으로 확인할 수 있다.
tile-join -o merged.pmtiles 20250303.pmtiles korea-subway.pmtiles
주의 사항
PMTiles간 구조가 다를 경우 인덱싱으로 인해 join 결과물의 용량이 크게 늘어날 수 있으며 시간이 훨씬 오래 걸릴 수 있음
백그라운드 실행 시 작업이 정상적으로 진행중인지 확인하고 싶다면 아래 명령어들로 확인할 수 있다.
[프로세스 실행 확인]
ps aux | grep tile-join
[메모리 사용량]
free -h
백그라운드로 실행시에도 명령어로 로그를 실시간으로 확인할 수 있다.
tail -f tile-join.log
명령어를 입력한 뒤 약 10분정도가 지났다면 지도 생성 로그를 확인할 수 있을것이다. 예를들어 11/366/1845는 각각 현재 줌 레벨, 가로 타일 수, 세로 타일 수를 의미한다.
각 줌 레벨에서 생성되는 타일 수는 아래와 같이 증가한다.
- 줌 레벨 0: 1타일 (1x1)
- 줌 레벨 1: 4타일 (2x2)
- 줌 레벨 2: 16타일 (4x4)
즉, 각 줌 레벨마다 타일 수가 4배씩 늘어나므로, 생성 시간도 이전 줌 레벨에 비해 약 4배 정도 걸린다고 볼 수 있으며 줌 레벨 15까지의 타일을 생성하는 데는 줌 레벨 0의 생성 시간에 4^15 (약 10억 배)의 시간이 필요할 것으로 예상할 수 있다.
현재 줌 레벨의 생성에 소요된 시간을 기준으로 대략적인 완료 시간을 예측해볼 수 있으며 예상 완료 시간에 로그를 확인하여 작업 완료 여부를 확인하면 된다.
타일 업로드
지도 타일 생성이 완료되었다면 이제 해당 지도타일을 클라우드 스토리지에 올려야한다. s3를 사용하도록 하겠다.
https://formulae.brew.sh/formula/pmtiles
pmtiles
Homebrew’s package index
formulae.brew.sh
용량이 큰 파일이다 보니 바로 올릴수는 없고 큰 파일을 올리기 위한 별도의 방법을 사용해야 하는데 위 링크를 통해 설치할 수 있는 PMTiles 패키지에서 업로드하는 방법을 제공해주니 해당 방법을 사용하면 된다.
명령어는 아래와 같다. 단 이 때 aws key,secret,region을 env 값으로 등록해야 정상적으로 동작한다.
export AWS_ACCESS_KEY_ID=your_access_key_id
export AWS_SECRET_ACCESS_KEY=your_secret_access_key
export AWS_DEFAULT_REGION=ap-northeast-2
pmtiles upload --bucket=s3://[AWS_BUCKET] merged.pmtiles [AWS_PREFIX]/merged.pmtiles
명령어를 입력하면 아래처럼 업로드가 정상적으로 되고 있는 것을 확인할 수 있다.

업로드가 완료되면 이후 해당 버킷에서 파일을 확인할 수 있다.
타일 배포
지도를 배포하는 과정은 아래 링크를 잘 따라하기만 하면 쉽게 배포가 가능하지 따로 설명하지 않겠다.
https://docs.protomaps.com/deploy/aws
AWS Integration | Protomaps Docs
docs.protomaps.com
'frontend' 카테고리의 다른 글
한국 지도에 지하철 역,노선도를 추가해서 지도 UX 개선하기 (0) | 2025.03.29 |
---|---|
MapLibre 기반으로 커스텀 타일을 기존 타일에 오버라이드 하기 (0) | 2025.03.22 |
지도 타일과 PMTiles (0) | 2025.03.04 |
토스 테스트 자동화 플랫폼 구축 영상 요약 (0) | 2025.01.07 |
Cypress의 단점을 극복하기 위한 puppeteer 기반의 e2e 테스트 프레임워크 개발(2) (0) | 2024.12.20 |