Festlegen des Feature-Attributs nach Namen über die QGIS-Python-API?


13

Ich versuche, Feature-Attribute anhand des Attributnamens mit diesem Code festzulegen

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

aber im Ergebnis habe ich NULL in allen Feldern. Wenn ich benutze

feature.setAttributes([1])

es funktioniert richtig.

Was ich falsch mache? Warum funktioniert die Funktion [attrName] = 1 nicht?

Update : Finden Sie diese Lösung

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

Antworten:


17

QGIS kann Feldnamen und Indizes verwenden:

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

Stellen Sie sicher, dass Sie sich im Bearbeitungsmodus befinden, bevor Sie etwas auf der Ebene tun:

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

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

-1

AFAIK, QGIS verwendet für die Zuweisung Feldindizes und keine Feldnamen. Versuchen Sie es mit feature[layer.fieldNameIndex(attrName)] = 1.


Ich versuche: feature.setAttribute(attrName, 1)und feature.setAttribute(layer.fieldNameIndex(attrName), 1)mit den gleichen Ergebnissen (API-Referenz haben zwei setAttribute-Methoden für Feature mit Index und Name)
— dmitry.v.kiselev

feature[layer.fieldNameIndex(attrName)] = 1auch das gleiche.
— dmitry.v.kiselev

Haben Sie die Attribute ( feature.initAttributes(len(attributes))) initialisiert ?
— Jan Šimbera

feature.initAttributes(1)Mit dem gleichen Ergebnis hinzufügen . Aber überprüfe feature[attrName]und habe 1, nach der ich suche. Habe aber immer noch NULL, wenn ich die Attributtabelle in GUI öffne.
— dmitry.v.kiselev
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.