MapToPoster - 도시 지도를 예술 포스터로 변환하기
(github.com/originalankur)- 전 세계 도시 지도를 미니멀한 예술 포스터로 생성할 수 있는 Python 기반 오픈소스 도구
- OpenStreetMap(OSMnx) 데이터를 활용해 도로, 수로, 공원 등의 지형 요소를 시각화하고, matplotlib으로 렌더링
- 17가지 테마 스타일(예: neon_cyberpunk, blueprint, japanese_ink 등)을 제공하며, JSON 파일로 사용자 정의 테마 추가 가능
- 명령줄에서 도시명과 국가명, 반경, 테마를 지정해 자동으로 포스터 생성 및 저장
- 디자인과 데이터 시각화의 결합을 통해 개발자와 디자이너가 도시 구조를 예술적으로 탐색할 수 있는 도구
프로젝트 개요
-
MapToPoster는 사용자가 지정한 도시의 지도를 기반으로 미니멀한 디자인 포스터를 생성하는 Python 스크립트
- 생성된 포스터는
posters/디렉터리에 자동 저장 - MIT 라이선스로 공개되어 자유로운 수정 및 배포 가능
- 생성된 포스터는
- 저장소는 약 2.7k개의 Star와 164개의 Fork를 보유
주요 기능
- 명령줄 인터페이스(CLI)를 통해 도시명(
--city), 국가명(--country), 테마(--theme), 거리(--distance)를 입력해 포스터 생성 -
--list-themes옵션으로 사용 가능한 모든 테마 목록 확인 가능 - 거리(
distance) 값에 따라 도시 규모별 적정 반경 설정- 4,000–6,000m: 소형 도시
- 8,000–12,000m: 중형 도시
- 15,000–20,000m: 대도시
테마 구성
-
themes/디렉터리에 17개의 테마 JSON 파일 포함- 예시: noir, blueprint, neon_cyberpunk, warm_beige, forest, terracotta 등
- 각 테마는 배경색, 도로 색상, 수면, 공원 등의 색상 속성을 정의
- 사용자는 JSON 형식으로 새로운 테마를 직접 추가 가능
- 예:
"bg": "#FFFFFF","road_primary": "#1A1A1A"등
- 예:
사용 예시
- 다양한 도시와 테마 조합을 통해 포스터 생성 가능
-
python create_map_poster.py -c "Tokyo" -C "Japan" -t japanese_ink -d 15000 -
python create_map_poster.py -c "Barcelona" -C "Spain" -t warm_beige -d 8000 -
python create_map_poster.py -c "Dubai" -C "UAE" -t midnight_blue -d 15000
-
- 예시 포스터로 San Francisco, Venice, Marrakech, Singapore 등의 도시가 포함
내부 구조 및 아키텍처
- 주요 구성 요소는 CLI Parser, Geocoding(Nominatim) , Data Fetching(OSMnx) , Rendering(matplotlib)
- 렌더링 순서(z-order)는 배경 → 수면 → 공원 → 도로 → 그라디언트 → 텍스트
- 주요 함수
-
get_coordinates(): 도시명으로 위도·경도 조회 -
create_poster(): 전체 렌더링 파이프라인 -
get_edge_colors_by_type(): 도로 유형별 색상 지정 -
get_edge_widths_by_type(): 도로 중요도별 두께 설정 -
load_theme(): JSON 테마 로드
-
확장 및 커스터마이징
-
새로운 지도 레이어(예: 철도)를 추가하려면
create_poster()내에서 OSMnx 데이터를 불러와 렌더링 가능 -
새로운 테마 속성을 추가할 경우 JSON과 코드(
load_theme()) 양쪽에 정의 필요 -
글자 배치 규칙
- 도시명: y=0.14
- 국가명: y=0.10
- 좌표: y=0.07
- 출처 표기: y=0.02
성능 최적화 팁
-
dist값이 20km 이상이면 다운로드 속도 저하 및 메모리 사용 증가 - 좌표 캐싱으로 Nominatim 요청 제한 회피
-
network_type='drive'설정 시 렌더링 속도 향상 - 빠른 미리보기용으로
dpi를 150으로 낮출 수 있음
기술 스택 및 라이선스
- Python 100% 로 작성
- 주요 라이브러리: OSMnx, matplotlib, argparse
- MIT License로 배포, 상업적 사용 및 수정 가능
요약
- MapToPoster는 코드 기반 도시 지도 예술화 도구로, 데이터 시각화와 디자인을 결합한 오픈소스 프로젝트
- 개발자, 디자이너, 데이터 시각화 전문가가 도시 구조를 예술적 형태로 탐구할 수 있는 유용한 툴
서울/부산 쪽을 한번 만들어봤는데 괜찮아서 트위터 긱뉴스 계정에 첨부해두었습니다.
서울 : https://x.com/GeekNewsHada/status/2013410000031395905
부산 : https://x.com/GeekNewsHada/status/2013412083749265695
Hacker News 쪽 의견에 언급된 city-roads도 예전에 여기 올라온 적이 있었습니다.
Hacker News 의견들
- 여러 번 사용해본 관련 프로젝트가 있음
city-roads (GitHub)인데, SVG 출력을 지원하고 온라인에서도 바로 시도해볼 수 있음
제작자인 Anvaka는 다른 멋진 데이터 시각화 프로젝트들도 많이 만듦 - 정말 멋진 프로젝트임
다만 거리 파라미터를 조정하는 게 조금 까다로움
개선 아이디어로는 도시 이름 대신 좌표 입력을 받아 특정 지점을 중심으로 설정할 수 있게 하는 것, 그리고 여러 스타일을 한 번에 출력해 시각적으로 고를 수 있게 하는 기능이 있음
어쨌든 훌륭한 작업임 - 샌프란시스코 이미지는 멋지지만, 일부 샘플에서 투영 방식에 문제가 있어 보임
UTM이 아니라 전지구 구면 투영처럼 보여서 지역 렌더링에는 적합하지 않음
README에 projection 언급이 없는 게 조금 의심스러움- 이건 재미있고 예술적인 포스터를 만드는 아트 프로젝트라서 투영 방식이 중요하지 않음
오픈소스이기도 하니, 지도 제작 경험을 살려 pull request로 개선안을 제안해보면 좋을 듯함 - 최종 이미지에 비네팅 효과가 들어가 모서리가 자연스럽게 사라지는 느낌임
아마 OSM 타일을 가져와 이미지 후처리를 한 듯 보임
결과물이 꽤 멋짐
- 이건 재미있고 예술적인 포스터를 만드는 아트 프로젝트라서 투영 방식이 중요하지 않음
- 코드를 잠깐 봤는데, matplotlib 덕분에 약간만 수정하면 SVG 출력이 가능할 것 같음
혹시 PNG를 기본값으로 둔 특별한 이유가 있는지 궁금함- 좋은 지적임.
plt.savefig(output_file, format='svg', facecolor=THEME['bg'])로 해결 가능함
--format파라미터를 추가해서 반영할 예정임 - 큰 도시를 PDF/SVG로 내보내보니 속도가 매우 느림
인구 50만 도시 하나만 해도 엄청 오래 걸림
- 좋은 지적임.
- 이런 이미지를 실제 포스터로 인쇄하려면 어떤 방법이 좋은지 궁금함
- 뉴저지의 El-co Color가 20x30인치 포스터를 저렴하게 인쇄해줌
El-co Color Poster Special - 예전에 이런 지도를 3D 프린트로 입체 지도로 만들어 액자에 넣어주는 서비스도 있었음
- 나는 Vistaprint를 사용함. 비교를 많이 해본 건 아니지만 가격과 품질이 괜찮음
- 직접 해보고 싶다면 Rasterbator.net으로 여러 장을 이어붙여 DIY 포스터를 만들 수 있음
다만 손이 좀 많이 감 - 미국에서는 Staples 인쇄 품질이 꽤 좋았음
- 뉴저지의 El-co Color가 20x30인치 포스터를 저렴하게 인쇄해줌
- 이 저장소는 정말 훌륭함
README는 OSS의 모범 사례로 삼을 만하고, 결과물도 놀라울 정도로 아름다움 -
prettymapp도 함께 살펴보면 좋음
- 그리고 city-roads 웹 버전도 있음
- 동일한 이름의 도시가 여러 곳에 있을 때는 어떻게 되는지 궁금함
예를 들어 Salem(OR/MA), Portland(OR/ME), Springfield(IL/MO), Dallas(TX/GA)처럼 말임- 그냥 "Salem"만 입력하면 임의의 도시를 선택함
"Salem, Oregon"이나 "Salem, MA"처럼 입력하면 원하는 결과를 얻을 수 있고, 입력한 텍스트가 캡션으로 사용됨 - 미국에는 Paris, London, Athens 같은 세계 도시 이름을 딴 도시도 많음
- 그건 생각도 못 했음. 아마 국가까지 입력받는 기능을 추가해야 할 듯함
- 그냥 "Salem"만 입력하면 임의의 도시를 선택함
- 혹시 이 프로젝트가 그래프 기반 접근인지, 아니면 일반적인 이미지 생성인지 궁금함
Picxstudio에서도 비슷한 결과를 본 적 있는데, 거긴 AI 이미지 생성 플랫폼임 - 시드니 도로 지도를 직소 퍼즐로 만들어서 놀면서 도로 구조를 익히고 싶었음
그렇게 하면 내비 앱 의존도를 줄이고 예전식 운전자가 될 수 있을 것 같음- 시드니에서 Where 2가 Google Maps로 발전한 이유가 있음
일방통행 도로가 너무 많고, 항만과 터널 구조가 복잡해서 시드니 길을 익히는 건 평생 과제임
- 시드니에서 Where 2가 Google Maps로 발전한 이유가 있음