Intersezione poligonale linea Geopandas


11

Sto cercando di trovare dove più linee intersecano un poligono per due diversi geodataframe:

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])

Ecco come appaiono i suddetti geodataframe (uno ha un poligono e l'altro ha due linee). Mi sembra che entrambe le linee intersecino il poligono:

Poligono e linee

Tuttavia, l'output dell'intersezione è molto confuso:

print(line_gdf.intersects(poly_gdf))

0 Vero

1 falso

print(line1.intersects(polygon))
print(line2.intersects(polygon))

Vero

Vero

Perché il geopandas intersectmetodo fornisce un output diverso da quello standard shapely?

Sto usando Python 3.5.3 e Geopandas 0.2.1 tutti su Anaconda.


Quando dici print(line.intersects(polygon))che accedi a una variabile che non è definita per quanto posso vedere. Hai definito line1e line2prima nel codice. Non so perché ciò restituisca True.
Paul,

2
Vorrei sapere anche la risposta a questo. Sembra che puoi assegnare una sola colonna geometrica a un geodataframe. Penso che il tuo frame di dati line_gdf tenti di aggiungere due colonne geometriche. Scopri geopandas.org/data_structures.html#geodataframe
Paul

@Paul mie scuse, print(line.intersects(polygon))era un errore di battitura. Ho aggiornato la domanda per fare riferimento a line1ciò che intendevo inizialmente.
bgordon,

@Paul Posso vedere dalla documentazione come avere due colonne geometriche possa causare un problema, ma non sono sicuro del perché due colonne geometriche vengano aggiunte in primo luogo.
bgordon,

line_gdf.infoconferma che hai una sola colonna geometrica. Sono perplesso. Ti seguirò se trovo qualcosa.
Paul,

Risposte:


7

Quando si confrontano i geodataframe con le operazioni di geometria in Geopanda, le geometrie vengono prima abbinate per indice. Nel caso in cui non ci sia un indice corrispondente (perché hai un solo poligono per esempio), il risultato sarà False.

Se si dovesse confrontare ogni oggetto nell'oggetto GeoSeries, sarebbe invece necessario recuperare un frame di dati completamente rettangolare di valori booleani, e questo sarebbe probabilmente molto inefficiente.

Se vuoi confrontare tutte le geometrie, hai due opzioni. Il primo (e probabilmente il più semplice) è usare il sjoinmetodo geopandas :

gpd.sjoin(line_gdf, poly_gdf, op='intersects')

Ciò restituisce un nuovo GeoDataFramecon le geometrie per ciascun oggetto sul frame di dati sinistro ripetuto per ogni geometria che intersecano a destra, con l'indice dell'oggetto a destra, ovvero:

                        geometry  index_right
0  LINESTRING (0.5 0.5, 0.7 0.7)            0
1  LINESTRING (0.9 0.9, 0.2 0.6)            0

Il secondo metodo è per noi il applymetodo panda sul GeoSeriesper restituire il frame di dati rettangolare:

line_gdf.geometry.apply(lambda g: poly_gdf.intersects(g))

Che a sua volta restituisce (con crescente inefficienza all'aumentare dei frame di dati):

index_right     0
index_left
0            True
1            True

In generale, a meno che tu non abbia bisogno della matrice quadrata, il mio consiglio sarebbe di attenersi al sjoinmetodo.

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.