Tôi đang cố gắng chỉnh sửa giá trị của một thuộc tính cho từng tính năng trong một lớp bằng cách sử dụng plugin QGIS Python. Tôi đã thấy rằng thực hiện việc này ngoài chế độ chỉnh sửa chậm hơn nhiều so với khi chỉnh sửa (thậm chí bao gồm cả việc thực hiện các chỉnh sửa). Xem mã dưới đây (các dòng có thể hoán đổi cho nhau tại cùng một điểm trong một vòng lặp). Sự khác biệt về tốc độ cho tập dữ liệu mẫu của tôi là 2 giây (chế độ chỉnh sửa) so với 72 giây (không phải chế độ chỉnh sửa).
Sửa đổi một thuộc tính trong chế độ chỉnh sửa:
layer.changeAttributeValue(feature.id(), 17, QtCore.QVariant(value))
Sửa đổi một thuộc tính bên ngoài chế độ chỉnh sửa:
layer.dataProvider().changeAttributeValues({ feature.id() : { 17 : QtCore.QVariant(value) } })
Đây có phải là một hành vi dự kiến? Tôi không cần người dùng có thể hoàn tác các thay đổi, vì vậy tôi không nghĩ mình cần sử dụng chế độ chỉnh sửa.
Chỉnh sửa 1: Xem mã đầy đủ bên dưới với cả hai phiên bản được bao gồm (nhưng đã nhận xét):
def run(self):
try:
# create spatial index of buffered layer
index = QgsSpatialIndex()
self.layer_buffered.select()
for feature in self.layer_buffered:
index.insertFeature(feature)
# enable editing
#was_editing = self.layer_target.isEditable()
#if was_editing is False:
# self.layer_target.startEditing()
# check intersections
self.layer_target.select()
self.feature_count = self.layer_target.featureCount()
for feature in self.layer_target:
distance_min = None
fids = index.intersects(feature.geometry().boundingBox())
for fid in fids:
# feature's bounding box and buffer bounding box intersect
feature_buffered = QgsFeature()
self.layer_buffered.featureAtId(fid, feature_buffered)
if feature.geometry().intersects(feature_buffered.geometry()):
# feature intersects buffer
attrs = feature_buffered.attributeMap()
distance = attrs[0].toPyObject()
if distance_min is None or distance < distance_min:
distance_min = distance
if self.abort is True: break
if self.abort is True: break
# update feature's distance attribute
self.layer_target.dataProvider().changeAttributeValues({feature.id(): {self.field_index: QtCore.QVariant(distance_min)}})
#self.layer_target.changeAttributeValue(feature.id(), self.field_index, QtCore.QVariant(distance_min))
self.calculate_progress()
# disable editing
#if was_editing is False:
# self.layer_target.commitChanges()
except:
import traceback
self.error.emit(traceback.format_exc())
self.progress.emit(100)
self.finished.emit(self.abort)
Cả hai phương pháp đều tạo ra cùng một kết quả, nhưng việc viết thông qua nhà cung cấp dữ liệu mất nhiều thời gian hơn. Hàm phân loại độ gần của các tính năng xây dựng với các trường gần đó (màu tím) bằng cách sử dụng bộ đệm được tạo trước (màu nâu-ish).