Как прочитать значения атрибута, используя PyQGIS?

18

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

user16018
источник
Это полезно, но это только кажется, что дает вам значение атрибутов. Кажется, атрибуты должны быть парой имя / значение. Как вы получаете имя для каждого атрибута? Это то, что "поля" это все о?
Ajpieri
Это на самом деле не отвечает на вопрос. Если у вас есть другой вопрос, вы можете задать его, нажав Задать вопрос . Вы также можете добавить вознаграждение, чтобы привлечь больше внимания к этому вопросу, когда у вас будет достаточно репутации . - Из Обзора
Мартин Хюги

Ответы:

43

Чтобы перебрать все объекты слоя, используйте getFeatures()генератор. Это возвращает итератор features ( QgsFeature) в слое.

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

Если вас интересует только определенная функция, а не все функции в слое, вы можете получить к ней доступ, используя a 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подобно dict, например ,

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

Я не уверен, какая версия пришла или всегда была там.

Snorfalorpagus
источник
11

Я подумал, что на самом деле я добавил бы некоторый код, поскольку поиск этой проблемы возвращает этот вопрос ... большинство людей предпочитают быстрое объяснение или фрагмент кода ссылке, которая ведет на страницу, которая содержит много дополнительной информации.

Чтобы получить информацию в таблице, вам сначала нужно получить доступ к функциям слоя . В моем случае я поместил функции в переменную. Затем вы перебираете объекты , и для каждого объекта вы вызываете его атрибуты , которые затем можно распечатать, используя их индекс столбца . Например, если я хотел бы получить все значения во втором столбце, я бы сделал это:

lyr = iface.activeLayer()

features = lyr.getFeatures()

for feat in features:
    attrs = feat.attributes()
    print attrs[1]
BritishSteel
источник
1

Ответы выше показывают только, как это сделать для активного слоя. Я думаю, во многих случаях вам может понадобиться найти указанный атрибут для слоя, который не является активным слоем, или слой, отмеченный в окне «Слои». Приведенный ниже код получит список всех слоев, которые вы добавили в окно слоев (независимо от того, отмечены они или активны), и найдет атрибут в строке 2, столбец 2.

from qgis.core import QgsProject

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

Примечание. MapLayersByName возвращает список слоев с указанным именем. Я предполагаю, что один существует для этого примера.

ajpieri
источник