見出し画像

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)

ざっくり解説します。

geometry = [Point(xy) for xy in zip(point.経度, point.緯度)]
point = point.set_geometry(geometry, crs="EPSG:6668")

ここで地理情報付与と座標系を設定します。点データはcsvを読み込んだだけではただの表としか認識されません(下A図)。そこでこの2行のコードを記述してあげることで地理情報を持たせることができます(下B図)。

A.地理情報付与前(最右列がNone)
B.地理情報付与後(最右列に緯度経度情報あり)

ちなみにcrs="EPSG:6668"の部分では座標系の情報を付与しています。今回使うshpファイルのcrsがEPSG:6668だったので揃えています。

shpファイルのCRS情報

point_out = gpd.sjoin(point, japan, predicate="within")

ここで空間結合を行っています。sjoinの詳細はこちら(geopandas.sjoin)に記載あります。パラメータ"how"を使わないとINNER JOIN(2つの地理データが重なる部分のみ)で結合されるようです。

この記事が気に入ったらサポートをしてみませんか?