Conversion d'énormes multipolygones en polygones

9

J'ai un fichier de formes avec des énormes multipolygones, avec 100 000 pièces. Quelle serait la façon la plus simple de les diviser en polygones à une seule partie? Je recherche quelque chose comme la fonction QGIS «Multipart to singlepart», mais le fichier est trop volumineux pour que QGIS puisse le gérer. Je suppose qu'il existe probablement déjà un module Python qui peut le faire pour moi. Des conseils?

Leo
la source
Avez-vous la possibilité de charger la couche dans PostGIS?
Obtenez Spatial
Dans quoi votre couche est-elle stockée maintenant? Il se pourrait que la modification de votre format de stockage lui permette de fonctionner dans QGIS, ne tenant compte que des différences d'efficacité.
Get Spatial
1
C'est dans un fichier de formes, donc la solution de @ Barrett ci-dessous est parfaite!
leo

Réponses:

11

Les Shapefiles n'ont pas de type MultiPolygon (type = Polygon), mais ils les supportent quand même (tous les anneaux sont stockés dans un seul polygone = liste de polygones, regardez GDAL: ESRI Shapefile )

C'est plus facile avec Fiona et 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)
              })
gène
la source
12

à partir de la liste de diffusion GDAL en utilisant 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
la source