He estado tratando de crear una función que básicamente haga lo mismo que la función de "disolución" de QGIS. Pensé que sería súper fácil pero al parecer no. Entonces, por lo que he reunido, el uso de fiona con bien proporcionado debería ser la mejor opción aquí. Empecé a jugar con archivos vectoriales, por lo que este mundo es bastante nuevo para mí y para Python también.
Para este ejemplo, estoy trabajando con un archivo de forma del condado fundado aquí http://tinyurl.com/odfbanu Así que aquí hay un código que reuní pero no puedo encontrar una manera de hacer que trabajen 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. Siéntase libre de 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.
Entonces, la escritura no es sencilla de lo que he visto, realmente solo quiero que el mismo archivo de forma solo con el país se disuelva en estados, ni siquiera necesito mucho de la tabla de atributos, pero tengo curiosidad por ver cómo puedes pasar desde la fuente hasta el nuevo shapefile creado.
Encontré muchas piezas de código para escribir con Fiona, pero nunca puedo hacer que funcione 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.
Recomiendo GeoPandas para tratar grandes surtidos de características y realizar operaciones masivas.
Extiende los marcos de datos de Pandas y los utiliza de forma bien debajo del capó.
fuente
Como un apéndice a la respuesta de @ gene , necesitaba disolverlo en más de un campo, por lo que modifiqué su código para manejar múltiples campos. El siguiente código se utiliza
operator.itemgetter
para agrupar por múltiples campos:fuente