Ich habe versucht, eine Funktion zu erstellen, die im Grunde dasselbe tut, was die QGIS-Funktion "auflöst". Ich dachte es wäre super einfach aber naja anscheinend nicht. Nach allem, was ich gesammelt habe, sollte der Einsatz von Fiona mit Shapely hier die beste Option sein. Ich habe gerade angefangen, mit Vektordateien herumzuspielen, also ist diese Welt für mich und auch für Python ziemlich neu.
Für dieses Beispiel arbeite ich mit einem Kreis Shape - Datei hier gegründet http://tinyurl.com/odfbanu so bin hier einiges Stück Code , den ich gesammelt, kann aber nicht einen Weg finden , um sie zusammen zu machen arbeiten
Im Moment ist meine beste Methode die folgende, basierend auf: https://sgillies.net/2009/01/27/a-more-perfect-union-continued.html . Es funktioniert gut und ich bekomme eine Liste der 52 Zustände als Shapely-Geometrie. Bitte zögern Sie nicht zu kommentieren, wenn es einen einfacheren Weg gibt, diesen Teil zu tun.
from osgeo import ogr
from shapely.wkb import loads
from numpy import asarray
from shapely.ops import cascaded_union
ds = ogr.Open('counties.shp')
layer = ds.GetLayer(0)
#create a list of unique states identifier to be able
#to loop through them later
STATEFP_list = []
for i in range(0 , layer.GetFeatureCount()) :
feature = layer.GetFeature(i)
statefp = feature.GetField('STATEFP')
STATEFP_list.append(statefp)
STATEFP_list = set(STATEFP_list)
#Create a list of merged polygons = states
#to be written to file
polygons = []
#do the actual dissolving based on STATEFP
#and append polygons
for i in STATEFP_list :
county_to_merge = []
layer.SetAttributeFilter("STATEFP = '%s'" %i )
#I am not too sure why "while 1" but it works
while 1:
f = layer.GetNextFeature()
if f is None: break
g = f.geometry()
county_to_merge.append(loads(g.ExportToWkb()))
u = cascaded_union(county_to_merge)
polygons.append(u)
#And now I am totally stuck, I have no idea how to write
#this list of shapely geometry into a shapefile using the
#same properties that my source.
Das Schreiben ist also wirklich nicht direkt von dem, was ich gesehen habe, ich möchte wirklich nur dasselbe Shapefile mit dem Land in Staaten auflösen, ich brauche nicht einmal viel von der Attributtabelle, aber ich bin gespannt, wie Sie weitergeben können Von der Quelle bis zum neu erstellten Shapefile.
Ich habe viele Codeteile zum Schreiben mit fiona gefunden, kann sie aber mit meinen Daten nie zum Laufen bringen. Beispiel aus Wie schreibe ich Shapely-Geometrien in Shapefiles? :
from shapely.geometry import mapping, Polygon
import fiona
# Here's an example Shapely geometry
poly = Polygon([(0, 0), (0, 1), (1, 1), (0, 0)])
# Define a polygon feature geometry with one attribute
schema = {
'geometry': 'Polygon',
'properties': {'id': 'int'},
}
# Write a new Shapefile
with fiona.open('my_shp2.shp', 'w', 'ESRI Shapefile', schema) as c:
## If there are multiple geometries, put the "for" loop here
c.write({
'geometry': mapping(poly),
'properties': {'id': 123},
})
Das Problem hierbei ist, wie Sie dasselbe mit einer Geometrieliste tun und dieselben Eigenschaften wie mit der Quelle neu erstellen.
Ich kann GeoPandas nur empfehlen, wenn Sie mit einer großen Auswahl an Funktionen arbeiten und Massenoperationen ausführen möchten.
Es erweitert Pandas Datenrahmen und wird formschön unter der Haube verwendet.
quelle
Als Ergänzung zu @ genes Antwort musste ich mich um mehr als ein Feld auflösen , also änderte ich seinen Code, um mehrere Felder zu verarbeiten. Der folgende Code wird
operator.itemgetter
zum Gruppieren nach mehreren Feldern verwendet:quelle