আমি 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)
উভয় পদ্ধতি একই ফলাফল উত্পন্ন করে, তবে ডেটা সরবরাহকারীর মাধ্যমে লেখা অনেক বেশি সময় নেয়। ফাংশনটি প্রাক-তৈরি বাফারগুলি (ব্রাউন-ইশ) ব্যবহার করে নিকটস্থ ক্ষেত্রগুলিতে (বেগুনি) বিল্ডিং বৈশিষ্ট্যগুলির নৈকট্যকে শ্রেণিবদ্ধ করে।