cara yang lebih baik untuk menduplikasi layer menggunakan ogr di python?

8

Saya membagi shapefile besar menjadi banyak yang lebih kecil menggunakan ogr. Saya hanya ingin menyalin semua informasi konfigurasi bidang dan lapisan dari aslinya. Begini cara saya melakukannya sekarang:

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())]

Apakah ada cara yang lebih ringkas untuk melakukan ini?

pengguna2076663
sumber

Jawaban:

10

Gunakan Fiona dari Sean Gillies, pembungkus yang sangat sederhana dari perpustakaan OGR ( The Fiona User Manual )

Semua elemen dari shapefile (skema, catatan) diproses menggunakan kamus Python:

skema salah satu shapefile saya sebagai contoh:

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

satu catatan di 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'}}

jadi untuk menduplikasi sebuah 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']))})

Jika Anda ingin membagi shapefile besar menjadi banyak yang lebih kecil, semuanya terjadi di loop for tetapi semua skema dari shapefile asli disimpan dalam kamus dengan schema = input.schema.copy()dan{'properties': elem['properties']

lihat Bagaimana cara menemukan bantalan garis vektor di QGIS atau GRASS? untuk contoh

  1. membagi shapefile
  2. pertahankan atribut dari shapefile asli dalam shapefile yang terpecah
  3. dan tambahkan bidang baru di shapefile yang terpecah

Untuk pengguna Mac OS X atau Linux, mudah untuk menginstal. Untuk pengguna Windows, gunakan versi Christoph Gohlke Binari Windows Tidak Resmi untuk Paket Ekstensi Python

gen
sumber
Sangat menyukai kesederhanaan Fiona. Tapi saya mengalami masalah bahwa Fiona 1.6 tidak bekerja dengan GDAL 2. Mudah-mudahan mereka akan memperbarui itu ...
Akhorus
0

Bagi mereka yang kesulitan untuk menginstal perpustakaan di atas:

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')
Curtis
sumber