Ich habe einen Geopandas-Datenrahmen in EPSG: 4326 und würde einen neuen Datenrahmen erstellen, der aus allen Zeilen besteht, die in einen bestimmten Begrenzungsrahmen fallen.
Zuerst erhalte ich den Begrenzungsrahmen, der mir wichtig ist (der eigentlich der Begrenzungsrahmen eines anderen Datenrahmens ist):
print df_sussex.total_bounds
[ -1.57239292 50.57467674 0.14528384 51.27465152]
Dann erstelle ich einen Datenrahmen, der nur aus diesem Begrenzungsrahmen besteht:
pts = gpd.GeoDataFrame(df_sussex.total_bounds)
Und schließlich versuche ich, alle Merkmale zu ermitteln, die sich mit diesem Begrenzungsrahmen überschneiden:
sac_sussex = gpd.overlay(pts, df_sac, how='intersection')
Aber das gibt mir AttributeError: No geometry data set yet (expected in column 'geometry'
.
Was mache ich falsch?
Antworten:
Das Problem liegt darin, dass Sie die Methode 'total_bounds' verwenden. Es wird nur ein Tupel mit den Max- und Min-Punkten des Begrenzungsrahmens erzeugt. Die zu verwendende Methode ist "Umschlag". vorher, um seinen jeweiligen 'GeoDataFrame' zu erstellen. Lesen Sie beispielsweise meine Shapefiles als GeoDataFrame :
Erstellen eines Begrenzungsrahmens von pol1 und Erstellen des entsprechenden GeoDataFrame :
Beide GeoDataFrame schneiden :
Darstellungsergebnisse:
Es hat wie erwartet funktioniert.
Bearbeitungshinweis:
Mit der Methode 'total_bounds' (da die Methode 'Envelope' den Begrenzungsrahmen für jedes Merkmal von Polygonen zurückgibt) kann folgender Ansatz verwendet werden:
und Ergebnis ist identisch.
quelle
Sie können die
cx
Methode für einen Geodatenrahmen verwenden, um Zeilen innerhalb eines Begrenzungsrahmens auszuwählen. Für Ihre Beispielrahmen:Von http://geopandas.org/indexing.html :
quelle
.cx
dies etwas anderes als diegpd.overlay
Lösung bewirkt : Es werden Zeilen ausgewählt, die den Begrenzungsrahmen schneiden, aber die Geometrien intakt lassen, während diegpd.overlay
Lösung nur die Teile der Geometrien im Begrenzungsrahmen zurückgibt. Je nach Situation möchten Sie vielleicht das eine oder andere.