Geopandas入門:Pythonで地理空間データを簡単に操作・可視化する方法

プログラミング
記事内に広告が含まれています。
スポンサーリンク

Geopandasとは?

GeopandasはPythonのライブラリで、地理空間データ(GISデータ)を効率的に扱うためのツールです。GeopandasはPandasを拡張しており、地図上の位置情報を持つデータをDataFrame形式で操作できます。従来のPandasデータフレームに「geometry(ジオメトリ)」と呼ばれる特別な列を追加することで、点、線、ポリゴンなどの地理的な形状情報を管理できるようになります。

brian
brian

「地理空間データの分析に興味はあるけれど、どこから始めればいいかわからない…」そんな方に、PythonのGeoPandasを使った入門ガイドをご紹介します。このガイドでは、GeoPandasの基本的な使い方から、地理データの読み込み、操作、可視化まで、初心者にもわかりやすく解説しています。地理情報の分析に挑戦してみたい方は、ぜひチェックしてみてくださいね!

Pandasとの違い

Pandasは数値データや文字列などの一般的なデータをテーブル形式で処理するためのライブラリですが、Geopandasはこれに空間情報を扱うための機能が加わったものです。PandasとGeopandasの主な違いは以下の通りです。

  • Geometry列
    Geopandasのデータフレーム(GeoDataFrame)は、地理空間データを扱うために「geometry」という列を持ちます。この列には地理的なポイント、ライン、またはポリゴンが格納され、緯度や経度、あるいは地域の境界を表現することができます。
  • 空間データ操作
    Geopandasには空間データの処理や計算のためのメソッド(例:距離計算や空間的な結合)が含まれており、地理情報の分析が簡単に行えます。
  • データの可視化
    GeopandasはMatplotlibを活用し、地理データを地図として描画する機能を持っています。

Geopandasの利用例

Geopandasを活用すると、次のような処理が簡単に行えます。

  • 地図データの読み込み
    シェープファイルやGeoJSONなどの地理空間データを読み込み、操作することができます。
  • 距離や位置の計算
    異なる場所間の距離や面積を計算したり、異なる地域の重なりや含有関係を評価することができます。
  • 地図の作成と可視化
    データのプロットや地図への可視化を行い、データの分布や傾向を視覚的に分析できます。

このように、GeopandasはPythonによる地理空間データの操作を直感的に行うための便利なツールです。

スポンサーリンク

インストール方法

Geopandasのインストールには、Pythonパッケージ管理ツールであるpipまたはcondaを使用しますが、依存ライブラリが多いため、推奨方法に従うことでトラブルを避けやすくなります。以下に、一般的なインストール手順を示します。

必要なライブラリと注意点

Geopandasは、空間情報を処理するための複数のライブラリ(例えばGDAL、Fiona、Shapelyなど)に依存しています。これらは通常のPythonパッケージよりも少し複雑なインストールが必要な場合があるため、Anaconda(またはMiniconda)の環境を利用することで、依存関係を簡単に解決できます。

Condaを使ったインストール方法(推奨)

  1. Conda環境のセットアップ
    AnacondaやMinicondaがインストールされていない場合は、公式サイトからインストールします。その後、Geopandas専用の仮想環境を作成しておくと便利です。
Bash
conda create -n geo_env python=3.9
conda activate geo_env
  1. Geopandasのインストール
    仮想環境が準備できたら、次のコマンドでGeopandasをインストールします。
Bash
conda install -c conda-forge geopandas

-c conda-forge オプションは、Geopandasおよびその依存関係を管理するコミュニティレポジトリからインストールするためのものです。この方法を使うと、依存ライブラリも一緒にインストールされるため、手動で個別に対応する必要がありません。

Pipを使ったインストール方法

Conda環境を使用しない場合は、pipでもインストールできますが、事前に依存ライブラリのGDALを設定しておくとインストールがスムーズです。

  1. 依存ライブラリの準備
    WindowsやmacOSではGDALのインストールにエラーが出る場合があるため、事前にGDALライブラリを以下のコマンドでインストールします。
Bash
pip install gdal
  1. Geopandasのインストール
    Geopandasを以下のコマンドでインストールします。
Bash
pip install geopandas

インストールの確認

Geopandasが正しくインストールされたか確認するには、PythonシェルまたはJupyter Notebookを開き、以下のコードを実行します。

Python
import geopandas as gpd
print(gpd.__version__)

エラーが出ずにバージョン情報が表示されれば、インストールは成功です。

スポンサーリンク

基本的な使い方

