본문으로 건너뛰기

© 2026 Molayo

GH Trending릴리즈2026. 05. 17. 21:19

originalankur/maptoposter

요약

이 도구는 전 세계 어느 도시든 아름답고 미니멀한 지도 포스터를 생성하는 Python 스크립트입니다. 사용자는 `--city`와 `--country` 옵션을 사용하여 지오코딩을 기반으로 원하는 위치의 지도를 지정할 수 있습니다. 다양한 옵션(테마, 거리 반경, 이미지 크기 등)과 커스텀 폰트 기능을 제공하여, 특정 목적에 맞는 고품질의 맞춤형 지도 포스터를 제작할 수 있습니다.

핵심 포인트

  • 지오코딩을 활용하여 전 세계 도시와 국가 기반의 미니멀한 지도 포스터 생성 가능
  • 테마(`--theme`) 및 거리 반경(`--distance`) 옵션을 통해 다양한 스타일과 지역적 초점 설정 가능
  • 이미지의 크기(너비/높이)를 인치 단위로 지정하거나, 특정 해상도에 맞게 조정할 수 있음
  • Google Fonts와 커스텀 표시 이름 옵션(`--display-city`, `--display-country`)을 통해 다국어 지원 및 현지화된 텍스트 표현 가능

전 세계 어느 도시든 아름답고 미니멀한 지도 포스터를 생성합니다.

uv가 설치되어 있는지 확인하세요. uv run을 앞에 붙여 스크립트를 실행하면 가상 환경 (Virtual Environment)이 자동으로 생성되고 관리됩니다.

# 첫 실행 시 종속성 (Dependencies)이 자동으로 설치됩니다
uv run ./create_map_poster.py --city "Paris" --country "France"
# 또는 먼저 명시적으로 종속성을 동기화합니다 (잠긴 버전 사용)
...
python -m venv .venv
source .venv/bin/activate # Windows의 경우: .venv\Scripts\activate
pip install -r requirements.txt

uv를 사용하는 경우:

uv run ./create_map_poster.py --city <city> --country <country> [options]

그렇지 않은 경우 (pip + venv):

python create_map_poster.py --city <city> --country <country> [options]

옵션 (Option)약어 (Short)설명 (Description)
--city-c도시 이름 (지오코딩 (Geocoding)에 사용)
--country-C국가 이름 (지오코딩 (Geocoding)에 사용)
옵션 (Option)약어 (Short)설명 (Description)기본값 (Default)
OPTIONAL: --latitude-lat위도 중심점 재설정 (--longitude와 함께 사용)
OPTIONAL: --longitude-long경도 중심점 재설정 (--latitude와 함께 사용)
OPTIONAL: --country-label포스터에 표시될 국가 텍스트 재설정
OPTIONAL: --theme-t테마 이름terracotta
OPTIONAL: --distance-d미터 단위의 지도 반경18000
OPTIONAL: --list-themes사용 가능한 모든 테마 목록 표시
OPTIONAL: --all-themes사용 가능한 모든 테마에 대한 포스터 생성
OPTIONAL: --width-W인치 단위의 이미지 너비12 (최대: 20)
OPTIONAL: --height-H인치 단위의 이미지 높이16 (최대: 20)

Google Fonts의 커스텀 폰트를 사용하여 도시 및 국가 이름을 사용자의 언어로 표시하세요:

옵션 (Option)약어 (Short)설명 (Description)
--display-city-dc도시의 커스텀 표시 이름 (예: "東京")
--display-country-dC국가의 커스텀 표시 이름 (예: "日本")
--font-familyGoogle Fonts 패밀리 이름 (예: "Noto Sans JP")

예시 (Examples):

Japanese

python create_map_poster.py -c "Tokyo" -C "Japan" -dc "東京" -dC "日本" --font-family "Noto Sans JP"

Korean

...

참고 (Note): 폰트는 Google Fonts에서 자동으로 다운로드되어 fonts/cache/에 로컬로 캐싱(cached)됩니다.

