Ich möchte ein Attribut einer Funktion aktualisieren. Ich weiß jedoch nicht, ob ich es mithilfe des Feature-Objekts aktualisieren soll. Ich muss den Datenprovider verwenden, um ihn zu aktualisieren.
layers = QgsMapLayerRegistry.instance().mapLayersByName('my_line')
layer = layers[0]
dp = layer.dataProvider()
it = dp.getFeatures()
for i in range(0, dp.featureCount()):
feat = it.next()
attrs = { 2 : 30 }
layer.dataProvider().changeAttributeValues({ feat.id() : attrs })
Kann ich den Wert eines Attributs mithilfe eines QgsFeature
Objekts ändern ?
Ist es außerdem möglich, eine Schleife mit einem Iteratorobjekt durchzuführen?
my_index = layer.fieldNameIndex("my_field_name")
, um den Index zu erhalten.Antworten:
Beantwortung Ihrer beiden Fragen:
Sie können Ihre Feature-Werte über das
layer
Objekt ändern , ohne auf das zugreifen zu müssendataProvider()
.Ja, Sie können den Iterator in einer
for
Schleife verwenden.Überprüfen Sie den folgenden Code:
Dadurch wird der dritte Feldwert (Index 2) für alle Layer-Features auf 30 aktualisiert.
Hinweis: Wie Sie bereits betont haben, kann das QgsFeature-Objekt aus irgendeinem Grund keine Feature-Werte aktualisieren, obwohl die API dies vorschreibt.
quelle
Ja, aber Sie müssen den Index des Feldes kennen:
Sie können die Felder mithilfe von
QgsFeature::fields
abrufen und dann durchlaufen, bis Sie das gewünschte gefunden haben oderQgsFeature::attribute(const QString & name )
den Feldindex nach Namen suchen.Der Grund für QVariant ist, dass das setAttribute die Typen Integer, Float, Date und Text annehmen kann. QgsFeature.attribute (Name) gibt eine Variante vom Typ int zurück, wenn das Attribut gefunden wird, und etwas anderes, wenn es nicht gefunden werden kann. Beachten Sie dies in Ihrem Code. Ein try..except-Block wäre gerechtfertigt. Versuchen Sie, in int zu konvertieren, und es sei denn, type ist nicht int.
Möglicherweise unterstützt Ihre Funktion diese Methode nicht. Eine andere Methode, die ich angewendet habe, ist
QgsVectorLayer::changeAttributeValue
:Dadurch wird die Ebene angewiesen, ein bestimmtes Feature und ein bestimmtes Attribut zu aktualisieren. Im Beispielfall stammt der Wert von einem Widget.
quelle
feat.setAttribute(1, QVariant(20))
aber das System sagte TypeError: PyQt4.QtCore.QVariant stellt einen zugeordneten Typ dar und kann nicht instanziiert werdenfeat.setAttribute(1, 20)
aber die Werte ändern sich nicht. Allerdings kann ichprint(feat.attributes()[1])