PyQGISでQgsFeatureを使用して属性の値を変更する方法は?


12

機能の1つの属性を更新したいと思います。ただし、機能オブジェクトを使用して更新する必要はありません。データプロバイダーを使用して更新する必要があります。

layers = QgsMapLayerRegistry.instance().mapLayersByName('my_line') 
layer = layers[0]
dp = layer.dataProvider()
it = dp.getFeatures()

for i in range(0, dp.featureCount()):
  feat = it.next()
  attrs = { 2 : 30 }
  layer.dataProvider().changeAttributeValues({ feat.id() : attrs })

QgsFeatureオブジェクトを使用して属性の値を変更できますか?

さらに、反復子オブジェクトを使用してループすることは可能ですか?


インデックスを使用せずに値を変更するにはどうすればよいですか?フィールド名を付けて値を変更したいと思います。それははるかに快適です。どうもありがとうございました!挨拶ロバート
ロバートBK

単にmy_index = layer.fieldNameIndex("my_field_name")インデックスを取得するために使用します。
ジェルマンカリージョ

この場合、フィールドに文字列を追加することはできませんか?
ハメドマキアン

新しい質問がある場合は、[ 質問する ]ボタンをクリックして質問してください。コンテキストの提供に役立つ場合は、この質問へのリンクを含めてください。- レビューから
ダンC

Hamed、GIS Stack Exchangeへようこそ!この質問には既に回答済みですので、新しい別個の質問としてgis.stackexchange.com/questions/askに質問してください
cm1

回答:


17

2つの質問に答えます。

  1. layerオブジェクトからフィーチャ値を変更できますdataProvider()。にアクセスする必要はありません。

  2. はい、forループでイテレータを使用できます。

以下のコードを確認してください。

layers = QgsMapLayerRegistry.instance().mapLayersByName('my_line') 
layer = layers[0]
it = layer.getFeatures()

layer.startEditing()
for feat in it:
  layer.changeAttributeValue(feat.id(), 2, 30)

layer.commitChanges()

これにより、すべてのレイヤーフィーチャの3番目(インデックス2)のフィールド値が30に更新されます。


注:先ほど指摘したように、何らかの理由でQgsFeatureオブジェクトは機能値を更新できませんが、APIからは可能とされています。


5

はい。ただし、フィールドのインデックスを知っている必要があります。

QgsFeature::setAttribute(int field,const QVariant & attr )  

を使用QgsFeature::fieldsしてフィールドを取得し、QgsFeature::attribute(const QString & name )目的のフィールドが見つかるまで、または名前でフィールドインデックスを見つけるまで、フィールドを反復処理できます。

QVariantの理由は、setAttributeが整数型、浮動小数点型、日付型、およびテキスト型を取ることができるためです。QgsFeature.attribute(name)は、属性が見つかった場合はint型のバリアントを返し、見つからない場合は何か他のものを返します。コード内でこのことに注意してください。try..exceptブロックが必要です。intに変換して、typeがintでない場合を除きます。

機能がこのメソッドをサポートしていない可能性があります。私が採用した別の方法はQgsVectorLayer::changeAttributeValue次のとおりです。

self.canvas.currentLayer().changeAttributeValue(UpdateFeatureID,FieldToUpdate,self.CurrentWidget.text(),True)

これは、特定の機能と特定の属性を更新するようにレイヤーに指示します。この例では、値はウィジェットから取得されます。


試しましたfeat.setAttribute(1, QVariant(20))が、システムはTypeErrorを
wannik 14年

feat.setAttribute(1、20)は、私が以前にやった方法です。属性1に値「20」を入れていること
マイケル・スティムソン

試しましたfeat.setAttribute(1, 20)が、値は変わりません。しかし、私がすることができますprint(feat.attributes()[1])
wannik

編集を参照してください。おそらく、ドライバーを使用して変更を加える必要があるQgsVectorLayer.changeAttributeValueを呼び出す必要があります。
マイケルスティムソン14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.