Estoy tratando de encontrar dónde varias líneas se cruzan con un polígono para dos geodataframes diferentes:
from shapely.geometry import Polygon, LineString
import geopandas as gpd
polygon = Polygon([(0, 0), (1, 0), (1, 1), (0, 1), (0, 0)])
line1 = LineString([(0.5, 0.5), (0.7, 0.7)])
line2 = LineString([(0.9, 0.9), (0.2, 0.6)])
poly_gdf = gpd.GeoDataFrame(geometry=[polygon])
line_gdf = gpd.GeoDataFrame(geometry=[line1, line2])
Así es como se ven los geodataframes anteriores (uno tiene un polígono y el otro tiene dos líneas). Me parece que ambas líneas se cruzan con el polígono:
Sin embargo, la salida de intersección es muy confusa:
print(line_gdf.intersects(poly_gdf))
0 verdadero
1 falso
print(line1.intersects(polygon))
print(line2.intersects(polygon))
Cierto
Cierto
¿Por qué el geopandas
intersect
método da un resultado diferente al estándar shapely
?
Estoy usando Python 3.5.3 y Geopandas 0.2.1, todo en Anaconda.
python
intersection
shapely
geopandas
bgordon
fuente
fuente
print(line.intersects(polygon))
que tienes acceso a una variable que no está definida hasta donde puedo ver. Has definidoline1
yline2
anteriormente en el código. No sé por qué eso volvería Verdadero.print(line.intersects(polygon))
fue un error tipográfico. He actualizado la pregunta para referirme aline1
qué es lo que quise decir originalmente.line_gdf.info
confirma que solo tiene una columna de geometría única. Estoy perplejo. Seguiré si encuentro algo.Respuestas:
Al comparar geodataframes con operaciones de geometría en Geopandas, las geometrías primero coinciden por índice. En el caso de que no haya un índice coincidente (porque solo tiene un solo polígono, por ejemplo), entonces el resultado será
False
.Si se comparara cada objeto en el
GeoSeries
, necesitaría recuperar un marco de datos rectangular completo de valores booleanos, y esto probablemente sería muy ineficiente.Si desea comparar todas las geometrías, tiene dos opciones. El primero (y probablemente el más fácil) es usar el
sjoin
método de geopandas :Esto devuelve un nuevo
GeoDataFrame
con las geometrías para cada objeto en el marco de datos izquierdo repetido para cada geometría que se cruzan en la derecha, con el índice del objeto en la derecha, es decir:El segundo método es para nosotros el
apply
método pandasGeoSeries
para devolver el marco de datos rectangular:Lo que a su vez regresa (con una creciente ineficiencia a medida que crecen los marcos de datos):
En general, a menos que necesite la matriz cuadrada, mi consejo sería seguir el
sjoin
método.fuente