見出し画像

地図で作品を作ろう #Python #OpenStreetMap

横浜
京都
横浜、関内
東京湾(横浜周辺)

こんにちは!今回は、Pythonを使ってOpenStreetMap(OSM)のデータを活用し、おしゃれな地図画像を作成する方法をご紹介します。地図データの取得からアート作品のような地図の生成まで、ステップバイステップで解説します。また、横浜市を例に取り上げ、独自のスタイルで地図を作成してみましょう。


OpenStreetMapとは

OpenStreetMap(OSM)は、コミュニティが協力して作成・更新しているフリーで編集可能な世界地図です。地理データはオープンデータとして公開されており、誰でも自由にアクセス・利用することができます。

OSMの特徴と仕様

  • データの自由な利用:OSMのデータはOpen Database Licenseの下で提供されており、商用・非商用を問わず利用可能です。ただし、データの出典を明記する必要があります。

  • タグ付けシステム:OSMでは、地物(道路、建物、水域など)に対してタグを付けることで、詳細な属性情報を保持しています。例えば、`"highway": "residential"`は住宅街の道路を表します。

  • データ構造:OSMのデータは主に以下の3つの要素で構成されています。

    • ノード(Node):ポイントデータ(緯度・経度)

    • ウェイ(Way):ノードを連結した線または多角形(道路や建物の輪郭)

    • リレーション(Relation):ノードやウェイをグループ化したもの(ルートやエリア)

使用するライブラリと環境設定

地図作成には以下のPythonライブラリを使用します。

  • osmnx:OSMのデータを簡単に取得・操作できるライブラリ

  • geopandas:地理空間データの操作を容易にするライブラリ

  • matplotlib:データの可視化・プロットに使用

  • contextily(オプション):背景タイルの追加や座標系の変換に使用

ライブラリのインストール

以下のコマンドで必要なライブラリをインストールします。

pip install osmnx geopandas matplotlib contextily

基本的な地図作成の手順

  1. データの取得:指定した場所や範囲のOSMデータを取得します。

  2. データの加工:取得したデータを必要な地物ごとに分類・フィルタリングします。

  3. スタイリング:地物ごとに色や線の太さ、透明度などのスタイルを設定します。

  4. プロット:matplotlibを使用して地図を描画します。

  5. 保存:作成した地図を画像ファイルとして保存します。

データの取得と操作

1. 場所の指定と境界の取得

まずは、地図を作成したい場所を指定し、その境界データを取得します。

import osmnx as ox

place_name = "東京都千代田区, 日本"
boundaries = ox.geocode_to_gdf(place_name)

2. 地物データの取得

OSMから特定の地物を取得するには、`ox.geometries_from_place()`関数を使用します。

# 建物データ
buildings = ox.geometries_from_place(place_name, tags={'building': True})

# 道路データ
G = ox.graph_from_place(place_name, network_type='drive')
nodes, edges = ox.graph_to_gdfs(G)

3. データのフィルタリング

道路データを種類ごとに分類します。

# 大きな道路
major_roads = edges[edges['highway'].isin(['motorway', 'trunk', 'primary'])]

# 中規模の道路
medium_roads = edges[edges['highway'].isin(['secondary', 'tertiary'])]

# 小さな道路
minor_roads = edges[~edges['highway'].isin(['motorway', 'trunk', 'primary', 'secondary', 'tertiary'])]

地図のスタイリング

各地物に対して色やスタイルを設定します。

# カラーパレットの設定
background_color = "#ffffff"
building_color = "#d3d3d3"
road_color = "#a9a9a9"

# プロットの設定
import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(12, 12))
fig.patch.set_facecolor(background_color)
ax.set_facecolor(background_color)

# 建物の描画
if not buildings.empty:
    buildings.plot(ax=ax, color=building_color, edgecolor=None)

# 道路の描画
if not major_roads.empty:
    major_roads.plot(ax=ax, color=road_color, linewidth=1)

横浜市のおしゃれな地図を作成

