Tengo un shapefile con algunos multipolígonos enormes, con 100.000 partes. ¿Cuál sería la forma más fácil de dividirlos en polígonos de una sola parte? Estoy buscando algo como la función "Multipart to singlepart" de QGIS, pero el archivo es demasiado grande para que QGIS lo maneje. Supongo que probablemente ya exista algún módulo de Python que pueda hacerlo por mí. ¿Algún consejo?
Respuestas
¿Demasiados anuncios?
Barrett
Puntos
1430
De Lista de correo de GDAL usando python
import os
from osgeo import ogr
def multipoly2poly(in_lyr, out_lyr):
for in_feat in in_lyr:
geom = in_feat.GetGeometryRef()
if geom.GetGeometryName() == 'MULTIPOLYGON':
for geom_part in geom:
addPolygon(geom_part.ExportToWkb(), out_lyr)
else:
addPolygon(geom.ExportToWkb(), out_lyr)
def addPolygon(simplePolygon, out_lyr):
featureDefn = out_lyr.GetLayerDefn()
polygon = ogr.CreateGeometryFromWkb(simplePolygon)
out_feat = ogr.Feature(featureDefn)
out_feat.SetGeometry(polygon)
out_lyr.CreateFeature(out_feat)
print 'Polygon added.'
from osgeo import gdal
gdal.UseExceptions()
driver = ogr.GetDriverByName('ESRI Shapefile')
in_ds = driver.Open('data/multipoly.shp', 0)
in_lyr = in_ds.GetLayer()
outputshp = 'data/poly.shp'
if os.path.exists(outputshp):
driver.DeleteDataSource(outputshp)
out_ds = driver.CreateDataSource(outputshp)
out_lyr = out_ds.CreateLayer('poly', geom_type=ogr.wkbPolygon)
multipoly2poly(in_lyr, out_lyr)
Los Shapefiles no tienen el tipo MultiPolígono (tipo = Polígono), pero los soportan de todos modos (todos los anillos se almacenan en un polígono = lista de polígonos, mira GDAL: ESRI Shapefile )
Es más fácil con Fiona y Shapely :
import fiona
from shapely.geometry import shape, mapping
# open the original MultiPolygon file
with fiona.open('multipolygons.shp') as source:
# create the new file: the driver and crs are the same
# for the schema the geometry type is "Polygon" instead
output_schema = dict(source.schema) # make an independant copy
output_schema['geometry'] = "Polygon"
with fiona.open('output.shp', 'w',
driver=source.driver,
crs=source.crs,
schema=output_schema) as output:
# read the input file
for multi in source:
# extract each Polygon feature
for poly in shape(multi['geometry']):
# write the Polygon feature
output.write({
'properties': multi['properties'],
'geometry': mapping(poly)
})
0 votos
¿Tiene la opción de cargar la capa en PostGIS?
0 votos
¿En qué se almacena su capa ahora? Podría ser que el cambio de su formato de almacenamiento permitiera que funcionara en QGIS, simplemente teniendo en cuenta las diferencias de eficiencia.
1 votos
Está en un shapefile, por lo que la solución de @Barrett a continuación es perfecta.