巨大なマルチポリゴンをポリゴンに変換する


8

100.000のパーツを持ついくつかの巨大なマルチポリゴンを持つシェープファイルがあります。それらを単一パーツのポリゴンに分割する最も簡単な方法は何でしょうか?QGISの「マルチパートからシングルパート」関数のようなものを探していますが、QGISが処理するにはファイルが大きすぎます。私のためにそれを行うことができるいくつかのPythonモジュールがおそらくすでにあると思います。任意のヒント?


レイヤーをPostGISに読み込むオプションはありますか?
空間を取得

現在、どのレイヤーに保存されていますか?ストレージ形式を変更すると、効率の違いを考慮して、QGISで動作するようになる可能性があります。
空間を取得

1
これはシェープファイルにあるため、以下の@Barrettのソリューションは完璧です!
レオ2014

回答:


11

シェープファイルにはタイプMultiPolygon(type = Polygon)はありませんが、とにかくサポートします(すべてのリングは1つのポリゴンに格納されます=ポリゴンのリスト、GDAL:ESRI Shapefileを参照してください)

フィオナシェイプリーの方が簡単です

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

11

Pythonを使用してGDALメーリングリストから

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)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.