He estado intentando crear una función que haga básicamente lo mismo que la función "disolver" de QGIS. Pensé que sería super fácil pero bueno al parecer no. Así que de lo que he reunido alrededor, el uso de fiona con shapely debe ser la mejor opción aquí. Acabo de empezar a trastear con archivos vectoriales así que este mundo es bastante nuevo para mi y python también.
Para este ejemplo, estoy trabajando con un shapefile del condado fundado aquí http://tinyurl.com/odfbanu Así que aquí están algunas piezas de código que reuní, pero no puedo encontrar una manera de hacer que funcionen juntos
Por ahora mi mejor método es el siguiente basado en : https://sgillies.net/2009/01/27/a-more-perfect-union-continued.html . Funciona bien y obtengo una lista de los 52 estados como geometría Shapely. Por favor, no dude en comentar si hay una manera más directa de hacer esta 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.
Así que la escritura no es realmente sencillo de lo que he visto, en realidad sólo quiero el mismo shapefile sólo con el país disolver en los estados, ni siquiera necesito mucho de la tabla de atributos, pero tengo curiosidad por ver cómo se puede pasar de la fuente a la nueva shapefile creado.
He encontrado muchos trozos de código para escribir con fiona pero nunca soy capaz de hacerlo funcionar con mis datos. Ejemplo de ¿Cómo escribir geometrías Shapely en 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},
})
El problema aquí es cómo hacer lo mismo con una lista de geometría y cómo recrear las mismas propiedades que la fuente.