Geopandasを使うと、シェープファイルやGeoJSONなどの地理空間データをPythonで手軽に扱うことができます。この章では、Geopandasを使用した基本的な操作について解説します。

地理空間データの読み込み

Geopandasは、様々な形式の地理空間データを読み込むことができます。代表的なものとして、シェープファイル(.shp)やGeoJSON(.geojson)ファイルがあります。以下の例では、シェープファイルを読み込む方法を説明します。

Python
import geopandas as gpd

# シェープファイルの読み込み
gdf = gpd.read_file("path/to/your/file.shp")

上記のコードでは、read_file関数を使ってシェープファイルを読み込み、GeoDataFrame(地理空間データフレーム)として保存しています。GeoDataFrameは、通常のDataFrameと同様の操作が可能で、さらに地理情報に特化した機能を持ちます。

Geometry列の概念と使用方法

GeopandasのGeoDataFrameには、各行の地理情報(ポイント、ライン、ポリゴンなど)が格納された「geometry」列が含まれています。たとえば、点で構成されるデータセットでは各行に緯度・経度情報が含まれ、行政区画や土地の境界データではポリゴンとして保存されます。

以下は、geometry列のデータを表示する例です。

Python
# GeoDataFrameのgeometry列を表示
print(gdf.geometry.head())

データの基本操作

GeoDataFrameは通常のPandasのDataFrameと同様の操作が可能で、フィルタリングや並び替え、特定の列の抽出なども簡単に行えます。以下に、いくつかの基本操作例を示します。

フィルタリング

たとえば、特定の地域や条件に基づいてデータをフィルタリングするには、Pandasと同様の条件指定が可能です。

Python
# 特定の地域名でフィルタリング
filtered_gdf = gdf[gdf["region"] == "Tokyo"]

並び替え

GeoDataFrame内のデータを、特定のカラムを基に並び替えることもできます。

Python
# 面積に基づいて並び替え(降順)
sorted_gdf = gdf.sort_values(by="area", ascending=False)

特定の列の抽出

必要な情報のみ抽出する場合、通常のPandasと同様に、特定の列だけを選択することもできます。

Python
# 地域名と面積列だけを選択
selected_columns = gdf[["region", "area"]]

このように、GeopandasはPandasと同様の使いやすいインターフェースを持ちながら、地理空間データの操作に適した特別な機能が追加されているため、直感的にデータを操作できます。

スポンサーリンク

空間データの処理

Geopandasは、地理空間データに関する高度な処理を手軽に行うことができるツールです。ここでは、距離や面積の計算、位置関係の評価(含有、交差判定)といった基本的な空間データ処理の方法について解説します。

距離と面積の計算

GeoDataFrameのgeometry列に含まれる地理的な形状情報を使って、特定のオブジェクト間の距離や面積の計算が可能です。

距離の計算

ある地点から別の地点までの距離を計算する際には、distanceメソッドを使用します。Geopandasはデフォルトで距離を平面(直線)で計算しますが、正確な距離を求める場合には座標系を適切に設定することが重要です。

Python
# 距離の計算例
point_a = gpd.GeoSeries([Point(139.6917, 35.6895)])  # 東京の地点
point_b = gpd.GeoSeries([Point(135.5023, 34.6937)])  # 大阪の地点

# 距離を計算(度数で表現)
distance = point_a.distance(point_b)
print(distance)

面積の計算

ポリゴン形状のデータが含まれている場合は、areaプロパティを使用して面積を計算することができます。地理空間データを適切に投影した座標系(平面座標系)に変換することで、正確な面積が求められます。

Python
# 面積の計算例
gdf["area_km2"] = gdf.to_crs(epsg=3857).area / 10**6  # 単位を平方キロメートルに変換

位置関係の評価

Geopandasは、地理空間データに関する位置関係を評価するための様々なメソッドを提供しています。以下のような空間的な関係を評価することが可能です。

含有関係(contains)

ある形状が別の形状を完全に含んでいるかを判定するには、containsメソッドを使用します。

Python
# 特定のポリゴンがポイントを含んでいるかどうかの判定
polygon = gpd.GeoSeries([Polygon([(0, 0), (1, 0), (1, 1), (0, 1)])])
point = gpd.GeoSeries([Point(0.5, 0.5)])

is_contained = polygon.contains(point)
print(is_contained)  # 結果: True

交差関係(intersects)

2つの地理的形状が交差(重なり)しているかどうかは、intersectsメソッドで確認できます。

Python
# 交差の判定
polygon_a = gpd.GeoSeries([Polygon([(0, 0), (2, 0), (2, 2), (0, 2)])])
polygon_b = gpd.GeoSeries([Polygon([(1, 1), (3, 1), (3, 3), (1, 3)])])

