Impostazione dell'attributo della funzione per nome tramite QGIS python api?


13

Provo a impostare gli attributi delle funzioni in base al nome dell'attributo con questo codice

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

ma di conseguenza ho NULL in tutti i campi. Se io uso

feature.setAttributes([1])

funziona correttamente.

Cosa faccio di sbagliato? Perché feature [attrName] = 1 non funziona?

Aggiornamento : trova questa soluzione

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

Risposte:


18

QGIS può utilizzare nomi di campo e indici:

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

Assicurati di essere in modalità modifica prima di fare qualsiasi cosa sul livello:

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

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

-1

AFAIK, QGIS utilizza gli indici dei campi, non i nomi dei campi, per l'assegnazione. Prova a usare feature[layer.fieldNameIndex(attrName)] = 1.


Ci provo: feature.setAttribute(attrName, 1)e feature.setAttribute(layer.fieldNameIndex(attrName), 1)con gli stessi risultati (riferimento api hanno due metodi setAttribute per funzionalità con indice e nome)
dmitry.v.kiselev

feature[layer.fieldNameIndex(attrName)] = 1anche lo stesso.
dmitry.v.kiselev,

Hai inizializzato gli attributi ( feature.initAttributes(len(attributes)))?
Jan Šimbera,

Aggiungi feature.initAttributes(1)con lo stesso risultato. Ma controlla feature[attrName]e ottieni 1 che sto cercando. Ma ho ancora NULL se apro la tabella degli attributi in gui.
dmitry.v.kiselev,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.