melhor maneira de duplicar uma camada usando ogr em python?

8

Estou dividindo um grande arquivo de forma em muitos outros usando ogr. Gostaria apenas de copiar todas as informações de configuração de campo e camada do original. Aqui está como eu estou fazendo isso agora:

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 uma maneira mais sucinta de fazer isso?

user2076663
fonte

Respostas:

10

Use Fiona of Sean Gillies, um invólucro muito simples da biblioteca OGR ( The Fiona User Manual )

Todos os elementos de um shapefile (esquema, registros) são processados ​​usando dicionários Python:

esquema de um dos meus shapefiles como exemplo:

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

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

Se você deseja dividir um arquivo shapefile grande em muitos menores, tudo ocorre no loop for, mas todos os esquemas do shapefile original são preservados no dicionário com schema = input.schema.copy()e{'properties': elem['properties']

consulte Como encontro o rolamento de linhas vetoriais no QGIS ou GRASS? para um exemplo de

  1. dividindo um shapefile
  2. preservar os atributos do shapefile original no shapefile dividido
  3. e adicione um novo campo no shapefile dividido

Para usuários do Mac OS X ou Linux, é fácil de instalar. Para usuários do Windows, use a versão dos binários não oficiais do Christoph Gohlke para pacotes de extensão Python

gene
fonte
Gostava muito da simplicidade de Fiona. Mas eu corri para o problema que Fiona 1.6 não funciona com GDAL 2. Esperemos que eles vão ser atualização que ...
Akhorus
0

Para quem luta para instalar as bibliotecas acima:

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
fonte