Geopandasで空間結合してみる
はじめに
空間結合とは、簡単にいうと2つの地図データをマップ上で紐づけることです。例えば下の図のように、①災害時給水ステーションの場所(赤色の点)と②市区町村データ(灰色のポリゴン)が手持ちにあったとします。もしこの①赤点に対して、どの②市区町村に接しているかを知りたければ、この空間結合を行うことで解決することができます。
準備
まずはGeoPandas のライブラリを使えるようにします。こちらの記事に少し詳しく書いたので未導入の方は参照ください。
GeoPandasを使って地図表示|RYO|note
データについては、TOKYO OPEN DATAから①を、esriジャパンから②を入手します。ファイルは後述するプログラムど同階層に格納します。
①点データ(csv)(給水拠点一覧データ)
②ポリゴンデータ(shp)(全国市区町村界データ | ESRIジャパン )
サンプルコード
import geopandas as gpd
from shapely.geometry import Point
#データ入力
point = gpd.read_file("kyoten.csv")
japan = gpd.read_file("japan_ver84.shp")
#点データに地理情報を付与
geometry = [Point(xy) for xy in zip(point.経度, point.緯度)]
point = point.set_geometry(geometry, crs="EPSG:6668")
#空間結合とデータ出力
point_out = gpd.sjoin(point, japan, predicate="within")
point_out.to_csv('kyoten_out.csv', encoding='shift_jis', index=False)
ざっくり解説します。
ここで地理情報付与と座標系を設定します。点データはcsvを読み込んだだけではただの表としか認識されません(下A図)。そこでこの2行のコードを記述してあげることで地理情報を持たせることができます(下B図)。
ちなみにcrs="EPSG:6668"の部分では座標系の情報を付与しています。今回使うshpファイルのcrsがEPSG:6668だったので揃えています。
ここで空間結合を行っています。sjoinの詳細はこちら(geopandas.sjoin)に記載あります。パラメータ"how"を使わないとINNER JOIN(2つの地理データが重なる部分のみ)で結合されるようです。
この記事が気に入ったらサポートをしてみませんか?