Schicht im Speicher mit Pyqgis duplizieren?

9

Ich habe eine Ebene in QGIS und möchte sie über ein Plugin duplizieren, damit ich die Kopie wie gewünscht verwenden kann, ohne das Original zu ändern.

Natürlich layer2 = layer1wird es nicht funktionieren, denn alles, was mit Layer2 passiert, passiert auch mit Layer1, da es das gleiche Objekt hinter all dem ist.

Der einzige Weg, den ich gefunden habe, ist als solcher:

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

Gibt es eine einfache Möglichkeit, die Ebene im Speicher zu duplizieren, ohne eine neue Datei schreiben zu müssen ?

Ril8772
quelle

Antworten:

10

Der folgende Code funktioniert für mich sowohl über die Python-Konsole als auch über das Plugin. Es übernimmt die Features aus der Quelleneingabeebene und kopiert die Attribute in eine Speicherebene (in diesem Fall eine Polygonebene, die Sie jedoch in LineStringoder Pointje nach Ebenentyp ändern können ):

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
quelle
1
Okay, ich kannte dieses, ich finde es nur ein bisschen lang (in Bezug auf Codezeilen). Aber ich denke, es ist der einzige Weg, dies zu tun. danke für die Antwort :)
Ril8772
1
@ Ril8772 - Herzlich willkommen! Ich bin mir nicht sicher, ob es der einzige Weg ist, aber es ist der einzige Weg, den ich kenne =)
Joseph
6

In QGIS 3 können Sie eine Kopie einer Ebene erstellen, ohne einen Verweis auf die übergeordnete Ebene auf folgende Weise zu speichern:

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

Die QgsVectorLayer-Klasse verfügt über eine clone () -Funktion, mit der Sie die Ebene in einer neuen Ebene klonen können. Das Problem besteht darin, dass beim Ändern der Geometrie in der geklonten Ebene die ursprüngliche Ebene betroffen ist. Der Grund dafür ist, dass die Datenquelle ist für die ursprüngliche Ebene und die geklonte Ebene gleich.

Leo Cardona
quelle