0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

土木のためのPython入門⑦ GeoPandas入門編

0
Posted at

この記事の対象者

  • Pythonをこれから土木工学、都市工学に活用したい方
  • Pythonの基本文法を理解している方
  • pandas、NumPy、Matplotlibを学んだ方
  • GISや地理空間データをPythonで扱ってみたい方

この記事を読む前に

  • 本記事は筆者個人の学習記録であり、所属する大学や特定の団体の公式見解ではありません。
  • 本記事の内容には十分注意を払っていますが、正確性や完全性を保証するものではありません。
  • 本記事を参考にする場合は、必ずご自身でも最新の公式ドキュメント等をご確認ください。
  • 特に実務上の設計・安全性の判断には、関係法令、設計基準、専門家による確認等が必要です。
  • 本記事の利用によって生じたいかなる損害についても、筆者は責任を負いかねます。

これまでの記事一覧はこちらから

この連載のGitHubリポジトリはこちら

はじめに

これまでの記事では、Pythonの基本文法から始め、pandasによるデータ処理、Matplotlibによる可視化、NumPy・SciPyによる数値計算について学んできました。

今回からは、土木工学で重要な「位置情報を持つデータ」をPythonで扱います。

土木・都市・環境分野では、道路、河川、行政区域、土地利用、標高、浸水区域など、地理的な位置と結びついたデータを扱う機会が多くあります。

こうしたデータをPythonで扱うための代表的なライブラリが GeoPandas です。

この記事では、GeoPandasの基本的な考え方から、地理空間データの読み込み、座標参照系、可視化、基本的な空間処理までを扱います。


1. GeoPandasとは

GeoPandas は、Pythonで地理空間データを扱うためのライブラリです。

pandasのDataFrameを拡張したGeoDataFrameを中心に、属性情報と地理情報を一緒に扱うことができます。

通常のpandasでは、例えば次のような表を扱います。

地点名     人口
A地区      12000
B地区       8500
C地区      15600

GeoPandasでは、これに「どこにあるか」という情報を追加できます。

地区名     人口      geometry
A地区      12000     Polygon(...)
B地区       8500     Polygon(...)
C地区      15600     Polygon(...)

つまり、

pandas + 地理情報 = GeoPandas

と考えると理解しやすいでしょう。


2. インストール

GeoPandasは、プロジェクトの環境にインストールして使用します。

uvを利用している場合は、次のコマンドで追加できます。

uv add geopandas

環境によっては追加ライブラリの導入が必要な場合があります。
詳細はGeoPandas公式ドキュメントを参照してください。

また私のGitHubリポジトリをクローンして構築する場合は、
powershellなどで

git clone https://github.com/skyblueao77/civil-engineering-python.git

cd civil-engineering-python

uv sync

と入力するだけで環境を再現できます。
わからないことがあればその状況を公式ドキュメントや生成AIなども活用しながら原因を調査してみてください。

インストール後、Pythonから読み込みます。

import geopandas as gpd

GeoPandasは、Shapely、pyproj、pyogrioなど、地理空間データを扱うための複数のライブラリと連携しています。

そのため、個々のライブラリを別々に扱うより、まずはGeoPandasを入口として学ぶと理解しやすくなります。

近年はShapefileに加え、1ファイルで扱いやすいGeoPackage(.gpkg)も広く利用されています。


3. GeoDataFrame

GeoPandasで最も重要なデータ構造がGeoDataFrameです。

通常のpandasではDataFrameを使います。

import pandas as pd

df = pd.DataFrame({
    "name": ["A", "B", "C"],
    "population": [12000, 8500, 15600]
})

df

GeoPandasでは、これに地理情報を持たせることができます。

例えば、点データを作成してみます。

import geopandas as gpd
from shapely.geometry import Point

gdf = gpd.GeoDataFrame(
    {
        "name": ["A", "B", "C"],
        "population": [12000, 8500, 15600],
    },
    geometry=[
        Point(135.0, 34.7),
        Point(135.1, 34.7),
        Point(135.0, 34.8),
    ],
    crs="EPSG:4326",
)

gdf

💡補足

EPSG:4326はWGS 84、EPSG:6673などは日本の平面直角座標系です。to_crs()は投影法だけでなく、必要に応じて基準となる測地系間の座標変換も行います。なお、測量成果や高精度GNSSデータを扱う場合は、元データの測地系、基準時点、標高基準も確認してください。

