
2026/01/17 19:13
**マップをポスターへ – お気に入りの都市をアートで表現**
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
要約
本プロジェクトは、世界中の任意の都市に対してミニマリストな地図ポスターを生成する軽量 Python ユーティリティです。
create_map_poster.py を実行すると OSMnx で OpenStreetMap データを取得し、Matplotlib で描画し、17 個組み込みテーマ(例:feature_based、contrast_zones、noir、midnight_blue、blueprint、neon_cyberpunk、warm_beige、pastel_dream、japanese_ink、forest、ocean、terracotta、sunset、autumn、copper_patina、monochrome_blue)または themes/ 内に JSON で定義されたカスタムテーマを適用します。CLI オプションには
--city、--country、--theme、--distance(デフォルト 29 000 m;推奨範囲:小規模/密集都市は 4–6 km、中規模ダウンタウンは 8–12 km、大規模メトロは 15–20 km)および --list-themes が含まれます。ポスターは
posters/ ディレクトリに {city}_{theme}_{YYYYMMDD_HHMMSS}.png の形式で保存されます。テーマは背景色(
bg)、文字色(text)、グラデーションカラー、水、公園、および道路のカラーコードなどのプロパティを指定します。レイヤーは z‑order で描画されます:背景 → 水 → 公園 → 道路 → グラデーションフェード → 文字ラベル。道路スタイリングは get_edge_colors_by_type() と get_edge_widths_by_type() により処理され、OSM 高速道路タグを適切な色と線幅にマッピングします(motorway → 最も太い、residential → 最も細い)。CLI はアイコニックなグリッドパターン、水辺・運河、放射状パターン、有機的な古市街地、沿岸都市、および川都市用の具体的なテーマ/距離設定を備えた例コマンドをサポートします。
将来的には鉄道など新しいレイヤーの追加、よりリッチなテーマプロパティ、または性能向上(座標キャッシュ、
network_type='drive' の使用、クイックプレビュー用 DPI 減少等)の可能性があります。
意味すること: デザイナー、ホビエスト、および企業はマーケティング、観光、都市計画プロジェクト向けにブランド化された再現可能な地図ビジュアルを迅速に生成できます。
本文
City Map Poster Generator(都市マップポスター生成器)
世界中の任意の都市に対して、美しくミニマリスティックな地図ポスターを作成します。
例
| 国 | 都市 | テーマ |
|---|---|---|
| USA | サン フランシスコ | sunset |
| Spain | バルセロナ | warm_beige |
| Italy | ベニス | blueprint |
| Japan | 東京 | japanese_ink |
| India | ムンバイ | contrast_zones |
| Morocco | マラケシュ | terracotta |
| Singapore | シンガポール | neon_cyberpunk |
| Australia | メルボルン | forest |
| UAE | ドバイ | midnight_blue |
インストール
pip install -r requirements.txt
使い方
python create_map_poster.py --city <city> --country <country> [options]
オプション一覧
| オプション | 短縮形 | 説明 | デフォルト |
|---|---|---|---|
| | 都市名 | 必須 |
| | 国名 | 必須 |
| | テーマ名 | feature_based |
| | 地図半径(メートル) | 29000 |
| – | 利用可能なテーマを一覧表示 | – |
例
# アイコニックな格子パターン python create_map_poster.py -c "New York" -C "USA" -t noir -d 12000 # マンハッタンのグリッド python create_map_poster.py -c "Barcelona" -C "Spain" -t warm_beige -d 8000 # エイサンプレ区 # 水辺と運河 python create_map_poster.py -c "Venice" -C "Italy" -t blueprint -d 4000 # 運河ネットワーク python create_map_poster.py -c "Amsterdam" -C "Netherlands" -t ocean -d 6000 # 同心円運河 python create_map_poster.py -c "Dubai" -C "UAE" -t midnight_blue -d 15000 # パームと海岸線 # 放射状パターン python create_map_poster.py -c "Paris" -C "France" -t pastel_dream -d 10000 # ホーサマンのブールバルド python create_map_poster.py -c "Moscow" -C "Russia" -t noir -d 12000 # リングロード # 有機的古都 python create_map_poster.py -c "Tokyo" -C "Japan" -t japanese_ink -d 15000 # 密集した有機街道 python create_map_poster.py -c "Marrakech" -C "Morocco" -t terracotta -d 5000 # メディナ迷路 python create_map_poster.py -c "Rome" -C "Italy" -t warm_beige -d 8000 # 古代レイアウト # 海岸都市 python create_map_poster.py -c "San Francisco" -C "USA" -t sunset -d 10000 # 半島グリッド python create_map_poster.py -c "Sydney" -C "Australia" -t ocean -d 12000 # ハーバーシティ python create_map_poster.py -c "Mumbai" -C "India" -t contrast_zones -d 18000 # 海岸半島 # 川都市 python create_map_poster.py -c "London" -C "UK" -t noir -d 15000 # テムズ曲線 python create_map_poster.py -c "Budapest" -C "Hungary" -t copper_patina -d 8000 # ドナウ分割 # 利用可能なテーマ一覧を表示 python create_map_poster.py --list-themes
距離ガイド
| 距離(m) | 推奨用途 |
|---|---|
| 4000–6000 | 小規模/密集都市(ベニス、アムステルダム中心部) |
| 8000–12000 | 中規模都市・中心街域に焦点を当てる(パリ、バルセロナ) |
| 15000–20000 | 大都市圏全体のビュー(東京、ムンバイ) |
テーマ
themes/ ディレクトリには 17 のテーマが用意されています。
| テーマ | スタイル説明 |
|---|---|
| feature_based | 路線階層を示すクラシックな黒白 |
| gradient_roads | 滑らかなグラデーション塗りつぶし |
| contrast_zones | 高コントラストの都市密度 |
| noir | 黒背景に白い道路 |
| midnight_blue | ネイビーバックで金色道路 |
| blueprint | 建築図面風 |
| neon_cyberpunk | ダークベースに電気ピンク/シアン |
| warm_beige | ビンテージのセピアトーン |
| pastel_dream | ソフトな淡いパステル |
| japanese_ink | ミニマリストの墨絵風 |
| forest | 深い緑と鼠色 |
| ocean | ブルー/ティールで海岸都市に最適 |
| terracotta | 地中海風温かみ |
| sunset | 暖かなオレンジ&ピンク |
| autumn | 焼き焦げたオレンジ・赤の季節感 |
| copper_patina | 酸化銅風 |
| monochrome_blue | 単色系の青 |
出力
ポスターは
posters/ ディレクトリに以下の形式で保存されます。
{city}_{theme}_{YYYYMMDD_HHMMSS}.png
カスタムテーマを追加する
themes/ ディレクトリ内に JSON ファイルを作成します。例:
{ "name": "My Theme", "description": "Description of the theme", "bg": "#FFFFFF", "text": "#000000", "gradient_color": "#FFFFFF", "water": "#C0C0C0", "parks": "#F0F0F0", "road_motorway": "#0A0A0A", "road_primary": "#1A1A1A", "road_secondary": "#2A2A2A", "road_tertiary": "#3A3A3A", "road_residential": "#4A4A4A", "road_default": "#3A3A3A" }
プロジェクト構成
map_poster/ ├── create_map_poster.py # メインスクリプト ├── themes/ # テーマ JSON ファイル群 ├── fonts/ # Roboto フォントファイル ├── posters/ # 生成されたポスター └── README.md
ハッカーズガイド
アーキテクチャ概要
┌─────────────────┐ ┌──────────────┐ ┌─────────────────┐ │ CLI Parser │────▶│ Geocoding │────▶│ Data Fetching │ │ (argparse) │ │ (Nominatim) │ │ (OSMnx) │ └─────────────────┘ └──────────────┘ └─────────────────┘ │ ┌──────────────┐ ▼ │ Output │◀────┌─────────────────┐ │ (matplotlib)│ │ Rendering │ └──────────────┘ │ (matplotlib) │ └─────────────────┘
主な関数
| 関数 | 目的 | 修正時 |
|---|---|---|
| Nominatim による都市 → 緯度/経度取得 | 地理情報プロバイダー変更時 |
| メイン描画パイプライン | 新しいマップレイヤー追加時 |
| OSM 高速道路タグ別の色付け | 道路スタイル変更時 |
| 重要度別道路幅 | 線幅調整時 |
| 上下のフェード効果 | グラデーションオーバーレイ変更時 |
| JSON テーマ → dict | 新しいテーマプロパティ追加時 |
描画レイヤー(z‑order)
- z=11 ラベル(都市名・国名・座標)
- z=10 グラデーションフェード(上部&下部)
- z=3 道路 (
)ox.plot_graph - z=2 公園(緑色ポリゴン)
- z=1 水域(青色ポリゴン)
- z=0 背景色
道路階層(OSM Highway タイプ)
| タイプ | 幅 | 色 |
|---|---|---|
| motorway, motorway_link | 1.2 | 最も濃い |
| trunk, primary | 1.0 | 中間 |
| secondary | 0.8 | 明るめ |
| tertiary | 0.6 | 更に明るい |
| residential, living_street | 0.4 | 最も薄い |
新機能を追加する例(鉄道)
# create_poster() 内、パーク取得後に追加: try: railways = ox.features_from_point(point, tags={'railway': 'rail'}, dist=dist) except Exception: railways = None # 道路より前に描画: if railways is not None and not railways.empty: railways.plot(ax=ax, color=THEME['railway'], linewidth=0.5, zorder=2.5)
テーマ JSON に
"railway": "#FF0000" を追加してください。
タイポグラフィ配置
全テキストは
transform=ax.transAxes(正規化 0–1)で描画します。
都市名(字間を空ける)y = 0.14
装飾線y = 0.125
国名y = 0.10
座標y = 0.07
著作権表示(右下)y = 0.02
OSMnx の便利パターン
# 全建物を取得 buildings = ox.features_from_point(point, tags={'building': True}, dist=dist) # 特定のアメニティ cafes = ox.features_from_point(point, tags={'amenity': 'cafe'}, dist=dist) # ネットワークタイプ別 G_drive = ox.graph_from_point(point, dist=dist, network_type='drive') G_bike = ox.graph_from_point(point, dist=dist, network_type='bike') G_walk = ox.graph_from_point(point, dist=dist, network_type='walk')
パフォーマンスのヒント
が 20 km を超えるとダウンロード速度が遅く、メモリ使用量も増加します。dist- Nominatim のレート制限を回避するために座標はローカルにキャッシュしておくと便利です。
の代わりに'all'
を使うと描画速度が向上します。network_type='drive'- プレビュー用には DPI を 300 から 150 に下げると高速になります。