web-dev-qa-db-fra.com

point de géopandas dans le polygone

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!

9
Kvothe

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
15
Paul H

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.

http://www.navlab.net/nvector/

0
jolly