💡 Shapelyの順番に関して

Shapely の Point(x, y) は「x座標, y座標」を指定します。
地理座標系(EPSG:4326)では通常 (経度, 緯度) と考えて問題ありません。

ここで作成した gdf に対して、そのまま .plot() を呼び出すだけで、簡単に位置関係をグラフ描画できます。

gdf.plot()

ここで重要なのがgeometry列です。

geometryには、地理的な位置を表す情報が入ります。

代表的なものには次の3種類があります。

  • Point:点(観測地点、駅、橋梁位置)
  • LineString:線(道路、河川、鉄道路線)
  • Polygon:面(行政区域、敷地、流域)

4. GeoSeries

GeoDataFrameのgeometry列は、通常のpandasのSeriesではなく、GeoSeriesとして扱われます。

gdf.geometry

例えば、各地点の座標を確認することができます。

gdf.geometry.x
gdf.geometry.y

このように、通常の表データと地理情報を同じDataFrameの中で扱えることがGeoPandasの大きな特徴です。


5. 実際の地理空間データを読み込む

GeoPandasでは、GISで一般的に利用されているさまざまな形式のデータを扱えます。

代表的なものとして、

  • GeoJSON
  • Shapefile
  • GeoPackage
  • FlatGeobuf

などがあります。

例えばGeoJSONを読み込む場合は、

gdf = gpd.read_file("data/sample.geojson")

とします。

読み込んだデータの先頭を確認します。

gdf.head()

データの構造は、

gdf.info()

で確認できます。

地理情報を確認する場合は、

gdf.geometry

を使用します。


6. 座標参照系(CRS)と平面直角座標系への変換

地理空間データを扱う上で、特に重要なのが CRS(Coordinate Reference System:座標参照系) です。

まず、現在のデータがどのCRSを使っているかは .crs で確認できます。

print(gdf.crs)

例えば、EPSG:4326 と表示されたとします。これはWGS 84という世界的に広く使われている地理座標系で、位置を「緯度・経度(単位:度)」で表します。

GIS初心者が陥りやすい落とし穴

経緯度データのまま、GeoPandasで距離計算(.distance())、面積計算(.area)、バッファ作成(.buffer())を行うと大きな問題が生じます。

例えば、ある観測地点から「100 mのバッファ(影響範囲)」を作ろうとして、次のようなコードを実行したとします。

# ❌ 経緯度(EPSG:4326)のままバッファを作成してしまう例
buffer = gdf.geometry.buffer(100)

このとき、GeoPandasは100メートルのバッファを作成するのではなく、経度・緯度の数値を平面上のXY座標として扱い、座標単位で100のバッファを作成しようとします。EPSG:4326の座標単位は度であるため、期待する100 mのバッファにはなりません。

また、地球は完全な平面や真球ではなく、測地計算では一般に回転楕円体を用いて近似され、北緯35度付近における経度1度の長さは、赤道付近より短くなります。

経緯度は角度を単位とするため、経度1度が表す実距離は緯度によって変化します。また、GeoPandasの基本的な幾何演算は二次元平面上で行われるため、経緯度のまま距離・面積・バッファを計算すると、対象地域や方向、範囲に応じて不適切な結果になります。

土木・測量で欠かせない「平面直角座標系」

そこで重要になるのが、地球を局所的な平面に投影し、単位を「メートル(m)」として扱えるようにした「平面直角座標系」 です。

日本国内の局所的な土木・測量では、対象地域に対応する平面直角座標系へ変換してから空間解析を行う方法が広く用いられます。ただし、適切な投影座標系は対象範囲や解析目的によって異なります。

日本国内では、歪みを最小限に抑えるために全国を19の地域(第1系〜第19系)に分割して管理しています。

主な適用地域 座標参照系 EPSGコード
兵庫県・鳥取県・岡山県 JGD2011/JGD2024 平面直角座標系 第5系 EPSG:6673
京都府・大阪府・福井県・滋賀県・三重県・奈良県・和歌山県 JGD2011/JGD2024 平面直角座標系 第6系 EPSG:6674
石川県・富山県・岐阜県・愛知県 JGD2011/JGD2024 平面直角座標系 第7系 EPSG:6675
東京都(第14系、第18系、第19系の区域を除く)・神奈川県・埼玉県・千葉県・茨城県・栃木県・群馬県・福島県 JGD2011/JGD2024 平面直角座標系 第9系 EPSG:6677