それでは、横浜市を例に、おしゃれな地図を作成してみましょう。独自のカラーリングとスタイルを用いて、アート作品のような地図を目指します。

カスタム関数の定義

import osmnx as ox
import matplotlib.pyplot as plt
import geopandas as gpd

def create_yokohama_map(save_path='yokohama_stylish_map.png'):
    """
    横浜市のおしゃれな地図画像を作成します。

    Parameters:
    - save_path (str): 保存する画像ファイルのパス
    """
    # 都市名を指定
    place_name = "横浜市, 神奈川県, 日本"

    # カラー設定(独自のカラーパレットを使用)
    background_color = "#1e1e1e"  # ダークグレーの背景
    water_color = "#4a90e2"       # 明るい青色の水域
    park_color = "#7ed321"        # 鮮やかな緑色の公園
    road_color = "#f5a623"        # オレンジ色の道路
    building_color = "#d0021b"    # 赤色の建物

    # 地図の境界を取得
    boundaries = ox.geocode_to_gdf(place_name)

    # 建物データを取得
    buildings = ox.geometries_from_place(place_name, tags={'building': True})

    # 水域データを取得
    water = ox.geometries_from_place(place_name, tags={'natural': 'water'})

    # 公園データを取得
    parks = ox.geometries_from_place(place_name, tags={'leisure': 'park'})

    # 道路データを取得
    G = ox.graph_from_place(place_name, network_type='drive')
    nodes, edges = ox.graph_to_gdfs(G)

    # プロットの設定
    fig, ax = plt.subplots(figsize=(12, 12))

    # 背景色を設定
    fig.patch.set_facecolor(background_color)
    ax.set_facecolor(background_color)

    # 建物を描画
    if not buildings.empty:
        buildings.plot(ax=ax, color=building_color, edgecolor=None, alpha=0.6)

    # 水域を描画
    if not water.empty:
        water.plot(ax=ax, color=water_color, edgecolor=None, alpha=0.6)

    # 公園を描画
    if not parks.empty:
        parks.plot(ax=ax, color=park_color, edgecolor=None, alpha=0.6)

    # 道路を描画
    if not edges.empty:
        edges.plot(ax=ax, color=road_color, linewidth=0.5, alpha=0.8)

    # 境界線を描画
    boundaries.boundary.plot(ax=ax, color="#ffffff", linewidth=1)

    # 軸をオフにする
    ax.axis('off')

    # 画像を保存
    plt.savefig(save_path, bbox_inches='tight', pad_inches=0, dpi=300, facecolor=fig.get_facecolor())
    plt.close()

    print(f"横浜市のおしゃれな地図が{save_path}に保存されました。")

関数の実行

create_yokohama_map(save_path='yokohama_stylish_map.png')

結果

上記のコードを実行すると、以下の特徴を持つ地図が生成されます。

  • 背景色:ダークグレーで全体を引き締める

  • 建物:赤色で描画し、都市の密度を強調

  • 水域:明るい青色で海や川を表現

  • 公園:鮮やかな緑色で自然エリアを強調

  • 道路:オレンジ色で主要な交通網を示す

  • 境界線:白色で市の境界を明確に

まとめ

PythonとOpenStreetMapのデータを活用することで、自分だけのおしゃれな地図アートを簡単に作成することができます。カラーリングやスタイルを工夫することで、同じ場所でも全く異なる印象の地図を作り出せます。

カスタマイズのポイント

  • 色の選択:配色を変えることで地図の雰囲気を大きく変えることができます。

  • 地物の選択:表示する地物を増やしたり減らしたりして、情報量を調整します。

  • 透明度の調整:`alpha`パラメータで透明度を調整し、重なり合う色の効果を楽しめます。

  • 描画順序:描画する順序を工夫して、重要な情報が上に表示されるようにします。

参考文献


注意:OpenStreetMapのデータを使用する際は、必ず利用規約を確認し、適切なクレジット表記を行ってください。

ぜひ、この記事を参考に自分だけの地図アートを作成してみてください。新しい発見やクリエイティブな表現がきっと見つかるはずです!

この記事が参加している募集