![見出し画像](https://assets.st-note.com/production/uploads/images/96120245/rectangle_large_type_2_e719af2cf16d4798f3f2fd7f7009ce10.png?width=1200)
[Geopandas] ポリゴン内のポイントを抽出・カウントする
今回はポリゴン内のポイント抽出して、数をカウントしていきます。ベクトルデータ同士の位置関係からデータを抽出することは、よくあることなので少しでも理解していただけたら幸いです。🚗🌬
1. 使用するデータ
今回は、1ポリゴンと複数のポイントの2種類のベクトルデータを使用します。各種ベクトルデータは、
![](https://assets.st-note.com/img/1670888896754-44pYssgXNK.png)
となります。今回のゴールは、ポリゴンデータ(青枠)内にあるポイント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となります。
![](https://assets.st-note.com/img/1670902897725-S7IvB6cqB6.png)
ii) 判定結果を用いてマスクする
結果を用いてポイントデータをマスクしていきましょう。マスクの仕方は、取得したBool型のリストを配列に突っ込めばマスク可能です。
mask_point = point[mask]
結果を見てみますと、きちんとポリゴン内のポイントのみが抽出されていますね😁
![](https://assets.st-note.com/img/1670889411235-DhJ9af1oUl.png)
このとき、抽出したpointの属性情報を見てみましょう。
![](https://assets.st-note.com/img/1670903190716-emnQtlXHwY.png)
index(黄色)部分が元のデータのindexのまま抽出されています。
今回は大した処理をしないため必要ないですが、データを扱いやすくするためにindexを振り直してあげましょう。振り直す方法は、
mask_point.reset_index(drop = True, inplace = True)
でリセットしてあげます。ここで、第1引数のdrop = True は元あるindexを削除し、第2引数のinplace = Trueで上書き処理してくれます。結果を見てみますと、
![](https://assets.st-note.com/img/1670903423639-30td9WAaAq.png)
でindexが0から始まっていてリセットされてますね👍
3. ポリゴン内のポイントをカウントする
ポリゴン内のポイントをカウントするには、上記の抽出結果のポイントを数えていきます。感覚的にcountメソッドを使用すれば抽出可能だと思いますが、
mask_point.count().geometry
# 結果
4
となり、少し冗長な処理となります。lenメソッドを使用すると、
len(mask_point)
# 結果
4
となり、簡単に取得できます。
まとめ
今回はポリゴン内のポイント数を抽出・カウントしました。
within以外に、contains、intersectsといったメソッドがありますので、気になる方は調べてみてください(ついでに教えてください)。使用頻度の高い処理ですが、思ったより情報がなかったため驚きでした。
ここまで読んでいただきありがとうございました😊
参考記事
この記事が気に入ったらサポートをしてみませんか?