मैं QGIS पायथन प्लगइन का उपयोग करके एक परत में प्रत्येक विशेषता के लिए एक विशेषता के मूल्य को संपादित करने की कोशिश कर रहा हूं। मैंने पाया है कि संपादन करते समय (संपादन संपादित करने सहित) की तुलना में संपादन मोड के बाहर ऐसा करना बहुत धीमा है। नीचे कोड देखें (एक लूप में एक ही बिंदु पर विनिमेय लाइनें)। मेरे नमूना डेटासेट की गति में अंतर 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)
दोनों विधियाँ समान परिणाम देती हैं, लेकिन डेटा प्रदाता के माध्यम से लिखने में अधिक समय लगता है। फ़ंक्शन पूर्व-निर्मित बफ़र्स (ब्राउन-ईश) का उपयोग करके आस-पास के फ़ील्ड (बैंगनी) के लिए भवन सुविधाओं की निकटता को वर्गीकृत करता है।