ハクソク

世界を動かす技術を、日本語で。

地図からポスターへ – お気に入りの都市のアートを作成する

概要

このツールは世界中の都市地図ポスターをミニマルで美しいデザインで自動生成するPythonスクリプト。
テーマ選択や範囲調整が可能で、都市ごとに異なるスタイルを楽しめる。
カスタムテーマ追加新機能拡張も柔軟に対応。
出力ポスターはPNG形式で保存され、すぐに印刷や共有が可能。
開発者向けガイドも充実し、機能追加やカスタマイズが容易。

City Map Poster Generator 概要

  • 任意の都市名・国名を指定して地図ポスター自動生成
  • テーマ選択による多様なビジュアル表現
  • 範囲(半径)指定で詳細度や表示範囲を調整
  • 出力ファイルはPNG形式でposters/ディレクトリに自動保存
  • pipで依存パッケージ一括インストール(requirements.txt)

インストール手順

  • 必要パッケージのインストール
    • pip install -r requirements.txt コマンド利用

基本的な使い方

  • コマンドラインから実行
    • python create_map_poster.py --city <都市名> --country <国名> [オプション]
  • 主なオプション
    • --city / -c: 都市名(必須)
    • --country / -C: 国名(必須)
    • --theme / -t: テーマ名(例: noir, sunset など)
    • --distance / -d: 半径(メートル単位、例: 12000)
    • --list-themes: 利用可能なテーマ一覧表示

使用例

  • グリッド都市
    • python create_map_poster.py -c "New York" -C "USA" -t noir -d 12000
  • 運河都市
    • python create_map_poster.py -c "Venice" -C "Italy" -t blueprint -d 4000
  • 湾岸都市
    • python create_map_poster.py -c "San Francisco" -C "USA" -t sunset -d 10000
  • 有機的な旧市街
    • python create_map_poster.py -c "Marrakech" -C "Morocco" -t terracotta -d 5000

距離ガイド

  • 4000-6000m: 小規模/高密度都市向け(例: Venice, Amsterdam中心部)
  • 8000-12000m: 中規模都市やダウンタウン中心
  • 15000-20000m: 大都市全景(例: Tokyo, Mumbai)

テーマ一覧(themes/ ディレクトリ内)

  • 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: 青系単色

カスタムテーマ追加方法

  • 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パーサー(argparse)
    • コマンドライン引数解析
  • ジオコーディング(Nominatim)
    • 都市名→緯度経度変換
  • データ取得(OSMnx)
    • OpenStreetMapデータ取得
  • レンダリング・出力(matplotlib)
    • 地図描画と画像出力

主要関数

  • get_coordinates(): 都市名から緯度経度取得
  • create_poster(): ポスター描画パイプライン
  • get_edge_colors_by_type(): 道路種別ごとの色指定
  • get_edge_widths_by_type(): 道路種別ごとの線幅指定
  • create_gradient_fade(): 上下グラデーション効果
  • load_theme(): JSONテーマ読込

レイヤー構成(z-order)

  • z=11: テキストラベル(都市名、国名、座標)
  • z=10: グラデーションフェード
  • z=3: 道路
  • z=2: 公園(緑ポリゴン)
  • z=1: 水域(青ポリゴン)
  • z=0: 背景色

OSM道路種別と階層

  • motorway, motorway_link: 最太・最暗(1.2)
  • trunk, primary: 太(1.0)
  • secondary: 中(0.8)
  • tertiary: 細(0.6)
  • residential, living_street: 最細・最明(0.4)

新機能追加例

  • **新レイヤー(鉄道等)**追加
    • parks取得後にrailways取得・描画処理を追加
    • テーマJSONにrailway色追加
  • 新テーマプロパティ追加
    • テーマJSON・load_theme()・描画コードに追記

タイポグラフィ・配置

  • 全テキスト: 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)
  • ネットワーク種別切替
    • network_type='drive': 道路のみ
    • network_type='bike': 自転車道
    • network_type='walk': 歩行者道

パフォーマンスTips

  • 20km超の範囲はダウンロード・描画が重くなる
  • 座標キャッシュでNominatim制限回避
  • **network_type='drive'**利用で高速化
  • dpi300→150でプレビュー高速化

このツールは地図デザイン愛好家・都市研究者・デザイナーに最適な自動ポスター生成ソリューション。
カスタマイズ性・拡張性も高く、コードを追記するだけで新しい都市表現やテーマ追加が可能。
美しい都市地図ポスターを手軽に作成・印刷・共有できる実用的なPythonプロジェクト。