.

특정 해상도(resolutions)를 대상으로 하려면 -W-H에 다음 값들을 사용하세요:

대상 (Target)해상도 (Resolution, px)인치 (Inches, -W / -H)
Instagram Post1080 x 10803.6 x 3.6
Mobile Wallpaper1080 x 19203.6 x 6.4
HD Wallpaper1920 x 10806.4 x 3.6
4K Wallpaper3840 x 216012.8 x 7.2
A4 Print2480 x 35088.3 x 11.7
# 기본 테마를 사용한 간단한 사용법 (Simple usage with default theme)
python create_map_poster.py -c "Paris" -C "France"
# 커스텀 테마 및 거리 적용 시
...

도시 이름을 해당 언어의 고유 스크립트(native scripts)로 표시합니다:

# Japanese
python create_map_poster.py -c "Tokyo" -C "Japan" -dc "東京" -dC "日本" --font-family "Noto Sans JP" -t japanese_ink
# Korean
...
# 상징적인 그리드 패턴 (Iconic grid patterns)
python create_map_poster.py -c "New York" -C "USA" -t noir -d 12000 # Manhattan 그리드
python create_map_poster.py -c "Barcelona" -C "Spain" -t warm_beige -d 8000 # Eixample 지구
...
거리 (Distance)적합한 대상 (Best for)
4000-6000m작고 밀집된 도시 (Venice, Amsterdam 중심부)
...

themes/ 디렉토리에 17개의 테마가 준비되어 있습니다:

테마스타일
gradient_roads부드러운 그라데이션 음영 (Smooth gradient shading)
contrast_zones높은 대비의 도시 밀도 (High contrast urban density)
noir순수 검정 배경, 흰색 도로 (Pure black background, white roads)
midnight_blue네이비 배경과 금색 도로 (Navy background with gold roads)
blueprint건축 설계도 미학 (Architectural blueprint aesthetic)
neon_cyberpunk일렉트릭 핑크/시안이 가미된 어두운 스타일 (Dark with electric pink/cyan)
warm_beige빈티지 세피아 톤 (Vintage sepia tones)
pastel_dream부드럽고 차분한 파스텔 톤 (Soft muted pastels)
japanese_ink미니멀리스트 수묵화 스타일 (Minimalist ink wash style)
emerald풍성한 다크 그린 미학 (Lush dark green aesthetic)
forest짙은 녹색과 세이지 색상 (Deep greens and sage)
ocean해안 도시를 위한 블루와 틸 색상 (Blues and teals for coastal cities)
terracotta지중해의 따스함 (Mediterranean warmth)
sunset따뜻한 오렌지와 핑크 (Warm oranges and pinks)
autumn계절감이 느껴지는 번트 오렌지와 레드 (Seasonal burnt oranges and reds)
copper_patina산화된 구리 미학 (Oxidized copper aesthetic)
monochrome_blue단일 블루 색상 계열 (Single blue color family)

포스터는 다음 형식으로 posters/ 디렉토리에 저장됩니다:

{city}_{theme}_{YYYYMMDD_HHMMSS}.png

themes/ 디렉토리에 JSON 파일을 생성하세요:

{
"name": "My Theme",
"description": "Description of the theme",
...
}
map_poster/
├── create_map_poster.py # 메인 스크립트 (Main script)
├── font_management.py # 폰트 로딩 및 Google Fonts 통합 (Font loading and Google Fonts integration)
...

스크립트를 확장하거나 수정하려는 기여자들을 위한 빠른 참조 가이드입니다.

  • 버그 수정 (Bug fixes)은 언제나 환영합니다
  • 사용자 인터페이스 (web/desktop)는 제출하지 마세요
  • 현재로서는 Docker화 (Dockerize) 하지 마세요
  • 만약 코드를 수정(vibe code)했다면, 반드시 테스트를 거쳐 포스터의 이전 버전과 이후 버전을 비교해 보세요
  • 큰 기능을 시작하기 전에는 Discussions/Issue에서 병합(merge) 가능 여부를 먼저 문의해 주세요
