Ich versuche herauszufinden, wo mehrere Linien ein Polygon für zwei verschiedene Geodatenrahmen schneiden:
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])
So sehen die obigen Geodatenrahmen aus (einer hat ein Polygon und der andere hat zwei Linien). Es sieht für mich so aus, als ob beide Linien das Polygon schneiden:
Die Schnittmenge ist jedoch sehr verwirrend:
print(line_gdf.intersects(poly_gdf))
0 Richtig
1 Falsch
print(line1.intersects(polygon))
print(line2.intersects(polygon))
Wahr
Wahr
Warum gibt die geopandas
intersect
Methode eine andere Ausgabe als die Standardmethode aus shapely
?
Ich verwende Python 3.5.3 und Geopandas 0.2.1 alle auf Anaconda.
python
intersection
shapely
geopandas
bgordon
quelle
quelle
print(line.intersects(polygon))
Sie greifen auf eine Variable zu, die meines Erachtens nicht definiert ist. Sie habenline1
undline2
früher im Code definiert. Ich weiß nicht, warum das True zurückgeben würde.print(line.intersects(polygon))
war ein Tippfehler. Ich habe die Frage aktualisiert, um darauf zu verweisen,line1
was ich ursprünglich gemeint habe.line_gdf.info
bestätigt, dass Sie nur eine einzige Geometriespalte haben. Ich bin ratlos. Ich werde nachgehen, wenn ich etwas finde.Antworten:
Beim Vergleich von Geodatenrahmen mit Geometrieoperationen in Geopandas werden die Geometrien zunächst nach Index abgeglichen. Wenn es keinen passenden Index gibt (weil Sie zum Beispiel nur ein einziges Polygon haben), ist das Ergebnis
False
.Wenn Sie jedes Objekt in der vergleichen
GeoSeries
würden, müssten Sie stattdessen einen vollständigen rechteckigen Datenrahmen mit booleschen Werten zurückerhalten, und dies wäre wahrscheinlich sehr ineffizient.Wenn Sie alle Geometrien vergleichen möchten, haben Sie zwei Möglichkeiten. Die erste (und wahrscheinlich einfachste)
sjoin
Methode ist die Verwendung der Geopandas- Methode:Dies gibt eine neue zurück,
GeoDataFrame
wobei die Geometrien für jedes Objekt im linken Datenrahmen für jede Geometrie wiederholt werden, die sie rechts schneiden, wobei der Index des Objekts rechts angezeigt wird, dh:Die zweite Methode ist für uns die Pandas-
apply
MethodeGeoSeries
, um den rechteckigen Datenrahmen zurückzugeben:Was wiederum zurückkehrt (mit zunehmender Ineffizienz, wenn die Datenrahmen wachsen):
Im Allgemeinen würde ich mich an die
sjoin
Methode halten, es sei denn, Sie benötigen die quadratische Matrix .quelle