地図で作品を作ろう #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
基本的な地図作成の手順
データの取得:指定した場所や範囲のOSMデータを取得します。
データの加工:取得したデータを必要な地物ごとに分類・フィルタリングします。
スタイリング:地物ごとに色や線の太さ、透明度などのスタイルを設定します。
プロット:matplotlibを使用して地図を描画します。
保存:作成した地図を画像ファイルとして保存します。
データの取得と操作
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のデータを使用する際は、必ず利用規約を確認し、適切なクレジット表記を行ってください。
ぜひ、この記事を参考に自分だけの地図アートを作成してみてください。新しい発見やクリエイティブな表現がきっと見つかるはずです!