9P by GN⁺ 2일전 | ★ favorite | 댓글 3개
  • 전 세계 도시 지도를 미니멀한 예술 포스터로 생성할 수 있는 Python 기반 오픈소스 도구
  • OpenStreetMap(OSMnx) 데이터를 활용해 도로, 수로, 공원 등의 지형 요소를 시각화하고, matplotlib으로 렌더링
  • 17가지 테마 스타일(예: neon_cyberpunk, blueprint, japanese_ink 등)을 제공하며, JSON 파일로 사용자 정의 테마 추가 가능
  • 명령줄에서 도시명과 국가명, 반경, 테마를 지정해 자동으로 포스터 생성 및 저장
  • 디자인과 데이터 시각화의 결합을 통해 개발자와 디자이너가 도시 구조를 예술적으로 탐색할 수 있는 도구

프로젝트 개요

  • MapToPoster는 사용자가 지정한 도시의 지도를 기반으로 미니멀한 디자인 포스터를 생성하는 Python 스크립트
    • 생성된 포스터는 posters/ 디렉터리에 자동 저장
    • MIT 라이선스로 공개되어 자유로운 수정 및 배포 가능
  • 저장소는 약 2.7k개의 Star164개의 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 (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 인쇄 품질이 꽤 좋았음
  • 이 저장소는 정말 훌륭함
    README는 OSS의 모범 사례로 삼을 만하고, 결과물도 놀라울 정도로 아름다움
  • prettymapp도 함께 살펴보면 좋음
  • 동일한 이름의 도시가 여러 곳에 있을 때는 어떻게 되는지 궁금함
    예를 들어 Salem(OR/MA), Portland(OR/ME), Springfield(IL/MO), Dallas(TX/GA)처럼 말임
    • 그냥 "Salem"만 입력하면 임의의 도시를 선택함
      "Salem, Oregon"이나 "Salem, MA"처럼 입력하면 원하는 결과를 얻을 수 있고, 입력한 텍스트가 캡션으로 사용됨
    • 미국에는 Paris, London, Athens 같은 세계 도시 이름을 딴 도시도 많음
    • 그건 생각도 못 했음. 아마 국가까지 입력받는 기능을 추가해야 할 듯함
  • 혹시 이 프로젝트가 그래프 기반 접근인지, 아니면 일반적인 이미지 생성인지 궁금함
    Picxstudio에서도 비슷한 결과를 본 적 있는데, 거긴 AI 이미지 생성 플랫폼
  • 시드니 도로 지도를 직소 퍼즐로 만들어서 놀면서 도로 구조를 익히고 싶었음
    그렇게 하면 내비 앱 의존도를 줄이고 예전식 운전자가 될 수 있을 것 같음
    • 시드니에서 Where 2가 Google Maps로 발전한 이유가 있음
      일방통행 도로가 너무 많고, 항만과 터널 구조가 복잡해서 시드니 길을 익히는 건 평생 과제임