cách tốt hơn để sao chép một lớp bằng cách sử dụng ogr trong python?


8

Tôi đang chia một shapefile lớn thành nhiều phần nhỏ hơn bằng cách sử dụng ogr. Tôi chỉ muốn sao chép tất cả thông tin cấu hình trường và lớp từ bản gốc. Đây là cách tôi đang làm bây giờ:

src = ogr.Open('original.shp', 0)
layer = src.GetLayerByIndex(0)
driver = ogr.GetDriverByName('ESRI Shapefile')
ds = driver.CreateDataSource('file1.shp')
dest_layer = ds.CreateLayer('layer1',
                            srs = layer.GetSpatialRef(),
                            geom_type=layer.GetLayerDefn().GetGeomType())
feature  = layer.GetFeature(0)
[dest_layer.CreateField(feature.GetFieldDefnRef(i)) for i in range(feature.GetFieldCount())]

Có cách nào ngắn gọn hơn để làm điều này?

Câu trả lời:


10

Sử dụng Fiona của Sean Gillies, một trình bao bọc rất đơn giản của thư viện OGR ( Hướng dẫn sử dụng Fiona )

Tất cả các yếu tố của một shapefile (lược đồ, bản ghi) được xử lý bằng từ điển Python:

lược đồ của một trong những shapefiles của tôi làm ví dụ:

{'geometry': 'LineString', 'properties': {u'faille': 'str:20', u'type': 'str:20', u'id': 'int'}}

một bản ghi trong shapefile:

{'geometry': {'type': 'LineString', 'coordinates': [(269884.20917418826, 151805.1917153612), (270409.89083992655, 153146.21637285672), (272298.05355768028, 154047.38494269375), (272941.74539327814, 155484.96337552898), (272169.31519056071, 156117.92701386689)]}, 'id': '1', 'properties': {'faille': u'de Salinas', 'type': u'normale'}}

vì vậy để nhân đôi một shapefile:

from shapely.geometry import mapping, shape
import fiona
# Read the original Shapefile
with fiona.collection('original.shp', 'r') as input:
    # The output has the same schema
    schema = input.schema.copy()
    # write a new shapefile
    with fiona.collection(''file1.shp', 'w', 'ESRI Shapefile', schema) as output:
        for elem in input:
             output.write({'properties': elem['properties'],'geometry': mapping(shape(elem['geometry']))})

Nếu bạn muốn chia một shapefile lớn thành nhiều shapefile nhỏ hơn, mọi thứ diễn ra trong vòng lặp for nhưng tất cả các lược đồ của shapefile ban đầu được giữ nguyên trong từ điển với schema = input.schema.copy(){'properties': elem['properties']

xem Làm thế nào để tôi tìm thấy vectơ mang trong QGIS hoặc GRASS? cho một ví dụ về

  1. tách một shapefile
  2. bảo tồn các thuộc tính của shapefile gốc trong shapefile đã tách
  3. và thêm một trường mới trong shapefile tách

Đối với người dùng Mac OS X hoặc Linux, rất dễ cài đặt. Đối với người dùng Windows, hãy sử dụng phiên bản Christoph Gohlke Windows không chính thức cho các gói mở rộng Python


Thích sự đơn giản của Fiona rất nhiều. Nhưng tôi gặp phải vấn đề là Fiona 1.6 không hoạt động với GDAL 2. Hy vọng họ sẽ nâng cấp điều đó ...
Akhorus

0

Đối với những người đấu tranh để cài đặt các thư viện trên:

import shapefile

r = shapefile.Reader('original') # original shp file
w = shapefile.Writer()

w.fields = list(r.fields)
w._shapes.extend(r.shapes()) # copy over geometry without any changes
w.save('new_shp_file')
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.