is_intersecting = polygon_a.intersects(polygon_b)
print(is_intersecting)  # 結果: True

総合例

以下の例では、Geopandasを使用して東京23区の各区の面積を計算し、ある区が別の区と交差しているかを判定します。

Python
# 東京23区データを読み込み、面積を計算
wards_gdf = gpd.read_file("tokyo_23wards.shp")
wards_gdf = wards_gdf.to_crs(epsg=3857)  # 平面座標系に変換

# 面積の計算
wards_gdf["area_km2"] = wards_gdf.area / 10**6  # 平方キロメートルに変換

# 特定の区と交差している他の区を探す
target_ward = wards_gdf[wards_gdf["ward_name"] == "Shinjuku"]
intersecting_wards = wards_gdf[wards_gdf.intersects(target_ward.unary_union)]
print(intersecting_wards[["ward_name", "area_km2"]])

このように、Geopandasでは空間データの処理が容易に行えるため、地理的なデータの特徴を考慮した分析が可能です。

スポンサーリンク

データの可視化

Geopandasは、地理空間データを地図上に可視化するための機能が充実しています。Matplotlibと連携することで、地理情報を簡単にプロットでき、地図を用いたデータの視覚化が可能です。この章では、基本的な地図の描画方法や、色分けや重ね合わせを使った応用例を紹介します。

基本的な地図の描画

GeopandasのGeoDataFrameは、plotメソッドを使ってすぐに地理空間データを地図として表示できます。以下は、シンプルな地図のプロット例です。

Python
import geopandas as gpd
import matplotlib.pyplot as plt

# GeoDataFrameの読み込み
gdf = gpd.read_file("path/to/your/shapefile.shp")

# プロットの実行
gdf.plot()
plt.show()

この例では、GeoDataFrameの形状がそのまま表示され、ポリゴンやポイントなどがデフォルトの色で地図上に描かれます。plotメソッドにはさまざまな引数を設定でき、色や境界線などのスタイルをカスタマイズすることが可能です。

カラムに基づいた色分け

地理空間データの可視化では、特定の数値データ(例:人口や面積など)を基にして色を変えることで、データの分布や傾向を表現できます。たとえば、column引数を使用してデータの値に応じた色分けを行います。

Python
# 面積カラムを基に色分けしてプロット
gdf.plot(column="area_km2", cmap="OrRd", legend=True)
plt.show()

このコードでは、area_km2カラムの値に基づいて色分けを行い、OrRd(オレンジから赤のカラーマップ)を指定しています。また、legend=Trueで凡例を表示し、数値の違いが視覚的に分かりやすくなります。

地図の重ね合わせ

地理空間データの分析では、複数のレイヤーを重ねて表示することがよく行われます。たとえば、異なるデータセットを同一の地図にプロットすることで、地域の詳細な情報を示すことができます。

Python
# 複数レイヤーの重ね合わせ
base = gdf.plot(color="lightgrey")  # ベースマップを薄い灰色で描画
overlay = another_gdf.plot(ax=base, color="blue", alpha=0.5)  # 重ねるデータを青色で表示
plt.show()

ここでは、another_gdfのデータをgdfの地図上に青色で重ねています。alpha=0.5で透明度を設定し、ベースマップと重ねたレイヤーが同時に見えるようにしています。

Foliumを使ったインタラクティブな地図の作成

GeopandasのデータをFoliumに変換することで、インタラクティブな地図を作成することも可能です。Foliumは、Zoomやポップアップ表示などの機能を使ってデータの詳細を表示するための強力なツールです。

Python
import folium

# GeoDataFrameを使用してFoliumのマップを作成
m = folium.Map(location=[35.6895, 139.6917], zoom_start=10)  # 東京を中心に設定
for _, row in gdf.iterrows():
    sim_geo = gpd.GeoSeries(row["geometry"]).simplify(tolerance=0.001)
    geo_j = sim_geo.to_json()
    folium.GeoJson(data=geo_j, style_function=lambda x: {"fillColor": "blue"}).add_to(m)

# 地図を表示
m.save("map.html")  # HTMLファイルとして保存してブラウザで表示

このコードでは、GeoDataFrameの各ポリゴンをFoliumの地図に重ねています。simplifyメソッドを使うことでデータ量を抑え、軽量なインタラクティブマップを作成できます。

スポンサーリンク

応用例:リアルワールドデータの操作

Geopandasは、リアルワールドの地理データを扱う際に非常に便利なツールです。ここでは、シェープファイルの読み込みからデータの結合と集約、基本的なGIS操作まで、実践的なデータ操作の例を紹介します。

