เพิ่มเขตข้อมูลและคำนวณนิพจน์ด้วย PyQGIS หรือไม่


10

ฉันต้องการใช้ PyQGIS เพื่อเพิ่มเขตข้อมูลใหม่และคำนวณค่าสำหรับแต่ละคุณสมบัติ คล้ายกับตัวเลือก Field Calculator

นิพจน์ 'Field Calculator' ของฉันเป็นตัวอย่าง: 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.DoubleQVariant.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
หลังจากการทดสอบขั้นพื้นฐานบางอย่างฉันคิดว่ามัน จำกัด จำนวนอักขระของชื่อฟิลด์ แน่นอนว่าการส่ง 'x coord' ไปยัง QVariant นั้นไม่ใช่ความคิดที่ดีเช่นกันไม่มีข้อผิดพลาด สองควรจะมี ขอบคุณ
OHTO

พูดตามตรงมันเป็นครั้งแรกที่ฉันต้องเผชิญกับปัญหาดังกล่าว เช่นเคยการทดสอบทีละบรรทัดจะให้คำแนะนำคุณเกี่ยวกับสิ่งที่อาจเกิดขึ้น
Germán Carrillo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.