※ JGD2000に基づくデータでは、第6系がEPSG:2448、第9系がEPSG:2451など、JGD2011/JGD2024とは異なるEPSGコードが割り当てられています。

※2026年4月のEPSGデータセット更新により、水平座標に関する定義や座標値を変更せず、名称がJGD2011からJGD2024へ変更されました。使用するPROJ・pyproj・GISソフトウェアのバージョンによっては、同じEPSGコードがJGD2011と表示される場合があります。

to_crs() による座標変換

GeoPandasで別のCRSへ変換する場合は to_crs() を使用します。

例えば、兵庫県のデータを平面直角座標系第5系に変換する場合は、次のように記述します。

gdf_projected = gdf.to_crs("EPSG:6673")

距離・面積・バッファなどの平面演算を行う場合は、目的と対象地域に適した投影座標系へ変換します。日本国内の局所的な土木・測量では、平面直角座標系が有力な選択肢です。


7. 地理空間データを可視化する

GeoPandasでは、plot()を使って簡単に地図を描画できます。

gdf.plot()

Matplotlibと組み合わせることもできます。

import matplotlib.pyplot as plt

fig, ax = plt.subplots()

gdf.plot(ax=ax)

plt.show()

GeoPandasはMatplotlibと組み合わせて使用できるため、これまで学んだMatplotlibの知識をそのまま活用できます。


8. 属性情報によって色を変える

例えば、人口のような属性値に応じて色を変えることもできます。

gdf.plot(
    column="population",
    legend=True,
)

これによって、人口が多い地域と少ない地域を視覚的に比較できます。

これは土木・都市分野でも非常に重要です。例えば、

  • 人口・世帯数
  • 降水量
  • 浸水深
  • 土地利用
  • 交通量
  • 標高
  • 災害リスク

などを地図上で表現することができます。


9. バッファを作成する

GeoPandasでは、地物の周囲に一定距離の領域を作成できます。これをバッファ(buffer)と呼びます。

例えば、ある施設から100 m以内の範囲を作りたい場合などに利用できます。

先ほど触れたとおり、距離を扱うバッファ処理では、目的と対象地域に適したメートル単位の投影座標系へ変換してから処理します。日本国内の局所的な解析では、平面直角座標系が有力な選択肢です。

# メートル単位の投影座標系に変換した上でバッファ処理を実行

gdf_projected = gdf.to_crs("EPSG:6673")
buffer = gdf_projected.geometry.buffer(100)


10. クリップ

ある範囲の中だけデータを取り出したい場合には、clip()を利用できます。

例えば、道路データから特定の行政区域内に存在する部分だけを抽出する、といった処理が可能です。

# CRSが一致していることを確認
print(roads.crs)
print(area.crs)

# 必要に応じてareaをroadsと同じCRSへ変換
area = area.to_crs(roads.crs)

result = gpd.clip(roads, area)

GISで行っていた空間処理をPythonのコードとして実行できることが、GeoPandasの大きな利点です。


11. 空間結合

GeoPandasでは、位置関係を利用してデータを結合することもできます。代表的なのが sjoin() です。

polygons = polygons.to_crs(points.crs)

result = gpd.sjoin(
    points,
    polygons,
    predicate="within",
)

例えば、

「この観測地点はどの行政区域に入っているか?」

といった処理ができます。

通常のpandasでは pd.merge() のように共通する列(キー)を利用してデータを結合しますが、GeoPandasの空間結合では「どの地物がどの地物の中にあるか」といった空間的な関係を利用して結合できます。

また、predicate="within"では、ポリゴンの境界上にある点は内部と判定されない場合があります。境界を含めたい場合は、データの目的に応じてintersectsやcovered_byなどの空間述語も検討します。利用可能な述語はgdf.sindex.valid_query_predicatesで確認できます。


12. 土木工学での利用例と活用できるオープンデータ

GeoPandasは、土木工学のさまざまな分野で利用できます。

例えば、防災・都市計画分野では以下のような処理が考えられます。

  • 事例1:観測地点の領域集計

  • 観測地点データ + 行政区域データ を空間結合(sjoin)して区域ごとに集計・可視化

  • 事例2:施設の影響範囲抽出

  • 道路ネットワークや避難所周辺にバッファを作成し、範囲内の対象施設数を抽出