シェープファイルの読み込みと操作

実際の地理空間データは、シェープファイル(.shp)、GeoJSON(.geojson)などの形式で提供されていることが多く、Geopandasのread_file関数を使うことで、これらのデータを簡単に読み込むことができます。

Python
import geopandas as gpd

# シェープファイルの読み込み
wards_gdf = gpd.read_file("tokyo_23wards.shp")

# データの確認
print(wards_gdf.head())

上記のコードにより、データの最初の数行を確認でき、データの構造や含まれるカラムが把握できます。各行に地理情報(ポリゴンやポイント)が含まれており、区や県ごとのデータなど、広範囲の情報を格納可能です。

地理データの結合と集約

Geopandasには、Pandasと同様にデータを結合する機能があり、mergespatial join(空間結合)を利用することで、地理情報をベースにしたデータの結合が可能です。

データの結合(Spatial Join)

異なるデータセットを空間的に結合する場合、sjoin(spatial join)メソッドを使用します。たとえば、東京23区の各区のポリゴンデータと、それぞれの区の人口データを結合する場合は、区名などの共通項目を基にデータを結合することができます。

Python
# 東京23区の区別人口データの読み込み
population_gdf = gpd.read_file("population_data.shp")

# 空間結合
joined_gdf = gpd.sjoin(wards_gdf, population_gdf, how="inner", op="intersects")

print(joined_gdf.head())

このコードでは、各区のポリゴンデータに人口データが結合され、区ごとの人口分布が地理的に視覚化できるようになります。op="intersects"を指定することで、ポリゴン同士の交差部分を基にした結合が行われています。

データの集約

データを集約して各エリアの合計や平均を計算する場合、groupbyメソッドを使用します。たとえば、東京23区ごとの面積を合計したい場合には、以下のようにします。

Python
# 区ごとの面積の集約
area_by_ward = joined_gdf.groupby("ward_name")["area_km2"].sum()
print(area_by_ward)

このコードにより、各区ごとの面積の合計が得られ、データ全体の分布が把握できます。

基本的なGIS操作

GeopandasはGIS(地理情報システム)で使われる操作も簡単に行うことができます。たとえば、選択したエリアのバッファリング(周囲の指定距離分を広げる)や、重心の計算、ポイント間の距離計算などがあります。

バッファリング

特定のエリアの周囲に指定した距離のバッファを追加するには、bufferメソッドを使用します。これは、洪水の影響範囲や建物の影響エリアを可視化する場合などに役立ちます。

Python
# 500メートルのバッファを追加
wards_gdf["buffer_500m"] = wards_gdf.geometry.buffer(500)
wards_gdf.plot("buffer_500m", edgecolor="blue")

重心の計算

各区の重心を求め、地図にプロットすることで、地理データの分布を把握しやすくなります。

Python
# 重心の計算
wards_gdf["centroid"] = wards_gdf.geometry.centroid
wards_gdf.plot(marker="o", color="red", markersize=5)

これにより、各区の中心点が地図にプロットされ、データ全体の地理的なバランスが視覚的に確認できます。

スポンサーリンク

まとめ

Geopandasは、Pythonを使って地理空間データを直感的かつ効果的に操作・分析するための強力なライブラリです。本記事では、Geopandasの基本的な使い方から、空間データの処理、可視化、さらにリアルワールドデータを操作する応用例までを解説しました。

Geopandasの主な特徴は、以下の点にあります。

  • 簡単なデータ読み込みと操作
    シェープファイルやGeoJSONなど、一般的な地理空間データフォーマットを容易に読み込み、Pandasのような直感的な操作が可能です。
  • 空間的な計算と評価
    面積計算や距離計算、位置関係の評価といった地理的な計算が手軽に行えます。
  • 高い可視化機能
    MatplotlibやFoliumと組み合わせて地理データを可視化でき、カラムに基づいた色分けやレイヤーの重ね合わせも簡単に実現可能です。

Geopandasを活用することで、Pythonの豊富なデータ分析機能と地理空間データを組み合わせ、ビジュアルと数値で多角的にデータを理解することが可能です。GIS業務やデータサイエンスにおいて地理的な視点から洞察を得たいときに、Geopandasは非常に有効なツールとなるでしょう。

brian
brian

ここまで読んでいただきありがとうございます!

UdemyのPythonコースにはオンラインで学習ができる動画コンテンツがたくさんあります。

当ブログのような文章メインの説明では足りない箇所を補えると思うので、もっと詳しく勉強したいという方はぜひチェックしてみてください!

コメント

タイトルとURLをコピーしました