Chuyển đổi đa giác lớn thành đa giác


8

Tôi có một shapefile với một số lượng lớn, với 100.000 phần. Điều gì sẽ là cách dễ nhất để phân chia chúng thành đa giác một phần? Tôi đang tìm kiếm một cái gì đó giống như chức năng Multipart đến một phần của QGIS, nhưng tệp này rất lớn để QGIS xử lý. Tôi đoán rằng có lẽ đã có một số mô-đun Python có thể làm điều đó cho tôi. Bất cứ lời khuyên?


Bạn có tùy chọn tải lớp vào PostGIS không?
Nhận không gian

Lớp của bạn được lưu trữ trong bây giờ là gì? Có thể là việc thay đổi định dạng lưu trữ của bạn sẽ cho phép nó hoạt động trong QGIS, chỉ chiếm sự khác biệt về hiệu quả.
Nhận không gian

1
Đó là trong một shapefile, vì vậy giải pháp của @ Barrett dưới đây là hoàn hảo!
leo

Câu trả lời:


11

Shapefile không có loại MultiPolygon (type = Polygon), nhưng dù sao chúng cũng hỗ trợ chúng (tất cả các vòng được lưu trữ trong một đa giác = danh sách đa giác, hãy xem GDAL: ESRI Shapefile )

Nó dễ dàng hơn với FionaShapely :

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

từ danh sách gửi thư GDAL bằng 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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.