pyqgisを使用してメモリ内のレイヤーを複製しますか?


9

QGISにレイヤーがあり、それをプラグインを介して複製したいので、オリジナルを変更せずに、そのコピーを好きなように使用できます。

もちろんlayer2 = layer1、これは機能しません。これは、layer2で発生するすべてがlayer1でも発生するためです。

私がそれをすることがわかった唯一の方法はそのようなものです:

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

新しいファイルを書き込むことなく、メモリ内のレイヤーを複製する簡単な方法はありますか?

回答:


10

次のコードは、Pythonコンソールとプラグインの両方で動作します。ソース入力レイヤーからフィーチャを取得し、属性をメモリレイヤー(この場合はポリゴンレイヤーですが、レイヤータイプに応じて、LineStringまたはPointレイヤータイプに応じて変更できます)にコピーします。

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
わかりました。これは少し長くなっています(コード行に関して)。しかし、それが唯一の方法だと思います。答えてくれてありがとう:)
Ril8772

1
@ Ril8772-大歓迎です!それが唯一の方法であるかどうかはわかりませんが、それが私が知っている唯一の方法です=)
ジョセフ

6

QGIS 3では、次の方法で親レイヤーへの参照を保存せずにレイヤーのコピーを作成できます。

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

QgsVectorLayerクラスにはclone()関数があり、新しいレイヤーにレイヤーをクローンできます。問題は、クローンされたレイヤーのジオメトリを変更すると、元のレイヤーが影響を受けることです。これは、データソースが原因です。元のレイヤーとクローンレイヤーで同じです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.