Mengatur atribut fitur berdasarkan nama melalui QGIS python api?


13

Saya mencoba mengatur atribut fitur berdasarkan nama atribut dengan kode ini

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

tapi hasilnya saya punya NULL di semua bidang. Jika saya gunakan

feature.setAttributes([1])

ini bekerja dengan baik.

Apa yang saya lakukan salah? Mengapa fitur [attrName] = 1 tidak berfungsi?

Pembaruan : Temukan solusi ini

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}})

Jawaban:


17

QGIS dapat menggunakan nama dan indeks bidang:

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

Pastikan Anda berada dalam mode edit sebelum Anda melakukan sesuatu pada layer:

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

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

-1

AFAIK, QGIS menggunakan indeks bidang, bukan nama bidang, untuk penugasan. Coba gunakan feature[layer.fieldNameIndex(attrName)] = 1.


Saya mencoba: feature.setAttribute(attrName, 1)dan feature.setAttribute(layer.fieldNameIndex(attrName), 1)dengan hasil yang sama (referensi api memiliki dua metode setAttribute untuk fitur dengan indeks dan nama)
— dmitry.v.kiselev

feature[layer.fieldNameIndex(attrName)] = 1juga sama.
— dmitry.v.kiselev

Sudahkah Anda menginisialisasi atribut ( feature.initAttributes(len(attributes)))?
— Jan Šimbera

Tambahkan feature.initAttributes(1)dengan hasil yang sama. Tapi periksa feature[attrName]dan dapatkan 1 yang saya cari. Tetapi masih memiliki NULL jika saya membuka Tabel Atribut di gui.
— dmitry.v.kiselev
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.