Я хотел бы обновить один атрибут функции. Тем не менее, я не знаю, чтобы обновить его с помощью объекта функции. Я должен использовать поставщика данных, чтобы обновить его.
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 })
Могу ли я изменить значение атрибута, используя QgsFeature
объект?
Кроме того, возможно ли зацикливание с использованием объекта итератора?
my_index = layer.fieldNameIndex("my_field_name")
чтобы получить индекс.Ответы:
Отвечая на два ваших вопроса:
Вы можете изменить значения вашего объекта из
layer
объекта, нет необходимости доступа кdataProvider()
.Да, вы можете использовать итератор в
for
цикле.Проверьте код ниже:
Это обновляет значение третьего поля (индекс 2) до 30 для всех объектов слоя.
Примечание. Как вы указали, по какой-то причине объект QgsFeature не может обновить значения функций, хотя API говорит, что это возможно.
источник
Да, но вы должны знать индекс поля:
Вы можете получить поля, используя,
QgsFeature::fields
а затем перебирать их, пока не найдете то, что вам нужно, илиQgsFeature::attribute(const QString & name )
найти индекс поля по имени.Причина для QVariant заключается в том, что setAttribute может принимать типы Integer, Float, Date и Text. QgsFeature.attribute (name) возвращает вариант также типа int, если атрибут найден, и что-то еще, если он не может быть найден. Помните об этом в своем коде. Будет гарантирован блок try..except, попробуйте преобразовать его в int, кроме случаев, когда type не является int.
Возможно, ваша функция не поддерживает этот метод. Другой метод, который я использовал, это
QgsVectorLayer::changeAttributeValue
:Это говорит слою обновить определенную особенность и определенный атрибут. В этом примере значение берется из виджета.
источник
feat.setAttribute(1, QVariant(20))
но система сказала TypeError: PyQt4.QtCore.QVariant представляет сопоставленный тип и не может бытьfeat.setAttribute(1, 20)
но значения не меняются. Тем не менее, я могуprint(feat.attributes()[1])