Bir QGIS Python eklentisi kullanarak bir katmanda her özellik için bir özniteliğin değerini düzenlemeye çalışıyorum. Bunu düzenleme modunun dışında yapmanın düzenleme sırasındakinden çok daha yavaş olduğunu fark ettim. Aşağıdaki koda bakın (satırlar bir döngü içinde aynı noktada değiştirilebilir). Örnek veri kümem için hız farkı 2 saniyedir (düzenleme modu) - 72 saniyedir (düzenleme modu değil).
Düzenleme modunda bir özniteliği değiştirme:
layer.changeAttributeValue(feature.id(), 17, QtCore.QVariant(value))
Düzenleme modunun dışındaki bir özelliği değiştirme:
layer.dataProvider().changeAttributeValues({ feature.id() : { 17 : QtCore.QVariant(value) } })
Bu beklenen bir davranış mı? Değişiklikleri geri alabilmek için kullanıcıya ihtiyacım yok, bu yüzden düzenleme modunu kullanmam gerektiğini düşünmüyorum.
Düzenleme 1: Her iki sürümün de dahil olduğu (ancak yorum yapılan) aşağıdaki tam kodu inceleyin:
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)
Her iki yöntem de aynı sonucu verir, ancak veri sağlayıcı aracılığıyla yazmak çok daha uzun sürer. İşlev, önceden oluşturulmuş arabellekleri (brown-ish) kullanarak bina özelliklerinin yakın alanlara (mor) yakınlığını sınıflandırır.