Sao chép lớp trong bộ nhớ bằng pyqgis?


9

Tôi có một lớp trong QGIS và tôi muốn sao chép nó thông qua một plugin để tôi có thể sử dụng bản sao của nó theo ý muốn mà không cần sửa đổi bản gốc.

Tất nhiên layer2 = layer1sẽ không hoạt động, bởi vì mọi thứ xảy ra với layer2 cũng sẽ xảy ra với layer1, vì nó là cùng một đối tượng đằng sau tất cả điều này.

Cách duy nhất tôi tìm thấy để làm điều đó là như vậy:

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

Có một cách đơn giản để nhân đôi layer trong bộ nhớ mà không phải ghi một tập tin mới?

Câu trả lời:


10

Đoạn mã sau hoạt động với tôi từ cả Bảng điều khiển Python và plugin. Nó lấy các tính năng từ lớp đầu vào nguồn và sao chép các thuộc tính vào lớp bộ nhớ (trong trường hợp này là lớp đa giác nhưng bạn có thể thay đổi nó thành LineStringhoặc Pointtùy thuộc vào loại lớp):

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
Được rồi tôi biết cái này, tôi chỉ thấy nó hơi dài (về các dòng mã). Nhưng tôi đoán đó là cách duy nhất để làm điều đó; cảm ơn vì câu trả lời :)
Ril8772

1
@ Ril8772 - Chào mừng nhất! Không chắc đó có phải là cách duy nhất không nhưng đó là cách duy nhất tôi biết =)
Joseph

6

Trong QGIS 3, bạn có thể tạo một bản sao của một lớp mà không lưu bất kỳ tham chiếu nào đến lớp cha theo cách này:

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

Lớp QssVectorLayer có chức năng clone () cho phép bạn sao chép lớp trong một lớp mới, vấn đề là nếu bạn sửa đổi hình học trong lớp nhân bản, lớp ban đầu sẽ bị ảnh hưởng: lý do cho điều này là do nguồn dữ liệu là giống nhau cho lớp gốc và lớp nhân bản.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.