J'ai un GeoDataFrame de polygones (~ 30) et un GeoDataFrame de points (~ 10k)
Je cherche à créer 30 nouvelles colonnes (avec les noms de polygone appropriés) dans mon GeoDataFrame of Points avec un simple booléen True/False si le point est présent dans le polygone.
À titre d'exemple, le GeoDataFrame of Polygons est le suivant:
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))
Le GeoDataFrame of Points est comme ceci:
counter points
1 ((-0.17987,51.50974))
2 ((-0.16507,51.50925))
Production attendue:
counter points foo bar
1 ((-0.17987,51.50974)) False False
1 ((-0.16507,51.50925)) False False
Je peux le faire manuellement en:
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
Mais étant donné que j'ai 30 polygones, je me demandais s'il y avait une meilleure façon. Appréciez toute aide!
Je ne sais pas vraiment quel type de structures de données vous avez réellement. De plus, tous vos résultats attendus sont faux, donc c'est un peu difficile à vérifier. En supposant que GeoSeries et GeoDataFrames, je ferais ceci:
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)
Et cela me donne:
geometry bar foo
A POINT (3 3) False False
B POINT (8 8) False True
C POINT (11 11) True True
J'ai trouvé cette bibliothèque en javascript, python et Golang. Pour tous ceux qui pourraient avoir besoin de trouver un point dans les géo-polygones.