はじめに

地理空間データの分析は、都市計画、環境科学、マーケティングなど、さまざまな分野で重要な役割を果たしています。Pythonには、地理空間データを効率的に扱うためのライブラリが豊富に揃っており、その中でもGeoPandasFoliumは強力なツールです。この記事では、これらのライブラリを使って、地理空間データを処理し、地図上にビジュアライゼーションする方法を紹介します。

GeoPandasとは?

GeoPandasは、Pythonのデータ分析ライブラリであるPandasの拡張機能として、地理空間データを操作するためのツールを提供します。これにより、シェープファイルなどの地理データをPandasのデータフレーム形式で扱えるようになり、地理空間データの読み込み、解析、可視化が容易に行えます。

GeoPandasのインストール

GeoPandasは、pipまたはcondaを使って簡単にインストールできます。

pip install geopandas

また、GeoPandasは内部でGDALなどの依存関係を使用するため、場合によっては環境構築が必要になることがあります。Anaconda環境では、以下のコマンドで簡単にセットアップできます。

conda install -c conda-forge geopandas

地理データの読み込みと操作

GeoPandasを使って、まずはシェープファイルなどの地理データを読み込み、基本的な操作を行います。

データの読み込み

GeoPandasでは、geopandas.read_file()を使って、シェープファイルやGeoJSONファイルなどを簡単に読み込むことができます。ここでは、世界各国の境界線データを例に進めます。

import geopandas as gpd
# 世界の国境データを読み込む(例: GeoPandas内のサンプルデータを使用)
world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
# データの概要を確認
print(world.head())

データの確認

worldデータフレームは、Pandasデータフレームに似た構造を持っていますが、geometryという特別な列があり、各国の境界線がジオメトリとして保存されています。

# データフレームの構造を確認
print(world.columns)
# 国名とジオメトリの表示
print(world[['name', 'geometry']])

地理空間データの解析

次に、GeoPandasを使って基本的な地理空間解析を行います。ここでは、単純なフィルタリングと幾何演算を実施します。

国のフィルタリング

特定の条件でデータをフィルタリングできます。例えば、アジアの国々だけを抽出する場合:

# アジアの国々をフィルタリング
asia = world[world['continent'] == 'Asia']
# アジアの国境データを表示
print(asia[['name', 'geometry']])

バッファや面積計算

GeoPandasでは、地理データに対して幾何演算も可能です。例えば、各国の面積を計算したり、境界線にバッファ(拡大領域)を設定することができます。

# 各国の面積を計算
world['area'] = world['geometry'].area
# 境界線に100kmのバッファを設定
world['buffered'] = world['geometry'].buffer(1)  # 度単位で指定

Foliumを使った地図ビジュアライゼーション

次に、GeoPandasで操作したデータを地図上にインタラクティブに可視化するために、Foliumを使用します。Foliumは、Leaflet.jsというJavaScriptライブラリをベースにしており、簡単にインタラクティブな地図を作成できます。

Foliumのインストール

Foliumもpipを使って簡単にインストールできます。

pip install folium

基本的な地図の作成

まずは、Foliumで基本的な地図を作成してみましょう。

import folium
# 地図の中心を設定してFoliumマップを作成
m = folium.Map(location=[20, 0], zoom_start=2)
# 地図を表示(Jupyter Notebookの場合)
m

GeoPandasのデータをFoliumで表示

GeoPandasで操作したデータをFoliumで表示するには、folium.GeoJson()を使ってデータを地図上に追加します。

# GeoPandasデータをGeoJSON形式で地図に追加
folium.GeoJson(world).add_to(m)
# 地図を表示
m

カスタムスタイルでの表示

データを地図上にプロットする際、スタイルやポップアップをカスタマイズすることができます。ここでは、各国の名前をポップアップで表示し、国ごとに異なる色で塗り分けます。

# カスタムスタイルとポップアップ付きのGeoJSON
folium.GeoJson(
    world,
    style_function=lambda x: {
        'fillColor': 'green' if x['properties']['continent'] == 'Asia' else 'blue',
        'color': 'black',
        'weight': 1,
        'fillOpacity': 0.5,
    },
    tooltip=folium.GeoJsonTooltip(fields=['name'])
).add_to(m)
# 地図を表示
m

マーカーの追加

Foliumでは、地理データだけでなく、地図上にマーカーを追加することもできます。例えば、特定の都市にマーカーを配置する場合:

# 特定の都市にマーカーを追加
folium.Marker(location=[35.6895, 139.6917], popup="Tokyo").add_to(m)
folium.Marker(location=[40.7128, -74.0060], popup="New York").add_to(m)
# 地図を表示
m

応用例:コロプレスマップの作成

Foliumでは、コロプレスマップ(Choropleth Map)を作成し、地図上に数値データを視覚的に表示することができます。ここでは、各国の人口密度を表示するコロプレスマップを作成します。

コロプレスマップの作成

# 各国の人口密度を計算
world['pop_density'] = world['pop_est'] / world['area']
# コロプレスマップを作成
folium.Choropleth(
    geo_data=world,
    name='choropleth',
    data=world,
    columns=['name', 'pop_density'],
    key_on='feature.properties.name',
    fill_color='YlGnBu',
    fill_opacity=0.7,
    line_opacity=0.2,
    legend_name='Population Density (per sq. km)'
).add_to(m)
# 地図を表示
m

コードの解説

  • Choropleth: Foliumのコロプレスマップを作成するための関数です。geo_dataには地理データ、dataには色分けに使う数値データを渡します。
  • fill_color: 色のパターンを指定し、fill_opacityで色の透明度を設定します。
  • legend_name: 地図の凡例を表示します。

まとめ

PythonのGeoPandasとFoliumを使えば、地理空間データを簡単に解析し、インタラクティブな地図としてビジュアライゼーションすることができます。GeoPandasでデータを操作し、Foliumで可視化するこの流れは、都市分析や環境モデリング、さらにはビジネスデータの可視化にも応用可能です。ぜひ、自分のプロジェクトでもこれらのツールを活用して、地理空間データの解析や可視化に挑戦してみてください。