[Geopandas] ポリゴン内のポイントを抽出・カウントする
今回はポリゴン内のポイント抽出して、数をカウントしていきます。ベクトルデータ同士の位置関係からデータを抽出することは、よくあることなので少しでも理解していただけたら幸いです。🚗🌬
1. 使用するデータ
今回は、1ポリゴンと複数のポイントの2種類のベクトルデータを使用します。各種ベクトルデータは、
となります。今回のゴールは、ポリゴンデータ(青枠)内にあるポイント4点を抽出することにします。
2. ポリゴン内のポイントを抽出
では、早速ポリゴン内のポイントを抽出していきたいと思います。
i) ポリゴン内のポイント判定
まず、ポリゴン内のポイントの有無を判定していきます。
使用するメソッドはwithinメソッドを使用します。
実行方法は、
import geopandas as gpd
polygon_path = "/content/drive/MyDrive/GIS_NOTE/data/polygon.geojson"
point_path = "/content/drive/MyDrive/GIS_NOTE/data/point.geojson"
point = gpd.read_file(point_path)
polygon = gpd.read_file(polygon_path)
# ポリゴン内のポイント判定
mask = point.within(polygon.loc[0, "geometry"])
です。このときwithinメソッドの引数に1ジオメトリを渡す必要があります(今回はポリゴン)。戻り値の型はGeoSeriesとなります。
ii) 判定結果を用いてマスクする
結果を用いてポイントデータをマスクしていきましょう。マスクの仕方は、取得したBool型のリストを配列に突っ込めばマスク可能です。
mask_point = point[mask]
結果を見てみますと、きちんとポリゴン内のポイントのみが抽出されていますね😁
このとき、抽出したpointの属性情報を見てみましょう。
index(黄色)部分が元のデータのindexのまま抽出されています。
今回は大した処理をしないため必要ないですが、データを扱いやすくするためにindexを振り直してあげましょう。振り直す方法は、
mask_point.reset_index(drop = True, inplace = True)
でリセットしてあげます。ここで、第1引数のdrop = True は元あるindexを削除し、第2引数のinplace = Trueで上書き処理してくれます。結果を見てみますと、
でindexが0から始まっていてリセットされてますね👍
3. ポリゴン内のポイントをカウントする
ポリゴン内のポイントをカウントするには、上記の抽出結果のポイントを数えていきます。感覚的にcountメソッドを使用すれば抽出可能だと思いますが、
mask_point.count().geometry
# 結果
4
となり、少し冗長な処理となります。lenメソッドを使用すると、
len(mask_point)
# 結果
4
となり、簡単に取得できます。
まとめ
今回はポリゴン内のポイント数を抽出・カウントしました。
within以外に、contains、intersectsといったメソッドがありますので、気になる方は調べてみてください(ついでに教えてください)。使用頻度の高い処理ですが、思ったより情報がなかったため驚きでした。
ここまで読んでいただきありがとうございました😊
参考記事