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.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
基本的なテストをいくつか行った後、フィールド名の文字数制限について考えます。もちろん 'x coord'をQVariant.Intに送るのも良い考えではありませんが、エラーはなく、単に悪いプログラミングです。ダブルがあるはずです。ありがとう
OHTO

正直なところ、私がこのような問題に直面するのは初めてです。いつものように、1行ずつテストすると、何が起こっているかについてのヒントが得られます。
ヘルマン・カリージョ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.