┌─────────────────┐ ┌──────────────┐ ┌─────────────────┐
│ CLI Parser │────▶│ Geocoding │────▶│ Data Fetching │
│ (argparse) │ │ (Nominatim) │ │ (OSMnx) │
...
함수 (Function)목적 (Purpose)수정 시점 (Modify when...)
get_coordinates()Nominatim을 통해 도시(City) → 위도/경도(lat/lon) 변환지오코딩 (Geocoding) 제공자 변경 시
create_poster()메인 렌더링 파이프라인 (Main rendering pipeline)새로운 지도 레이어 (Map layers) 추가 시
get_edge_colors_by_type()OSM highway 태그에 따른 도로 색상 결정도로 스타일링 (Road styling) 변경 시
get_edge_widths_by_type()중요도에 따른 도로 너비 결정선 굵기 (Line weights) 조정 시
create_gradient_fade()상단/하단 페이드 효과 (Fade effect)그라데이션 오버레이 (Gradient overlay) 수정 시
load_theme()JSON 테마 → 딕셔너리 (dict) 로드새로운 테마 속성 (Theme properties) 추가 시
is_latin_script()타이포그래피 (Typography)를 위한 스크립트 감지새로운 스크립트 지원 시
load_fonts()커스텀/기본 폰트 로드폰트 로딩 로직 변경 시
z=11 텍스트 라벨 (도시, 국가, 좌표)
z=10 그라데이션 페이드 (상단 및 하단)
z=3 도로 (ox.plot_graph를 통해)
...
# get_edge_colors_by_type() 및 get_edge_widths_by_type() 내부
motorway, motorway_link → 가장 두껍게 (1.2), 가장 어둡게
trunk, primary → 두껍게 (1.0)
...

스크립트는 적절한 타이포그래피 (Typography)를 적용하기 위해 텍스트 스크립트를 자동으로 감지합니다:

라틴 스크립트 (Latin scripts) (영어, 프랑스어, 스페인어 등): 우아한 "P A R I S" 효과를 위해 자간 (Letter spacing) 적용
비라틴 스크립트 (Non-Latin scripts) (일본어, 아랍어, 태국어, 한국어 등): "東京"와 같이 자연스러운 간격 (문자 사이 간격 없음)

스크립트 감지는 유니코드 범위 (라틴의 경우 U+0000-U+024F)를 사용합니다. 알파벳 문자의 80% 이상이 라틴어인 경우 자간이 적용됩니다.

새로운 지도 레이어 (예: 철도):

# create_poster() 내부, 공원(parks) 페치(fetch) 이후:
try:
    railways = ox.features_from_point(point, tags={'railway': 'rail'}, dist=dist)
...

새로운 테마 속성:

  • 테마 JSON에 추가:
    "railway": "#FF0000"

  • 코드에서 사용:
    THEME['railway']

  • load_theme()의 기본 딕셔너리 (default dict)에 폴백 (Fallback) 추가

모든 텍스트는 transform=ax.transAxes를 사용합니다

(0-1 정규화된 좌표):

y=0.14 도시 이름 (라틴 스크립트의 경우 자간 적용)
y=0.125 장식선
y=0.10 국가 이름
...

모든 건물 가져오기

buildings = ox.features_from_point(point, tags={'building': True}, dist=dist)

특정 편의시설 (amenities) 가져오기

...


  • dist

값 (>20km) = 느린 다운로드 + 높은 메모리 사용량 - Nominatim 속도 제한 (rate limits)을 피하기 위해 좌표를 로컬에 캐싱 (Cache) 하세요

  • 더 빠른 렌더링 (renders)을 위해 'all' 대신
    network_type='drive'

를 사용하세요 - 빠른 미리보기를 위해
dpi

를 300에서 150으로 낮추세요

AI 자동 생성 콘텐츠

본 콘텐츠는 GitHub Trending Python (daily)의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
1

댓글

0