これらに利用できる実践的なデータとして、日本国内では以下のような公的オープンデータ(GeoJSONやShapefile形式など)が無料で公開されています。

  • 国土数値情報(国土交通省):行政区域、河川、道路、都市計画、浸水想定区域など
  • 基盤地図情報(国土地理院):建築物の外形線、標高データ、道路縁など
  • e-Stat(総務省統計局):国勢調査による小地域(町丁・字等)境域データと人口統計

これらの実データをGeoPandasで読み込むことで、すぐに高度な分析を始められます。


13. GeoPandasだけですべてのGIS処理を行うわけではない

GeoPandasは非常に便利ですが、GISに関するすべての処理をGeoPandasだけで行うわけではありません。

目的に応じてさまざまなライブラリを組み合わせます。

  • Shapely:ジオメトリの処理
  • pyproj:座標変換
  • pyogrio:地理空間データの高速な入出力(GeoPandasの近年の高速化を支える重要なライブラリ)
  • rasterio:標高や衛星写真などのラスターデータ
  • NetworkX:道路網などのネットワーク分析

また、GUIで直感的にデータを確認・編集したい場合は QGIS などの専用GISソフトウェアも強力なツールとなります。

GeoPandasは「GISソフトの完全な代用品」ではなく、Pythonから地理空間データを自動処理・プログラム分析するためのライブラリと捉えると良いでしょう。


14. pandasとの違い

ここまでの内容を整理すると、pandasとGeoPandasには次のような違いがあります。

pandas GeoPandas
基本データ構造 DataFrame GeoDataFrame
表データ
地理情報 ×
Point ×
LineString ×
Polygon ×
空間結合 ×
GISデータ 基本的に対象外
Matplotlibとの連携

表形式のデータ処理に加え、地理空間情報を扱いたい場合にGeoPandasを利用します。


15. GeoPandasを使う上での注意点

1. CRSを確認・明記する

地理空間データを扱う際には、まず gdf.crs でCRSを確認しましょう。
CRSが不明なデータに対して、座標値の見た目だけから推測してset_crs()を使用してはいけません。配布元の仕様書、メタデータ、.prjファイルなどから元のCRSを確認してください。

2. 距離・面積の単位に注意する

経緯度のまま平面計算すると、距離は座標単位としての「度」、面積は「度の二乗」に相当する値となり、メートルや平方メートルとして解釈できません。必要に応じてto_crs()で、目的と対象地域に適した投影座標系へ変換します。

3. set_crs()to_crs() を混同しない

  • set_crs():CRS情報がないデータに対して「このデータは○○である」と割り当てる操作
  • to_crs():「現在のCRSから別のCRSへ座標数値を変換する」操作

既に正しいCRSが設定されているデータを変換したい場合は、必ず to_crs() を使います。

4. データ品質(トポロジーや欠損)に注意する

実際のGISデータには、欠損値、ジオメトリの歪み、座標精度の違いなどが含まれることがあります。コードが正常に動いても、計算結果の妥当性を土木的観点から確認することが大切です。


16. これまでのライブラリとの連携

これまで学んできたライブラリを組み合わせることで、一連のデータ分析フローが完成します。

気象・観測データ
    ↓
pandasで読み込み・整形
    ↓
GeoPandasで観測地点の位置情報と結合(空間結合など)
    ↓
NumPy / SciPyで数値計算・補間処理
    ↓
Matplotlib / GeoPandasで地図上に可視化

このように「表データ」から「空間データ」へと視野を拡張できるのが、Pythonを土木工学で使う最大のメリットの一つです。


まとめ

今回はGeoPandasの基本を紹介しました。

  • GeoPandas はPythonで地理空間データを扱うためのライブラリ
  • GeoDataFrame を使って属性情報と位置情報(Point, LineString, Polygon)をまとめて扱える
  • 距離や面積の計算・バッファ処理には、目的と対象地域に適した投影座標系への変換が重要
  • plot()sjoin()buffer() などを活用してGISの基本処理を自動化できる
  • 国土数値情報 などのオープンデータと親和性が高い

次回からは、実際に公開されているオープンデータを取得して、土木工学の実務や研究に近いテーマを題材にしたデータ分析に挑戦していきます。


参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?