QGIS Python API経由で名前で機能属性を設定しますか?


13

このコードで属性名でフィーチャ属性を設定しようとしました

pr = layer.dataProvider()
pr.addAttributes([QgsField("test", QVariant.Int)])
layer.updateFields()
for feature in layer.getFeatures():
 attrName = 'test'
 feature[attrName] = 1

しかし、結果としてすべてのフィールドにNULLがあります。私が使用する場合

feature.setAttributes([1])

正常に機能します。

私が間違っていることは何ですか?feature [attrName] = 1が機能しないのはなぜですか?

更新:このソリューションを見つける

pr = layer.dataProvider()
pr.addAttributes([QgsField("test", QVariant.Int)])
layer.updateFields()
for feature in layer.getFeatures():
 attrName = 'test'
 feature[attrName] = 1
 pr.changeAttributeValues({feature.id() : {pr.fieldNameMap()[attrName] : 1}})

回答:


17

QGISはフィールド名とインデックスを使用できます:

feature['fieldname'] = 10
feature[1] = 10

レイヤー上で何かを行う前に、編集モードになっていることを確認してください。

layer.startEditing()
feature['fieldname'] = 10
layer.updateFeature(feature)

#Call commit to save the changes
layer.commitChanges()

-1

私の知る限り、QGISは割り当てにフィールド名ではなくフィールドインデックスを使用します。を使用してみてくださいfeature[layer.fieldNameIndex(attrName)] = 1


私が試してみてくださいfeature.setAttribute(attrName, 1)feature.setAttribute(layer.fieldNameIndex(attrName), 1)同じ結果で(APIリファレンスインデックスと名前の機能のための2つのsetAttributeメソッドがあります)
dmitry.v.kiselev

feature[layer.fieldNameIndex(attrName)] = 1また同じ。
dmitry.v.kiselev 14年

属性(feature.initAttributes(len(attributes)))を初期化しましたか?
ヤンシンベラ14

feature.initAttributes(1)同じ結果で追加します。しかしfeature[attrName]、私が探しているものをチェックして1個手に入れました。しかし、GUIで属性テーブルを開くと、NULLのままです。
dmitry.v.kiselev 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.