見出し画像

[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をリセット後の属性情報

でindexが0から始まっていてリセットされてますね👍

3. ポリゴン内のポイントをカウントする

ポリゴン内のポイントをカウントするには、上記の抽出結果のポイントを数えていきます。感覚的にcountメソッドを使用すれば抽出可能だと思いますが、

mask_point.count().geometry

# 結果
4

となり、少し冗長な処理となります。lenメソッドを使用すると、

len(mask_point)

# 結果
4

となり、簡単に取得できます。

まとめ

今回はポリゴン内のポイント数を抽出・カウントしました。
within以外に、contains、intersectsといったメソッドがありますので、気になる方は調べてみてください(ついでに教えてください)。使用頻度の高い処理ですが、思ったより情報がなかったため驚きでした。
ここまで読んでいただきありがとうございました😊

参考記事


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