Eu tenho tentado criar uma função que faz basicamente a mesma coisa que o QGIS "dissolve" a função. Eu pensei que seria super fácil, mas aparentemente não. Então, pelo que entendi, o uso de fiona com bem torneado deve ser a melhor opção aqui. Eu comecei a mexer com arquivos vetoriais, então esse mundo é bem novo para mim e também para python.
Para este exemplo, estou trabalhando com um shapefile do condado fundado aqui http://tinyurl.com/odfbanu Então, aqui estão alguns trechos de código que reuni, mas não consigo encontrar uma maneira de fazê-los trabalhar juntos
Por enquanto, meu melhor método é o seguinte, com base em: https://sgillies.net/2009/01/27/a-more-perfect-union-continued.html . Funciona bem e recebo uma lista dos 52 estados como geometria Shapely. Por favor, não hesite em comentar se existe uma maneira mais direta de fazer 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.
Portanto, a escrita não é realmente direta do que vi, quero apenas o mesmo arquivo de forma, apenas com o país se dissolvendo em estados, nem preciso muito da tabela de atributos, mas estou curioso para ver como você pode passar desde a fonte até o novo shapefile criado.
Encontrei muitos códigos para escrever com fiona, mas nunca consigo fazê-lo funcionar com meus dados. Exemplo de Como escrever geometrias bem torneadas em 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},
})
O problema aqui é como fazer o mesmo com uma lista de geometria e como recriar as mesmas propriedades que a origem.
Eu recomendo o GeoPandas para lidar com uma grande variedade de recursos e executar operações em massa.
Ele estende os quadros de dados do Pandas e usa bem torneados sob o capô.
fonte
Como um adendo à resposta do @ gene , eu precisava me dissolver em mais de um campo para modificar seu código para lidar com vários campos. O código abaixo utiliza
operator.itemgetter
para agrupar por vários campos:fonte