8 votos

¿mejor manera de duplicar una capa usando ogr en python?

Estoy dividiendo un shapefile grande en muchos más pequeños usando ogr. Me gustaría copiar toda la información de configuración de campos y capas 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())]

¿Existe una forma más sucinta de hacerlo?

11voto

GreyCat Puntos 146

Utilice Fiona de Sean Gillies , una envoltura muy simple de la biblioteca OGR ( Manual del usuario de Fiona )

Todos los elementos de un shapefile (esquema, registros) se procesan mediante diccionarios de 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 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'}}

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

Si quieres dividir un shapefile grande en muchos más pequeños, todo tiene lugar en el bucle for pero todos los esquemas del shapefile original se conservan en el diccionario con schema = input.schema.copy() y {'properties': elem['properties']

véase ¿Cómo puedo encontrar el rumbo vectorial en QGIS o GRASS? para un ejemplo de

  1. dividir un shapefile
  2. conservar los atributos del shapefile original en el shapefile dividido
  3. y añadir un nuevo campo en el shapefile dividido

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

0 votos

Me gustó mucho la simplicidad de Fiona. Pero me encontré con el problema de que Fiona 1.6 no funciona con GDAL 2. Esperemos que lo actualicen...

0voto

Coombesy Puntos 350

Para aquellos que tienen dificultades para 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')

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X