Yuta NakataのBlog

Python / AWS / ITについて役立つ情報を発信します

【爆速】pythonを使って、ポリゴンデータから地点データを取得する方法

はじめに

ベクトルデータからデータを切り出す方法は以前、こちらでも紹介しました。

www.yuta-nakata.net

今回は、より高速に・Tipsも交えて追加の内容があるのでご紹介します。

結論

import pandas as pd
import shapely

# 取得したい緯度・経度
lon = 135
lat = 35

# 抽出した元データを読み込む
df = pd.read_csv("dataset.csv")

tree = shapely.STRtree(shapely.from_wkt(df['geometry'].astype(str)).to_numpy())
res = tree.query(shapely.points([lon], [lat]), 'within')
result = df.iloc[res[1]]

# 結果を表示する
print(result)

ポリゴンデータとは?

ベクトルデータの一種です。

GISの世界ではよく使われるデータになります。

ポリゴンには、シングルポリゴンとマルチポリゴンがあります。

シングルパートポリゴンとは、境界によって区切られた1つ1つのポリゴンと属性情報が1対1で対応しているようなポリゴンデータのことです。

マルチパートポリゴンは、1つの属性情報に対し複数のポリゴンが対応しているようなポリゴンデータのことです。

爆速のためのPoint

今回爆するうえでのPointとして、全てシングルポリゴンデータとして扱った点が挙げられます。

また、これらのデータを一度CSVとして書き出しています(上記の例では、geojson->csvや、shapefile->csv等に加工しています)。

import geopandas as gpd

df_shp = gpd.read_file('shapefile.shp',encoding='SHIFT-JIS')
df_gjs = gpd.read_file('gjs.geojson',encoding='SHIFT-JIS')

df_shp.to_csv("dataset_shp.csv")
df_gis.to_csv("dataset_gis.csv")

CSVのイメージとしては、

data geometry
1 POLYGON *1
2 POLYGON *2

です。

また、

res = tree.query(shapely.points([lon], [lat]), 'within')

サンプルでは、指定したポリゴンが含まれる地点を取得したためwithinとしましたが、Polygon上にある場合はintersectsとして取得ができます。

res = tree.query(shapely.points([lon], [lat]), 'intersects')

*1:-12485.05864419129 -77604.35297655607, -12477.826699746857

*2:-12485.05864419129 -77604.35297655607, -12477.826699746857