Besserer Weg, um eine Ebene mit ogr in Python zu duplizieren?

8

Ich teile ein großes Shapefile mit ogr in viele kleinere auf. Ich möchte einfach alle Feld- und Layer-Konfigurationsinformationen vom Original kopieren. So mache ich es jetzt:

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

Gibt es einen prägnanteren Weg, dies zu tun?

user2076663
quelle

Antworten:

10

Verwenden Sie Fiona von Sean Gillies, einen sehr einfachen Wrapper der OGR-Bibliothek ( The Fiona User Manual ).

Alle Elemente eines Shapefiles (Schema, Datensätze) werden mit Python-Wörterbüchern verarbeitet:

Schema eines meiner Shapefiles als Beispiel:

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

Ein Datensatz im 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'}}

So duplizieren Sie ein 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']))})

Wenn Sie ein großes Shapefile in viele kleinere aufteilen möchten, findet alles in der for-Schleife statt, aber alle Schemata des ursprünglichen Shapefiles bleiben im Wörterbuch mit schema = input.schema.copy()und erhalten{'properties': elem['properties']

Siehe Wie finde ich die Vektorlinienpeilung in QGIS oder GRASS? für ein Beispiel von

  1. Teilen eines Shapefiles
  2. Behalten Sie die Attribute des ursprünglichen Shapefiles im geteilten Shapefile bei
  3. und fügen Sie ein neues Feld in das geteilte Shapefile ein

Für Mac OS X- oder Linux-Benutzer ist die Installation einfach. Verwenden Sie für Windows-Benutzer die Version der inoffiziellen Windows-Binärdateien von Christoph Gohlke für Python-Erweiterungspakete

Gen
quelle
Mochte Fionas Einfachheit sehr. Aber ich bin auf das Problem
gestoßen,
0

Für diejenigen, die Schwierigkeiten haben, die oben genannten Bibliotheken zu installieren:

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
quelle