Me gustaría actualizar un atributo de una característica. Sin embargo, no sé actualizarlo usando el objeto de función. Tengo que usar el proveedor de datos para actualizarlo.
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 })
¿Puedo cambiar el valor de un atributo usando un QgsFeature
objeto?
Además, ¿es posible hacer un bucle con un objeto iterador?
my_index = layer.fieldNameIndex("my_field_name")
para obtener el índice.Respuestas:
Responde tus dos preguntas:
Puede cambiar los valores de sus características desde el
layer
objeto, sin necesidad de acceder adataProvider()
.Sí, puedes usar el iterador en un
for
bucle.Verifique el código a continuación:
Esto actualiza el tercer valor del campo (índice 2) a 30 para todas las entidades de capa.
Nota: Como señaló, por alguna razón el objeto QgsFeature no puede actualizar los valores de las características, aunque la API dice que sí.
fuente
Sí, pero debes conocer el índice del campo:
Puede utilizar los campos
QgsFeature::fields
y luego recorrerlos en iteración hasta encontrar el que desea oQgsFeature::attribute(const QString & name )
encontrar el índice de campo por nombre.La razón de QVariant es que setAttribute puede tomar tipos enteros, flotantes, de fecha y de texto. QgsFeature.attribute (name) devuelve una variante también de tipo int si se encuentra el atributo y algo más si no se puede encontrar ... tenga en cuenta esto en su código. Se justificaría un bloque try..except, intente convertir a int y excepto si el tipo no es int.
Es posible que su función no sea compatible con este método. Otro método que he empleado es
QgsVectorLayer::changeAttributeValue
:Esto le dice a la capa que actualice una característica específica y un atributo específico. En el caso de ejemplo, el valor proviene de un widget.
fuente
feat.setAttribute(1, QVariant(20))
pero el sistema dijo TypeError: PyQt4.QtCore.QVariant representa un tipo mapeado y no puede ser instanciadofeat.setAttribute(1, 20)
pero los valores no cambian. Sin embargo, puedoprint(feat.attributes()[1])