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.