Hackerたちの意見

確認したところ、matplotlibを使ってるおかげで、ちょっとした調整で画像をSVG形式で出力できるはずなんだけど?PNGにデフォルトしてる理由って何かあるのかな?
確かにその通りだね。`plt.savefig(output_file, format='svg', facecolor=THEME['bg'])` でいけるはず。`--format` パラメータを追加して、変更するよ。
大都市をPDF/SVGにエクスポートするのはめっちゃ遅い!50万人以上の都市のをパッチ当ててやってみたけど、信じられないくらい遅いわ(笑)
それは素晴らしいね!シドニーの道路地図でジグソーパズルを作りたいと思ってたんだ。楽しみながら道路の配置に慣れられるし、ナビアプリへの依存を減らして、昔ながらのドライバーになれるかも。
シドニーで「Where 2 -> Google Maps」が生まれた理由があるよ。一方通行の道路の多さ、港の存在、複雑なトンネルシステムが絡み合って、シドニーのナビゲーションを身につけるのは一生かかる作業だね。
チェコ人やプラハが好きで、ローカルにスクリプトを設定したくない人のためのランダムなテーマ3つだよ: https://imgur.com/a/Ovg8mDW
美しいね!金色とダークカラーの組み合わせがいい感じ。
ジズコフスカタワーのハイライトはどういうこと?
それと、prettymappもチェックしてみてね。 https://prettymapp.streamlit.app/
https://anvaka.github.io/city-roads
Etsyの出品者たち、ショック受けてるね。
サンフランシスコ、いい感じだけど、サンプル画像のプロジェクションに問題があるみたい。UTMじゃなくて、グローバルスフィアプロジェクションになってるっぽい。ローカルレンダリングには向いてないよね。「プロジェクション」って言葉がReadmeに書かれてないのも怪しい。
これは楽しくてアートなポスターを作るためのアートプロジェクトだから、地図のプロジェクションが作品にとって重要じゃないのは全然「怪しい」ことじゃないよ。オープンソースみたいだから、地図の経験を活かして改善案をプルリクエストとして出してみたら?
最終的な画像には、コーナーや外側のエッジがフェードアウトするようなビネット効果があるみたい。おそらくOSMタイルを使って、画像処理をしてるんだろうね。見た目がいい感じ!
こういう画像からポスターを実際に印刷する方法、誰かおすすめある?
配送してくれる良いオンデマンド印刷サービスってある?
アメリカでは、Staplesで良い結果が出たよ。
dotphoto.com
DIYなら、Rasterbator.netを使えば、ポスターサイズの印刷を複数のシートで作れるよ。印刷を組み立てるにはちょっと手間がかかるけどね。
参考までに、私はVistaprintを使ってる。これは広範な比較に基づいてるわけじゃなくて、単にいつも上手くいくし、他のサービスと比べても価格や品質が同じくらいに感じるから。
同じ名前の都市が複数ある場合はどうなるんだろう?アメリカ特有の問題かもしれないけど、他の州に同じ名前の都市がある州がたくさんあるんだ。例えば、サレム(オレゴン州)とサレム(マサチューセッツ州)、ポートランド(オレゴン州)とポートランド(メイン州)、スプリングフィールド(イリノイ州)とスプリングフィールド(ミズーリ州)、ダラス(テキサス州)とダラス(ジョージア州)とか。
世界の都市にちなんで名付けられたアメリカの都市については、話が尽きないよね:パリ、ミュンスター、ロンドン、トレド、メンフィス、アテネ、…
笑、全然考えもしなかったわ。国も考慮に入れた方がいいかもね。エッジケースだし :-p
もし「Salem」ってだけ入力すると、適当に一つ選んじゃうよ。でも「Salem, Oregon」とか「Salem, MA」って入力すると、ちゃんと欲しい結果が出るよ(少なくとも試した限りではね)。それから、入力したテキストがキャプションとして使われるよ。
いくつか使った関連プロジェクトがあるよ:https://github.com/anvaka/city-roads 追記:SVGを出力して、オンラインで試すこともできる。Anvaka(作者)は他にもすごくクールなデータビジュアライゼーションプロジェクトを持ってるよ。
すごい!生成した後、その超高解像度の画像をどこで高品質の写真プリントにして額に入れられるかな?