>_ DevTrendsja

言語

ホーム

言語

セクション

フロントエンド バックエンド モバイル DevOps AI / ML ゲーム開発 ブロックチェーン 組み込み セキュリティ
Python

OpenStreetMapのデータをポスターに変えるprettymaps

時には、見るだけで楽しいライブラリに出会うことがあります。複雑なエンタープライズの課題を解決したり、ビルドを10倍高速化したりするのではなく、地理データを取得して、額縁に入れて壁に掛けたくなるようなグラフィックに変換してくれるライブラリです。

約3年前、ソフトなパステルカラーのベクター円形都市マップがRedditとHacker Newsでバイラルになりました。この美的スタイルは、ブラジルの開発者Marcelo Pratsによる小さなスクリプトで作成されたものであることが判明しました。このプロジェクトはprettymapsと呼ばれています。

内部構造

このライブラリはシンプルなツールスタックで構築されています。osmnxを使用してOpenStreetMapから生データを取得し、shapelyでポリゴンジオメトリを処理し、おなじみのmatplotlibで最終的なコンポジションをレンダリングします。プロッター用のベクターアウトラインの準備には、著者はvsketchも使用しています。

レイヤーの手動エクスポート、道路・河川・建物のタグのフィルタリング、投影の設定、matplotlib軸スタイルとの格闘するのではなく、住所または座標を渡すだけで完成した рисунокが 得られます。

クイックスタートは本当にこの通りです:

import prettymaps

plot = prettymaps.plot('Stad van de Zon, Heerhugowaard, Netherlands')

1つの関数呼び出しで、対象領域のデータをダウンロードし、レイヤーに分割して、プロットを構築します。

マップをカスタマイズする方法

ライブラリの真の柔軟性は、draw関数の微調整オプションに表れます。

最もよく使うパラメータは以下の通りです:

  • layersはOpenStreetMapレイヤーの辞書を定義します。ここではオブジェクトを選択するためのタグを設定します:水域(natural=water)、建物(building=True)、公園、さまざまなカテゴリの道路、または鉄道線路です。
  • styleは各レイヤーのレンダリングルールを設定します。おなじみのmatplotlibパラメータを受け取ります:塗りつぶし色(fc)、ストローク色(ec)、線幅(lw)、そして готовые カラーパレット(palette)。
  • circleradiusdilateはキャンバスの境界を制御します。指定半径のメートル単位でマップを完璧な円形に切り抜くか、長方形のまま残すことができます。
  • presetは готовые スタイル設定(たとえば、rosaflopmeekmouthなど)を読み込むため、カラースキームをゼロから構築する必要がありません。

特定の場所を構成する例:

plot = prettymaps.plot(
    'Praça Ferreira do Amaral, Macau',
    circle=True,
    radius=1100,
    layers={
        "water": {"tags": {"natural": ["water", "bay"]}},
        "building": {"tags": {"building": True}},
    },
    style={
        "water": {"fc": "#a1e3ff", "ec": "#2F3737"},
        "building": {"palette": ["#FFC857", "#E9724C", "#C5283D"]},
    },
)

この関数はPlot dataclassオブジェクトを返します。内部には各レイヤーのGeoDataFrame(layers)、およびmatplotlibのfigaxオブジェクトへの参照が含まれています。標準のPythonプロットメソッドを使用して独自の注釈、マーカー、ラベルを追加したい場合に便利です。

コードを書かずに実行する方法

コードを書くのが面倒,或者想快速点击不同的调色板 для разных городов、репозиторийにはstreamlitで構築された готовый веб-интерфейсが含まれています。

パッケージのインストール:

pip install prettymaps

インターフェース запуска:

streamlit run app.py

インタラクティブな実験のために、著者はmarimo(Jupyterの現代的な代替品)の готовый ノートブックを用意しました。コマンドmarimo run notebook.pyでローカルに開くか、ドキュメント内のリンクからGoogle Colabで直接実行できます。

実践的なユースケース

最初に思いつくアプリケーションは、ジェネラティブアートとマーchandiseです。出身都市、近隣、または思い出の場所のマップをミニマリストスタイルで作成すると、ポスター、絵葉書、Tシャツに最適です。ライブラリはベクターアウトラインのエクスポートをサポートしているため、グラフィックをペンプロッターや彫刻機に送ることができます。

2番目のシナリオは、レポートとプレゼンテーションのデザインです。都市研究、公交Accessibilityの分析、または不動産ダッシュボードを作成している場合、標準のマップタイルはしばしばごちゃごちゃして見えます。ここでは都市ブロックと水域のアウトラインのみを保持し、ブランドの色で厳密に着色することができます。

ライセンスと重要な注意点

プロジェクトには、採用する前に 알아야 할 몇 가지 사항이 있습니다.

コードはGNU AGPL v3.0ライセンスの下で配布されています。これには義務が伴います:ネットワークサービスのバックエンドでライブラリを使用する場合は、そのサービスをオープンソース化する必要があります。

画像をエクスポートする場合は、OpenStreetMapとリポジトリ自体への帰属を維持する必要があります—これは地理データライセンスの直接の要件です。リポジトリの著者はまた、NFTの 판매에自分のジェネレーターを使用することに принципиально 反対しており、これをREADMEで具体的に強調しています。

試してみる価値はあるか

このライブラリは見事にその仕事を果たします。IllustratorやQGISで手動作業なしに美しい都市マップを作成する必要がある場合、prettymapsは数時間の作業を節約してくれます。

始めるには、pipでパッケージをインストールし、Colabのいくつかの例を 通して実行するだけです。プロジェクトはPython 3.11+で動作し、OSM API経由でデータを確実に取得し、予測可能な結果を 生成します。

関連プロジェクト