Duplikat layer dalam memori menggunakan pyqgis?


9

Saya memiliki layer di QGIS, dan saya ingin menduplikasinya melalui plugin sehingga saya dapat menggunakan salinannya seperti yang saya inginkan, tanpa memodifikasi yang asli.

Tentu saja layer2 = layer1tidak akan berfungsi, karena semua yang terjadi pada layer2 juga akan terjadi pada layer1, karena itu adalah objek yang sama di belakang semua ini.

Satu-satunya cara saya menemukannya adalah:

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

Apakah ada cara sederhana untuk menduplikasi layer dalam memori, tanpa harus menulis file baru?

Jawaban:


11

Kode berikut berfungsi untuk saya dari Python Console dan plugin. Dibutuhkan fitur dari lapisan input sumber dan menyalin atribut ke lapisan memori (dalam hal ini, lapisan poligon tetapi Anda dapat mengubahnya ke LineStringatau Pointtergantung pada jenis lapisan):

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)

1
Baiklah saya tahu yang ini, saya hanya merasa agak panjang (dalam hal baris kode). Tetapi saya kira itu adalah satu-satunya cara untuk melakukannya; terima kasih atas jawabannya :)
Ril8772

1
@ Ril8772 - Selamat datang! Tidak yakin apakah ini satu-satunya cara tapi itu satu-satunya cara saya tahu =)
Joseph

6

Di QGIS 3 Anda dapat membuat salinan sebuah layer tanpa menyimpan referensi apa pun ke layer induk dengan cara ini:

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

Kelas QgsVectorLayer memiliki fungsi clone () yang memungkinkan Anda untuk mengkloning layer pada layer baru, masalahnya adalah jika Anda memodifikasi geometri pada layer yang dikloning, layer asli akan terpengaruh: alasannya adalah karena sumber data adalah sama untuk lapisan asli dan lapisan yang dikloning.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.