使用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'

Answers:


11

您收到的错误提示字段索引为-1,因此在属性表中找不到新字段。

那可能是因为:

  1. 您需要使用QVariant.Double而不是QVariant.Float
  2. 在您要求新的列索引之前,您尚未将新字段提交给图层提供者。
  3. 您要索取的索引,myNewColumn但您的提供程序只能为字段名称存储10个字符,因此已存储myNewColum(缺少final 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.In发送'x coord'也不是一个好主意,尽管没有错误,但是编程很差。双应该在那里。谢谢
OHTO

老实说,这是我第一次遇到这样的问题。与往常一样,逐行进行测试可以提示您可能发生的情况。
赫尔曼·卡里略
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.