Convirtiendo multipolígono enorme en polígonos

8

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 QGIS "Multipart to singlepart", pero el archivo es demasiado grande para que QGIS lo maneje. Supongo que probablemente ya haya algún módulo de Python que pueda hacerlo por mí. ¿Algun consejo?

León
fuente
¿Tiene la opción de cargar la capa en PostGIS?
Obtener espacial
¿Cuál es tu capa almacenada ahora? Podría ser que cambiar su formato de almacenamiento le permitiría trabajar en QGIS, solo teniendo en cuenta las diferencias en la eficiencia.
Consigue espacial el
1
Está en un archivo shape, por lo que la solución de @ Barrett a continuación es perfecta.
leo

Respuestas:

11

Los Shapefiles no tienen el tipo MultiPolygon (type = Polygon), pero de todos modos los admiten (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)
              })
gene
fuente
11

de la lista de correo 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)
Barrett
fuente