¿Duplicar la capa en la memoria usando pyqgis?

9

Tengo una capa en QGIS, y quiero duplicarla a través de un complemento para poder usar la copia que desee, sin modificar el original.

Por supuesto layer2 = layer1, no funcionará, porque todo lo que le sucede a la capa2 también le ocurrirá a la capa1, ya que es el mismo objeto detrás de todo esto.

La única forma en que encontré hacerlo es como tal:

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

¿Hay una manera simple de duplicar la capa en la memoria, sin tener que escribir un nuevo archivo?

Ril8772
fuente

Respuestas:

10

El siguiente código me funciona tanto desde la consola de Python como desde el complemento. Toma las características de la capa de entrada de origen y copia los atributos en una capa de memoria (en este caso, una capa de polígono, pero puede cambiarla LineStringo Pointdependiendo del tipo de capa):

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)
José
fuente
1
Bien, conocía este, solo lo encuentro un poco largo (en términos de líneas de código). Pero supongo que es la única forma de hacerlo; gracias por la respuesta :)
Ril8772
1
@ Ril8772 - ¡Muy bienvenido! No estoy seguro de si es la única manera, pero es la única manera que sé =)
Joseph
6

En QGIS 3 puede hacer una copia de una capa sin guardar ninguna referencia a la capa primaria de esta manera:

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

La clase QgsVectorLayer tiene una función clone () que le permite clonar la capa en una nueva capa, el problema es que si modifica la geometría en la capa clonada, la capa original se verá afectada: la razón de esto es que la fuente de datos es lo mismo para la capa original y la capa clonada.

Leo Cardona
fuente