PyQGIS में QgsFeature का उपयोग करके किसी विशेषता का मान कैसे बदलें?


12

मैं एक फीचर की एक विशेषता को अद्यतन करना चाहूंगा। हालाँकि, मैं फीचर ऑब्जेक्ट का उपयोग करके इसे अपडेट करना नहीं जानता। मुझे इसे अपडेट करने के लिए डेटा प्रदाता का उपयोग करना होगा।

layers = QgsMapLayerRegistry.instance().mapLayersByName('my_line') 
layer = layers[0]
dp = layer.dataProvider()
it = dp.getFeatures()

for i in range(0, dp.featureCount()):
  feat = it.next()
  attrs = { 2 : 30 }
  layer.dataProvider().changeAttributeValues({ feat.id() : attrs })

क्या मैं QgsFeatureऑब्जेक्ट का उपयोग करके किसी विशेषता का मान बदल सकता हूं ?

इसके अलावा, क्या इट्रेटर ऑब्जेक्ट का उपयोग करके लूप करना संभव है?


सूचकांक का उपयोग किए बिना मैं मूल्यों को कैसे बदल सकता हूं? मैं उनके फ़ील्डनाम का नामकरण करके मान बदलना चाहूंगा। यह बहुत अधिक आरामदायक होगा। आपका बहुत बहुत धन्यवाद! अभिवादन रॉबर्ट
रॉबर्ट बीके

बस my_index = layer.fieldNameIndex("my_field_name")सूचकांक प्राप्त करने के लिए उपयोग करें।
जर्मेन कारिलो

इस मामले में मैं इस क्षेत्र में स्ट्रिंग नहीं जोड़ सकता कि मैं कैसे कर सकता हूं?
हमीद

यदि आपके पास कोई नया प्रश्न है, तो कृपया प्रश्न पूछें बटन पर क्लिक करके पूछें । इस प्रश्न का लिंक शामिल करें यदि यह संदर्भ प्रदान करने में मदद करता है। - समीक्षा से
दान सी

नामांकित, जीआईएस स्टैक एक्सचेंज में आपका स्वागत है! चूँकि यह प्रश्न पहले ही उत्तर दिया जा चुका है, कृपया अपने प्रश्न को एक नया, अलग प्रश्न यहाँ gis.stackexchange.com/questure/ask के रूप में पूछें
cm1

जवाबों:


17

आपके दो सवालों के जवाब:

  1. आप layerऑब्जेक्ट से अपने फीचर वैल्यू बदल सकते हैं , एक्सेस करने की कोई जरूरत नहीं है dataProvider()

  2. हां, आप forलूप में इटरेटर का उपयोग कर सकते हैं ।

नीचे दिए गए कोड की जाँच करें:

layers = QgsMapLayerRegistry.instance().mapLayersByName('my_line') 
layer = layers[0]
it = layer.getFeatures()

layer.startEditing()
for feat in it:
  layer.changeAttributeValue(feat.id(), 2, 30)

layer.commitChanges()

यह सभी लेयर फीचर्स के लिए तीसरे (इंडेक्स 2) फील्ड वैल्यू को 30 तक अपडेट करता है।


नोट: जैसा कि आपने बताया, किसी कारण से QgsFeature ऑब्जेक्ट फीचर वैल्यू को अपडेट नहीं कर सकता है, हालाँकि API का कहना है कि यह कर सकता है।


5

हां, लेकिन आपको क्षेत्र के सूचकांक को जानना होगा:

QgsFeature::setAttribute(int field,const QVariant & attr )  

आप उन क्षेत्रों का उपयोग कर सकते हैं QgsFeature::fieldsऔर फिर उनके माध्यम से पुनरावृति कर सकते हैं जब तक कि आप जो चाहते हैं या QgsFeature::attribute(const QString & name )नाम से फ़ील्ड इंडेक्स नहीं ढूंढ सकते हैं ।

QVariant का कारण यह है कि सेटएट्रिब्यूट Integer, Float, Date और Text प्रकार ले सकता है। QgsFeature.attribute (नाम) एक प्रकार का int लौटाता है, यदि विशेषता पाई जाती है और कुछ और अगर यह नहीं मिल सकता है .. तो अपने कोड में इसके बारे में जानकारी रखें। एक try..except ब्लॉक को वारंट किया जाएगा, int में बदलने की कोशिश करें और सिवाय इसके कि टाइप int नहीं है।

यह संभव है कि आपकी सुविधा इस पद्धति का समर्थन न करे। एक और तरीका है जो मैंने नियोजित किया है QgsVectorLayer::changeAttributeValue:

self.canvas.currentLayer().changeAttributeValue(UpdateFeatureID,FieldToUpdate,self.CurrentWidget.text(),True)

यह एक विशिष्ट सुविधा और विशिष्ट विशेषता को अद्यतन करने के लिए परत को बताता है। उदाहरण के मामले में मान एक विजेट से आता है।


मैंने कोशिश की, feat.setAttribute(1, QVariant(20))लेकिन सिस्टम ने कहा TypeError: PyQt4.QtCore.QVariant एक मैप किए गए प्रकार का प्रतिनिधित्व करता है और इसे तत्काल नहीं किया जा सकता
wannik

feat.setAttribute (1, 20) यह मैंने पहले कैसे किया है। यह '20' के मूल्य को विशेषता 1 में रखा गया है
माइकल स्टिमसन

मैंने कोशिश की feat.setAttribute(1, 20)लेकिन मान नहीं बदलते हैं। हालाँकि, मैं कर सकता हूँprint(feat.attributes()[1])
wannik

संपादन देखें, शायद आपको QgsVectorLayer.changeAttributeValue पर कॉल करना होगा जो परिवर्तन करने के लिए ड्राइवर का उपयोग करना चाहिए।
माइकल स्टिमसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.