Tengo un marco de datos geopandas en EPSG: 4326 y crearía un nuevo marco de datos que consta de todas las filas que se encuentran dentro de un cuadro delimitador determinado.
Primero obtengo el cuadro delimitador que me interesa (que en realidad es el cuadro delimitador de otro marco de datos):
print df_sussex.total_bounds
[ -1.57239292 50.57467674 0.14528384 51.27465152]
Luego hago un marco de datos que consta solo de ese cuadro delimitador:
pts = gpd.GeoDataFrame(df_sussex.total_bounds)
Y finalmente trato de obtener todas las características que se cruzan con ese cuadro delimitador:
sac_sussex = gpd.overlay(pts, df_sac, how='intersection')
Pero esto me da AttributeError: No geometry data set yet (expected in column 'geometry'
.
¿Qué estoy haciendo mal?
Respuestas:
El problema se debe a que está utilizando el método 'total_bounds'. Solo produce una tupla con puntos máximo y mínimo de cuadro delimitador. El método a utilizar es 'sobre'; anterior para construir su respectivo 'GeoDataFrame'. Por ejemplo, leyendo mis archivos de forma como GeoDataFrame :
Construyendo el cuadro delimitador de pol1 y creando su respectivo GeoDataFrame :
Intersección de ambos GeoDataFrame :
Trazado de resultados:
Funcionó como se esperaba.
Nota de edición:
Al usar el método 'total_bounds' (porque el método 'envolvente' devuelve el cuadro delimitador para cada característica de los polígonos), se puede usar este enfoque:
Y el resultado es idéntico.
fuente
Puede usar el
cx
método en un geodataframe para seleccionar filas dentro de un cuadro delimitador. Para sus marcos de ejemplo:De http://geopandas.org/indexing.html :
fuente
.cx
hace algo ligeramente diferente a lagpd.overlay
solución: selecciona filas que se cruzan con el cuadro delimitador pero deja las geometrías intactas, mientras que lagpd.overlay
solución solo devolverá las partes de las geometrías en el cuadro delimitador. Dependiendo de la situación, es posible que desee uno u otro.