Як змінити значення атрибута за допомогою QgsFeature в PyQGIS?


12

Я хотів би оновити один атрибут функції. Однак я не знаю оновлювати його за допомогою об’єкта функції. Я маю використовувати провайдера даних для його оновлення.

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")для отримання індексу.
Герман Каррілло

в цьому випадку я не можу додати в поле рядок, як я можу це зробити?
Хамед Макіян

Якщо у вас є нове запитання, будь ласка, задайте його, натиснувши кнопку Задати питання . Додайте посилання на це питання, якщо це допомагає надати контекст. - З огляду
Dan C

Hamed, Ласкаво просимо на біржу стек GIS! Оскільки на це питання вже відповіли, будь ласка, поставте своє запитання як нове окреме запитання тут gis.stackexchange.com/questions/ask .
см1

Відповіді:


17

Відповідаючи на два питання:

  1. Ви можете змінювати значення своїх layerоб'єктів у об’єкта, не потрібно отримувати доступ до dataProvider().

  2. Так, ви можете використовувати ітератор у forциклі.

Перевірте код нижче:

layers = QgsMapLayerRegistry.instance().mapLayersByName('my_line') 
layer = layers[0]
it = layer.getFeatures()

layer.startEditing()
for feat in it:
  layer.changeAttributeValue(feat.id(), 2, 30)

layer.commitChanges()

Це поновлює значення третього (індекс 2) поля до 30 для всіх функцій шару.


Примітка. Як ви вказали, об'єкт QgsFeature чомусь не може оновити значення функцій, хоча API каже, що це може.


5

Так, але ви повинні знати індекс поля:

QgsFeature::setAttribute(int field,const QVariant & attr )  

Ви можете отримати поля за допомогою, QgsFeature::fieldsа потім повторити їх, поки не знайдете потрібне або QgsFeature::attribute(const QString & name )не знайдете індекс поля за назвою.

Причиною QVariant є те, що setAttribute може приймати типи Integer, Float, Date та Text. QgsFeature.attribute (ім'я) повертає варіант також типу int, якщо атрибут знайдено, і щось інше, якщо його неможливо знайти .. пам'ятайте про це у своєму коді. Блок спробу .. крім випадків буде гарантованим, спробуйте перетворити на int, за винятком випадків, якщо тип не є int.

Можливо, що ваша функція не підтримує цей метод. Ще один метод, який я застосував QgsVectorLayer::changeAttributeValue:

self.canvas.currentLayer().changeAttributeValue(UpdateFeatureID,FieldToUpdate,self.CurrentWidget.text(),True)

Це повідомляє шару оновити конкретну особливість та конкретний атрибут. У прикладі випадку значення походить віджет.


Я спробував, feat.setAttribute(1, QVariant(20))але система сказала TypeError: PyQt4.QtCore.QVariant являє собою тип відображення, і його неможливо встановити
wannik

feat.setAttribute (1, 20) - це я робив раніше. Це ставиться значення "20" в атрибут 1.
Майкл Стимсон

Я спробував, feat.setAttribute(1, 20)але значення не змінюються. Однак я можуprint(feat.attributes()[1])
wannik

Перегляньте зміни, можливо, вам доведеться зателефонувати в QgsVectorLayer.changeAttributeValue, який повинен використовувати драйвер для внесення змін.
Майкл Стімсон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.