4 votos

GeoPandas intersects no encuentra ninguna intersección

Quiero comprobar si la capa de puntos que tengo se cruza con la capa de polígonos que tengo, como columna booleana en el dataframe de puntos.
Tengo dos marcos de datos GeoPandas, el primero tiene muchos puntos y se ve así:

>>>ID  geometry
0  12  POINT (5.0279 7.4547)
1  45  POINT (6.6539 12.139)
...

y el segundo marco de datos es una capa de muchos polígonos diferentes que se parece a esto:

>>>name     code   geometry
0  Desert   12     POLYGON ((5.52013 13.8902, 5.5265 13.892,...)
1  Water    24     POLYGON ((5.53756 13.88472, 5.5291 13.8791,...)
...

Intento comprobar si hay alguna intersección entre la capa de puntos y la capa de regiones. Para ello he determinado los crs y luego he utilizado intersects :

regions=regions.to_crs({'init': 'epsg:4326'})
points=points.set_crs({'init': 'epsg:4326'})
inter=points.geometry.intersects(regions.geometry)

A El script se ejecuta con las siguientes advertencias:

Aviso de futuro: '+init=: ' syntax is deprecated. ':' is the preferred initialization method. When making the change, be mindful of axis order changes: https://pyproj4.github.io/pyproj/stable/gotchas.html#axis-order-changes-in-proj-6 return _prepare_from_string(" ".join(pjargs)) /opt/conda/lib/python3.8/site-packages/geopandas/base.py:39: UserWarning: The indices of the two GeoSeries are different. warn("The indices of the two GeoSeries are different.")

`

Then when I check the results the only value is False, like all th epoints do not intersect:

`

inter.unique().tolist()
>>>[False]

*He visto en QGIS que hay puntos que se cruzan y hay puntos que no lo hacen por lo que no hay manera de que este resultado sea cierto

*He comprobado los dtypes - cada uno de mis geodataframes tiene una columna que es geometría y se llama geometría.

Mi objetivo final: añadir una nueva columna en el geodataframe de puntos que diga si intersecta las regiones o no.

9voto

King Puntos 118

Intersects es una operación de filas que alinea ambas GeoSeries y comprueba si una geometría A en la fila 0 interseca la geometría B en la fila 0. Consulte la documentación al respecto: https://geopandas.readthedocs.io/en/stable/docs/reference/api/geopandas.GeoSeries.intersects.html#geopandas.GeoSeries.intersects

Para comprobar si hay alguna intersección, utilice el índice espacial.

import numpy as np

inp, res = regions.sindex.query_bulk(points.geometry, predicate='intersects')
points['intersects'] = np.isin(np.arange(0, len(points)), inp)

En cuanto a la advertencia del SIR, sólo hay que eliminar init y pasarlo como una cadena.

regions=regions.to_crs('epsg:4326')
points=points.set_crs('epsg:4326')

query_bulk requiere geopandas 0.8. Puede consultar la documentación - https://geopandas.readthedocs.io/en/stable/docs/reference/api/geopandas.sindex.SpatialIndex.query_bulk.html#geopandas.sindex.SpatialIndex.query_bulk

0 votos

Gracias por tu respuesta, el problema es que aunque las columnas de geometría son de tipo geometría, cuando lo intento me da error "TypeError: Got geometry de tipo <class 'str'> , geometry debe ser una geometría bien formada".

0 votos

Esto significa que su columna de geometría contiene cadenas en lugar de shapely.geometry. Tendrás que convertir las incorrectas. Véase stackoverflow.com/questions/56433138/

0 votos

@martinflies eso no funciona ,TypeError: Only str is accepted. and the dtype is geometry so I'm not sure how can it have string, if you could elaborate regard this that could be great, probably something that Id on't understand

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X