도시 지도를 예술 포스터로 변환하는 MapToPoster

3 weeks ago 8

  • 전 세계 도시 지도를 미니멀한 예술 포스터로 생성할 수 있는 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는 코드 기반 도시 지도 예술화 도구로, 데이터 시각화와 디자인을 결합한 오픈소스 프로젝트
  • 개발자, 디자이너, 데이터 시각화 전문가가 도시 구조를 예술적 형태로 탐구할 수 있는 유용한 툴

Read Entire Article