Ho cercato di creare una funzione che fa sostanzialmente la stessa cosa che la funzione "dissolve" di QGIS. Ho pensato che sarebbe stato semplicissimo ma apparentemente no. Quindi, da quello che ho raccolto in giro, l'uso di fiona con Shapely dovrebbe essere l'opzione migliore qui. Ho appena iniziato a scherzare con i file vettoriali, quindi questo mondo è abbastanza nuovo per me e anche per Python.
Per questo esempio, sto lavorando con uno shapefile di contea fondato qui http://tinyurl.com/odfbanu Quindi ecco alcuni frammenti di codice che ho raccolto ma non riesco a trovare un modo per farli lavorare insieme
Per ora il mio metodo migliore è il seguente basato su: https://sgillies.net/2009/01/27/a-more-perfect-union-continued.html . Funziona bene e ottengo un elenco dei 52 stati come geometria Shapely. Non esitate a commentare se esiste un modo più semplice per fare questa parte.
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.
Quindi la scrittura non è davvero semplice da quello che ho visto, voglio solo lo stesso shapefile solo con il paese che si dissolve in stati, non ho nemmeno bisogno di gran parte della tabella degli attributi ma sono curioso di vedere come puoi passare dalla sorgente al nuovo shapefile creato.
Ho trovato molti pezzi di codice per scrivere con Fiona ma non sono mai riuscito a farlo funzionare con i miei dati. Esempio da Come scrivere geometrie Shapely su shapefile? :
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},
})
Il problema qui è come fare lo stesso con un elenco di geometrie e come ricreare le stesse proprietà rispetto all'origine.