Je voudrais mettre à jour un attribut d'une fonctionnalité. Cependant, je ne sais pas le mettre à jour en utilisant l'objet de fonctionnalité. Je dois utiliser le fournisseur de données pour le mettre à jour.
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 })
Puis-je changer la valeur d'un attribut à l'aide d'un QgsFeature
objet?
De plus, est-il possible de boucler en utilisant un objet itérateur?
my_index = layer.fieldNameIndex("my_field_name")
pour obtenir l'index.Réponses:
Répondre à vos deux questions:
Vous pouvez modifier vos valeurs d'entité à partir de l'
layer
objet, pas besoin d'accéder àdataProvider()
.Oui, vous pouvez utiliser l'itérateur en
for
boucle.Vérifiez le code ci-dessous:
Cela met à jour la troisième valeur de champ (index 2) à 30 pour toutes les entités de couche.
Remarque: Comme vous l'avez souligné, pour une raison quelconque, l'objet QgsFeature ne peut pas mettre à jour les valeurs des fonctionnalités, bien que l'API le dise.
la source
Oui, mais vous devez connaître l'index du champ:
Vous pouvez obtenir les champs à l'aide
QgsFeature::fields
, puis les parcourir jusqu'à ce que vous trouviez celui que vous souhaitez ouQgsFeature::attribute(const QString & name )
pour trouver l'index de champ par nom.La raison de QVariant est que setAttribute peut prendre des types Integer, Float, Date et Text. QgsFeature.attribute (nom) retourne également une variante de type int si l'attribut est trouvé et autre chose s'il ne peut pas être trouvé. Soyez conscient de cela dans votre code. Un bloc try..except serait garanti, essayez de convertir en int et sauf si le type n'est pas int.
Il est possible que votre fonctionnalité ne prenne pas en charge cette méthode. Une autre méthode que j'ai employée est
QgsVectorLayer::changeAttributeValue
:Cela indique à la couche de mettre à jour une fonctionnalité et un attribut spécifiques. Dans l'exemple, la valeur provient d'un widget.
la source
feat.setAttribute(1, QVariant(20))
mais le système a dit TypeError: PyQt4.QtCore.QVariant représente un type mappé et ne peut pas être instanciéfeat.setAttribute(1, 20)
mais les valeurs ne changent pas. Cependant, je peuxprint(feat.attributes()[1])