11 votos

Conversión de multipolígonos enormes en polígonos

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?

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.

13voto

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)

13voto

GreyCat Puntos 146

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)
              })

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X