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.