Filtra per riquadro di selezione in Geopandas?


11

Ho un frame di dati geopandas in EPSG: 4326 e creerei un nuovo frame di dati costituito da tutte le righe che rientrano in un determinato riquadro di selezione.

Per prima cosa ottengo il riquadro di selezione a cui tengo (che in realtà è il riquadro di selezione di un altro frame di dati):

print df_sussex.total_bounds
[ -1.57239292  50.57467674   0.14528384  51.27465152]

Quindi creo un frame di dati costituito solo da quel rettangolo di selezione:

pts = gpd.GeoDataFrame(df_sussex.total_bounds)

E infine provo a ottenere tutte le funzionalità che si intersecano con quel rettangolo di selezione:

sac_sussex = gpd.overlay(pts, df_sac, how='intersection')

Ma questo mi dà AttributeError: No geometry data set yet (expected in column 'geometry'.

Che cosa sto facendo di sbagliato?


Il problema è perché stai usando il metodo 'total_bounds'. Produce solo una tupla con punti massimi e minimi di rettangolo di selezione. Il metodo da utilizzare è 'inviluppo'; precedente per costruire il rispettivo GeoDataFrame .
xunilk,

Risposte:


6

Il problema è perché stai usando il metodo 'total_bounds'. Produce solo una tupla con punti massimi e minimi di rettangolo di selezione. Il metodo da utilizzare è 'inviluppo'; precedente per costruire il rispettivo 'GeoDataFrame'. Ad esempio, leggendo i miei shapefile come GeoDataFrame :

import geopandas as gpd
pol1 = gpd.GeoDataFrame.from_file("pyqgis_data/polygon1.shp")
pol8 = gpd.GeoDataFrame.from_file("pyqgis_data/polygon8.shp")

Creazione del riquadro di delimitazione di pol1 e creazione del rispettivo GeoDataFrame :

bounding_box = pol1.envelope
df = gpd.GeoDataFrame(gpd.GeoSeries(bounding_box), columns=['geometry'])

Intersezione di entrambi GeoDataFrame :

intersections = gpd.overlay(df, pol8, how='intersection')

Stampa dei risultati:

from matplotlib import pyplot as plt
plt.ion()
intersections.plot() 

inserisci qui la descrizione dell'immagine

Ha funzionato come previsto.

Nota di modifica:

Usando il metodo 'total_bounds' (perché il metodo 'envelope' restituisce il riquadro di delimitazione per ogni caratteristica dei poligoni), può essere usato questo approccio:

from matplotlib import pyplot as plt
import geopandas as gpd
from shapely.geometry import Point, Polygon

pol1 = gpd.GeoDataFrame.from_file("pyqgis_data/polygon1.shp")
pol8 = gpd.GeoDataFrame.from_file("pyqgis_data/polygon8.shp")

bbox = pol1.total_bounds

p1 = Point(bbox[0], bbox[3])
p2 = Point(bbox[2], bbox[3])
p3 = Point(bbox[2], bbox[1])
p4 = Point(bbox[0], bbox[1])

np1 = (p1.coords.xy[0][0], p1.coords.xy[1][0])
np2 = (p2.coords.xy[0][0], p2.coords.xy[1][0])
np3 = (p3.coords.xy[0][0], p3.coords.xy[1][0])
np4 = (p4.coords.xy[0][0], p4.coords.xy[1][0])

bb_polygon = Polygon([np1, np2, np3, np4])

df2 = gpd.GeoDataFrame(gpd.GeoSeries(bb_polygon), columns=['geometry'])

intersections2 = gpd.overlay(df2, pol8, how='intersection')

plt.ion()
intersections2.plot()

e il risultato è identico.


21

È possibile utilizzare il cxmetodo su un geodataframe per selezionare le righe all'interno di un rettangolo di selezione. Per i tuoi frame di esempio:

xmin, ymin, xmax, ymax = df_sussex.total_bounds
sac_sussex = df_sac.cx[xmin:xmax, ymin:ymax]

Da http://geopandas.org/indexing.html :

Oltre ai metodi panda standard, GeoPandas fornisce anche l'indicizzazione basata su coordinate con l' indicizzatore cx , che suddivide utilizzando un rettangolo di selezione. Verranno restituite le geometrie in GeoSeries o GeoDataFrame che intersecano il rettangolo di selezione.


Questa soluzione ha funzionato per me. Grazie. Tuttavia, mi chiedevo se ci fosse un modo più rapido per implementare. Filtraggio dell'uso del territorio OSM e dei luoghi che rientrano nel riquadro di delimitazione di una provincia.
EFL,

Nota che .cxfa qualcosa di leggermente diverso dalla gpd.overlaysoluzione: seleziona le righe che intersecano il riquadro di delimitazione ma lascia intatte le geometrie, mentre la gpd.overlaysoluzione restituirà solo le parti delle geometrie nel riquadro di delimitazione. A seconda della situazione potresti volere l'uno o l'altro.
danvk,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.