はじめに
ベクトルデータからデータを切り出す方法は以前、こちらでも紹介しました。
今回は、より高速に・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')