meilleure façon de dupliquer une couche en utilisant ogr en python?

8

Je divise un grand fichier de formes en plusieurs plus petits en utilisant ogr. Je voudrais simplement copier toutes les informations de configuration de champ et de couche de l'original. Voici comment je le fais maintenant:

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

Existe-t-il une manière plus succincte de procéder?

user2076663
la source

Réponses:

10

Utilisez Fiona de Sean Gillies, un wrapper très simple de la bibliothèque OGR ( The Fiona User Manual )

Tous les éléments d'un fichier de formes (schéma, enregistrements) sont traités à l'aide de dictionnaires Python:

schéma d'un de mes fichiers de formes comme exemple:

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

un enregistrement dans le fichier de formes:

{'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'}}

donc pour dupliquer un fichier de formes:

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

Si vous souhaitez diviser un grand fichier de formes en plusieurs plus petits, tout se déroule dans la boucle for mais tous les schémas du fichier de formes d'origine sont conservés dans le dictionnaire avec schema = input.schema.copy()et{'properties': elem['properties']

voir Comment trouver le relèvement d'une ligne vectorielle dans QGIS ou GRASS? pour un exemple de

  1. fractionnement d'un fichier de formes
  2. conserver les attributs du fichier de formes d'origine dans le fichier de formes fractionné
  3. et ajouter un nouveau champ dans le fichier de formes divisé

Pour les utilisateurs de Mac OS X ou Linux, il est facile à installer. Pour les utilisateurs de Windows, utilisez la version de Christoph Gohlke Unofficial Windows Binaries for Python Extension Packages

gène
la source
J'ai beaucoup aimé la simplicité de Fiona. Mais je suis tombé sur le problème que Fiona 1.6 ne fonctionne pas avec GDAL 2. J'espère qu'ils
mettront à
0

Pour ceux qui ont du mal à installer les bibliothèques ci-dessus:

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
la source