ポリゴンのGeoDataFrame(〜30)とポイントのGeoDataFrame(〜10k)があります
ポイントがポリゴンに存在する場合、単純なブール値のTrue/Falseを使用して、GeoDataFrame of Pointsに30個の新しい列(適切なポリゴン名)を作成しようとしています。
例として、ポリゴンのGeoDataFrameは次のとおりです。
id geometry
foo POLYGON ((-0.18353,51.51022, -0.18421,51.50767, -0.18253,51.50744, -0.1794,51.50914))
bar POLYGON ((-0.17003,51.50739, -0.16904,51.50604, -0.16488,51.50615, -0.1613,51.5091))
ポイントのGeoDataFrameは次のようになります。
counter points
1 ((-0.17987,51.50974))
2 ((-0.16507,51.50925))
期待される出力:
counter points foo bar
1 ((-0.17987,51.50974)) False False
1 ((-0.16507,51.50925)) False False
私はこれを手動で行うことができます:
foo = df_poly.loc[df_poly.id=='foo']
df_points['foo'] = df_points['points'].map(lambda x: True if foo.contains(x).any()==True else False
しかし、30個のポリゴンがあるので、もっと良い方法があるかどうか疑問に思っていました。ヘルプを感謝します!
実際にどのようなデータ構造を持っているのかは明確ではありません。また、期待される結果はすべてFalseであるため、確認するのは困難です。 GeoSeriesとGeoDataFramesを想定して、私はこれをします:
from shapely.geometry import Point, Polygon
import geopandas
polys = geopandas.GeoSeries({
'foo': Polygon([(5, 5), (5, 13), (13, 13), (13, 5)]),
'bar': Polygon([(10, 10), (10, 15), (15, 15), (15, 10)]),
})
_pnts = [Point(3, 3), Point(8, 8), Point(11, 11)]
pnts = geopandas.GeoDataFrame(geometry=_pnts, index=['A', 'B', 'C'])
pnts = pnts.assign(**{key: pnts.within(geom) for key, geom in polys.items()})
print(pnts)
そしてそれは私に与えます:
geometry bar foo
A POINT (3 3) False False
B POINT (8 8) False True
C POINT (11 11) True True
このライブラリはjavascript、pythonおよびGolang。で見つかりました。ジオポリゴンでポイントを見つける必要がある人のために。