Duplicar camada na memória usando pyqgis?

9

Eu tenho uma camada no QGIS e quero duplicá-la por meio de um plug-in para poder usar a cópia conforme desejar, sem modificar o original.

É claro layer2 = layer1que não funcionará, porque tudo o que acontece com a camada2 também acontecerá com a camada1, pois é o mesmo objeto por trás de tudo isso.

A única maneira de encontrar isso é:

QgsVectorFileWriter.writeAsVectorFormat(layer1,r"C:\Users\ABC\AppData\Local\Temp\NewLayer.shp","utf-8",None,"ESRI Shapefile")
layer2 = QgsVectorLayer("C:\Users\ABC\AppData\Local\Temp\NewLayer.shp","New vector","ogr")
#do something with layer2

Existe uma maneira simples de duplicar a camada na memória, sem precisar escrever um novo arquivo?

Ril8772
fonte

Respostas:

10

O código a seguir funciona para mim no console Python e no plug-in. Ele pega os recursos da camada de entrada de origem e copia os atributos para uma camada de memória (nesse caso, uma camada de polígono, mas você pode alterá-la para LineStringou Pointdependendo do tipo de camada):

layer = QgsVectorLayer("path/to/layer", "polygon", "ogr")
feats = [feat for feat in layer.getFeatures()]

mem_layer = QgsVectorLayer("Polygon?crs=epsg:4326", "duplicated_layer", "memory")

mem_layer_data = mem_layer.dataProvider()
attr = layer.dataProvider().fields().toList()
mem_layer_data.addAttributes(attr)
mem_layer.updateFields()
mem_layer_data.addFeatures(feats)

QgsMapLayerRegistry.instance().addMapLayer(mem_layer)
Joseph
fonte
1
Tudo bem, eu conhecia esse, apenas acho um pouco longo (em termos de linhas de código). Mas acho que é a única maneira de fazê-lo; obrigado pela resposta :)
Ril8772
1
@ Ril8772 - Muito bem-vindo! Não tenho certeza se ele é o único caminho, mas é a única maneira que eu sei =)
Joseph
6

No QGIS 3, você pode fazer uma cópia de uma camada sem salvar nenhuma referência à camada pai desta maneira:

layer.selectAll()
clone_layer = processing.run("native:saveselectedfeatures", {'INPUT': layer, 'OUTPUT': 'memory:'})['OUTPUT']

A classe QgsVectorLayer possui uma função clone () que permite clonar a camada em uma nova camada, o problema é que, se você modificar a geometria na camada clonada, a camada original será afetada: a razão disso é que a fonte de dados é o mesmo para a camada original e a camada clonada.

Leo Cardona
fonte