- 世界中の都市地図をミニマルなアートポスターとして生成できる Python ベースのオープンソースツール
- OpenStreetMap(OSMnx) のデータを活用して、道路、水域、公園などの地形要素を可視化し、matplotlib でレンダリング
- 17種類のテーマスタイル(例: neon_cyberpunk, blueprint, japanese_ink など)を提供し、JSON ファイルでカスタムテーマを追加可能
- コマンドラインで都市名、国名、半径、テーマを指定してポスターを自動生成・保存
- デザインとデータ可視化の融合により、開発者やデザイナーが都市構造を芸術的に探索できるツール
プロジェクト概要
- MapToPoster は、ユーザーが指定した都市の地図をもとにミニマルデザインのポスターを生成する Python スクリプト
- 生成されたポスターは
posters/ ディレクトリに自動保存
- MIT ライセンスで公開されており、自由に修正・配布可能
- リポジトリは約2.7k Starと164 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 は、コードベースの都市地図アート化ツールとして、データ可視化とデザインを組み合わせたオープンソースプロジェクト
- 開発者、デザイナー、データ可視化の専門家が、都市構造を芸術的な形で探求できる便利なツール
3件のコメント
ソウル/釜山のものを試しに作ってみたところ、なかなか良かったので Twitter の GeekNews アカウントに添付しておきました。
ソウル : https://x.com/GeekNewsHada/status/2013410000031395905
釜山 : https://x.com/GeekNewsHada/status/2013412083749265695
Hacker News 側の意見で言及されていた city-roads も、以前ここに掲載されたことがありました。
Hacker News のコメント
city-roads (GitHub) で、SVG 出力をサポートしており、オンラインでもすぐ試せる
作者の Anvaka は、他にも素晴らしい データ可視化プロジェクトをたくさん作っている
ただ、距離パラメータの調整が少し難しい
改善案としては、都市名の代わりに 座標入力を受け付けて特定の地点を中心に設定できるようにすること、そして複数のスタイルを一度に出力して見た目で選べるようにする機能がある
いずれにせよ素晴らしい仕事
UTM ではなく全球的な球面投影のように見えるので、ローカルなレンダリングには適していない
README に projection への言及がないのが少し気になる
しかもオープンソースなのだから、地図作成の経験を生かして pull request で改善案を提案してみるとよさそう
おそらく OSM タイルを取り込んで画像後処理をしたのだと思う
仕上がりはかなり良い
もし PNG をデフォルトにしている特別な理由があるのか気になる
plt.savefig(output_file, format='svg', facecolor=THEME['bg'])で解決できる--formatパラメータを追加して反映する予定人口 50 万の都市 1 つでもとてつもなく時間がかかる
El-co Color Poster Special
ただし、かなり手間はかかる
README は OSS の模範事例といえるし、成果物も驚くほど美しい
たとえば Salem (OR/MA)、Portland (OR/ME)、Springfield (IL/MO)、Dallas (TX/GA) のようなケース
"Salem, Oregon" や "Salem, MA" のように入力すれば望みどおりの結果が得られ、入力したテキストが キャプションとして使われる
Picxstudio でも似たような結果を見たことがあるが、あちらは AI 画像生成プラットフォームだ
そうすればナビアプリへの依存を減らして、昔ながらのドライバーになれそう
一方通行の道路が非常に多く、港湾やトンネルの構造も複雑なので、シドニーの道を覚えるのは一生の課題だ