Dupliquer la couche en mémoire à l'aide de pyqgis?

9

J'ai une couche dans QGIS, et je veux la dupliquer via un plugin afin que je puisse en utiliser la copie comme je le souhaite, sans modifier l'original.

Bien sûr, layer2 = layer1cela ne fonctionnera pas, car tout ce qui arrive à layer2 se produira également à layer1, car c'est le même objet derrière tout cela.

La seule façon que j'ai trouvée de le faire est en tant que telle:

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-t-il un moyen simple de dupliquer le calque en mémoire, sans avoir à écrire un nouveau fichier?

Ril8772
la source

Réponses:

11

Le code suivant fonctionne pour moi à partir de la console Python et du plugin. Il prend les entités de la couche d'entrée source et copie les attributs dans une couche mémoire (dans ce cas, une couche polygonale, mais vous pouvez la modifier LineStringou en Pointfonction du type de couche):

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
la source
1
D'accord, je connaissais celui-ci, je le trouve juste un peu long (en termes de lignes de code). Mais je suppose que c'est la seule façon de le faire; merci pour la réponse :)
Ril8772
1
@ Ril8772 - Bienvenue! Je ne sais pas si c'est le seul moyen mais c'est le seul moyen que je connaisse =)
Joseph
6

Dans QGIS 3, vous pouvez faire une copie d'une couche sans enregistrer aucune référence à la couche parent de cette manière:

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

La classe QgsVectorLayer a une fonction clone () qui vous permet de cloner le calque dans un nouveau calque, le problème est que si vous modifiez la géométrie dans le calque cloné, le calque d'origine sera affecté: la raison en est que la source de données est le même pour le calque d'origine et le calque cloné.

Leo Cardona
la source