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-family | Google 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 Post | 1080 x 1080 | 3.6 x 3.6 |
| Mobile Wallpaper | 1080 x 1920 | 3.6 x 6.4 |
| HD Wallpaper | 1920 x 1080 | 6.4 x 3.6 |
| 4K Wallpaper | 3840 x 2160 | 12.8 x 7.2 |
| A4 Print | 2480 x 3508 | 8.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가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기