mejor manera de duplicar una capa usando ogr en python?

8

Estoy dividiendo un archivo de forma grande en muchos más pequeños usando ogr. Me gustaría copiar toda la información de configuración de campo y capa del original. Así es como lo estoy haciendo ahora:

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

¿Hay una manera más sucinta de hacer esto?

usuario2076663
fuente

Respuestas:

10

Utilice Fiona de Sean Gillies, un contenedor muy simple de la biblioteca de OGR ( Manual de usuario de Fiona )

Todos los elementos de un shapefile (esquema, registros) se procesan utilizando diccionarios Python:

esquema de uno de mis shapefiles como ejemplo:

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

un registro en el archivo de forma:

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

para duplicar un archivo de forma:

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 desea dividir un archivo de forma grande en muchos más pequeños, todo tiene lugar en el bucle for pero todos los esquemas del archivo de forma original se conservan en el diccionario con schema = input.schema.copy()y{'properties': elem['properties']

ver ¿Cómo encuentro el rumbo de línea vectorial en QGIS o GRASS? por un ejemplo de

  1. dividir un archivo de forma
  2. preservar los atributos del archivo de forma original en el archivo de forma dividida
  3. y agregue un nuevo campo en el archivo de forma dividido

Para usuarios de Mac OS X o Linux, es fácil de instalar. Para usuarios de Windows, use la versión de Christoph Gohlke Binarios no oficiales de Windows para paquetes de extensión de Python

gene
fuente
Me gustó mucho la simplicidad de Fiona. Pero me encontré con el problema de que Fiona 1.6 no funciona con GDAL 2. Con suerte, actualizarán eso ...
Akhorus
0

Para aquellos que luchan por instalar las bibliotecas anteriores:

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
fuente