QGIS Python 플러그인을 사용하여 레이어의 각 기능에 대한 속성 값을 편집하려고합니다. 편집 모드 외부 에서이 작업을 수행하는 것이 편집하는 동안보다 편집 속도가 훨씬 느리다는 것을 알았습니다. 아래 코드를 참조하십시오 (루프에서 같은 지점에서 서로 바꾸어 쓸 수있는 줄). 샘플 데이터 세트의 속도 차이는 2 초 (편집 모드)와 72 초 (편집 모드 아님)입니다.
편집 모드에서 속성 수정 :
layer.changeAttributeValue(feature.id(), 17, QtCore.QVariant(value))
편집 모드 외부에서 속성 수정 :
layer.dataProvider().changeAttributeValues({ feature.id() : { 17 : QtCore.QVariant(value) } })
이것이 예상되는 동작입니까? 사용자가 변경 내용을 취소 할 필요가 없으므로 편집 모드를 사용할 필요가 없다고 생각합니다.
편집 1 : 두 버전이 모두 포함되어 있지만 아래에 전체 코드가 표시되어 있지만 주석 처리되었습니다.
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)
두 방법 모두 동일한 결과를 생성하지만 데이터 공급자를 통한 쓰기는 훨씬 오래 걸립니다. 이 함수는 사전 생성 된 버퍼 (갈색)를 사용하여 건물 지형지 물을 인근 필드 (보라색)에 근접하게 분류합니다.