फ़ील्ड जोड़ना और PyQGIS के साथ अभिव्यक्ति की गणना करना?


10

मैं एक नए क्षेत्र को जोड़ने और प्रत्येक सुविधा के लिए मूल्यों की गणना करने के लिए PyQGIS का उपयोग करना चाहता हूं। फ़ील्ड कैलकुलेटर विकल्प के समान।

उदाहरण के लिए मेरा 'फील्ड कैलकुलेटर' अभिव्यक्ति है: y(start_point($geometry))

from PyQt4.QtCore import QVariant
from qgis.core import QgsField, QgsExpression, QgsFeature
vl = iface.activeLayer()

vl.startEditing()

#step 1
myField = QgsField( 'myNewColumn', QVariant.Float )
vl.addAttribute( myField )
idx = vl.fieldNameIndex( 'myNewColumn' )

#step 2
e = QgsExpression( 'y(start_point($geometry))' )
e.prepare( vl.pendingFields() )

for f in vl.getFeatures():
    f[idx] = e.evaluate( f )
    vl.updateFeature( f )

vl.commitChanges()

यह मुझे मिलने वाली त्रुटि है:

Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/var/folders/0r/q6nxg6w54fv4l7c8gksb2t500000gn/T/tmp9dosIe.py", line 30, in <module>
    f[idx] = e.evaluate( f )
KeyError: '-1'

जवाबों:


11

आपको जो त्रुटि मिलती है वह फ़ील्ड इंडेक्स कहती है -1, इसलिए आपका नया फ़ील्ड आपकी विशेषता तालिका में नहीं मिला था।

यह हो सकता है क्योंकि:

  1. आपको QVariant.Doubleइसके बजाय उपयोग करने की आवश्यकता है QVariant.Float
  2. आपने अपने नए कॉलम इंडेक्स के लिए पूछने से पहले लेयर प्रोवाइडर के लिए नया क्षेत्र प्रतिबद्ध नहीं किया है।
  3. आप सूचकांक के लिए पूछ रहे हैं, myNewColumnलेकिन आपका प्रदाता केवल फ़ील्ड नामों के लिए 10 वर्णों को संग्रहीत कर सकता है, इसलिए इसे संग्रहीत किया गया है myNewColum(अंतिम याद आ रही है n)। (जवाब देने की कोशिश करते हुए मेरे साथ हुआ)

इसके बजाय यह प्रयास करें:

#step 1
myField = QgsField( 'newColumn', QVariant.Double )
vl.dataProvider().addAttributes([myField])
vl.updateFields()
idx = vl.fieldNameIndex( 'newColumn' )

अब idxसे अलग होना चाहिए -1, आप इसे देख सकते हैं:

if idx != -1:
    print "Field found!"

वैसे, आप #step 1कोड को एडिट ब्लॉक से बाहर चला सकते हैं ।


1
कुछ बुनियादी परीक्षण के बाद मुझे लगता है कि यह क्षेत्र के नाम की वर्ण सीमा है। बेशक एक QVariant को 'x निर्देशांक' भेजना। मैं एक अच्छा विचार भी नहीं हूं, हालांकि कोई त्रुटि नहीं है, बस खराब प्रोग्रामिंग। डबल होना चाहिए। धन्यवाद
ओएचटीओ

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