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


18

Який спосіб отримати інформацію, що міститься в таблиці атрибутів, скажімо, у колонці 2, рядок 2, використовуючи pyqgis?


Це корисно, але це, здається, лише дає вам значення атрибутів. Здається, атрибути повинні бути парою імен / значень. Як отримати ім’я для кожного атрибута? Це те, в чому полягають "поля"?
ajpieri

Це насправді не відповідає на питання. Якщо у вас інше питання, ви можете задати його, натиснувши Задати питання . Ви також можете додати щедрості, щоб привернути більше уваги до цього питання, коли у вас буде достатня репутація . - З огляду
Мартін Хюгі

Відповіді:


43

Для циклічного перегляду кожної функції в шарі використовуйте getFeatures()генератор. Це повертає ітератор функцій ( QgsFeature) у шарі.

for feature in layer.getFeatures():
    pass # do something with feature

Якщо вас цікавить лише певна функція, замість усіх функцій у шарі, ви можете отримати до неї доступ за допомогою QgsFeatureRequestі це FID:

fid = 1 # the second feature (zero based indexing!)
iterator = layer.getFeatures(QgsFeatureRequest().setFilterFid(fid))
feature = next(iterator)

Після того як у вас є QgsFeatureоб'єкт, ви можете використовувати attributes()метод для отримання атрибутів (він же стовпців або полів), пов'язаних з цією функцією (ака-рядок), наприклад:

# get the feature's attributes
attrs = feature.attributes()
# print the second attribute (note zero based indexing of Python lists)
print(attrs[1])

Якщо ви хочете проіндексувати поле за його ім'ям, а не за числом, вам потрібно використовувати відображення поля:

idx = layer.fieldNameIndex('name')
print(feature.attributes()[idx])

Індекс поля не повинен змінюватися під час циклу, тому його потрібно викликати лише один раз.

Більше інформації та прикладів у кулінарній книзі PyQGIS: http://www.qgis.org/pyqgis-cookbook/vector.html#iterating-over-vector-layer

Оновлення

Ви можете отримати доступ до атрибутів функцій набагато простіше, скориставшись QgsFeatureподібним a dict, напр

for feature in layer.getFeatures():
    name = feature["name"]

Я не впевнений, яка версія прийшла, чи вона завжди була там.


11

Думав, що я б фактично додавав код, оскільки гуглінг цієї проблеми повертає це питання ... більшість людей віддають перевагу швидкому поясненню або фрагменту коду до посилання, яке веде на сторінку, яка містить багато додаткової інформації.

Для того, щоб отримати інформацію в таблиці, вам слід спочатку отримати доступ до функцій шару . У моєму випадку я помістив функції в змінну. Потім ви перебираєте функції , і для кожної функції ви називаєте її атрибути , які потім можна буде надрукувати, використовуючи їх індекс стовпців . Наприклад, якщо я хотів би отримати всі значення у другому стовпці, то я б це зробив:

lyr = iface.activeLayer()

features = lyr.getFeatures()

for feat in features:
    attrs = feat.attributes()
    print attrs[1]

1

Наведені вище відповіді показують лише, як це зробити для активного шару. Я думаю, у багатьох випадках ви можете знайти зазначений атрибут для шару, який не є активними шарами або шаром, який перевіряється у вікні "Шари". У наведеному нижче коді з'явиться список усіх шарів, які ви додали у вікно "Шари" (незалежно від того, чи вони перевірені чи активні) та знайдете атрибут у рядку 2, стовпці 2.

from qgis.core import QgsProject

layer = QgsProject.instance().mapLayersByName("myLayerName")[0]
        value = layer.getFeature(2).attribute(2)

Примітка mapLayersByName повертає список шарів із заданим іменем. Я припускаю, що існує один для цього прикладу.

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