Como ler os valores de atributo usando PyQGIS?

18

Qual é a maneira de obter as informações contidas na tabela de atributos, digamos na coluna 2, linha 2, usando pyqgis?

user16018
fonte
Isso é útil, mas parece apenas fornecer o valor dos atributos. Parece que os atributos precisam ser um par de nome / valor. Como você obtém o nome para cada atributo? É disso que se trata os "campos"?
31418 Ajpieri
Isso realmente não responde à pergunta. Se você tiver uma pergunta diferente, faça-a clicando em Fazer pergunta . Você também pode adicionar uma recompensa para chamar mais atenção para essa pergunta quando tiver reputação suficiente . - Da avaliação
Martin Hügi

Respostas:

43

Para percorrer todos os recursos de uma camada, use o getFeatures()gerador. Isso retorna um iterador de features ( QgsFeature) na camada.

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

Se você estiver interessado apenas em um recurso específico, em vez de todos os recursos da camada, poderá acessá-lo usando um QgsFeatureRequeste é FID:

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

Depois de ter um QgsFeatureobjeto, você pode usar o attributes()método para recuperar os atributos (também conhecidos como colunas ou campos) associados a esse recurso (conhecido como linha), por exemplo:

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

Se você deseja indexar o campo por seu nome, e não por um número, use os mapeamentos de campo:

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

O índice do campo não deve mudar durante o loop, portanto, você só precisa chamá-lo uma vez.

Há mais informações e exemplos no livro de receitas do PyQGIS: http://www.qgis.org/pyqgis-cookbook/vector.html#iterating-over-vector-layer

Atualizar

Você pode acessar atributos de recursos muito mais facilmente usando a QgsFeaturecomo um dict, por exemplo,

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

Não tenho certeza de qual versão veio ou se sempre esteve lá.

Snorfalorpagus
fonte
11

Achei que eu realmente adicionaria algum código, pois esse problema no Google retorna essa pergunta ... a maioria das pessoas prefere uma explicação rápida ou um trecho de código a um link que leva a uma página com muitas informações adicionais.

Para obter as informações em uma tabela, você primeiro precisa acessar os recursos da camada . No meu caso, eu coloquei os recursos em uma variável. Depois, você percorre os recursos e, para cada recurso, chama seus atributos , que podem ser impressos usando o índice de colunas . Por exemplo, se eu gostaria de obter todos os valores na segunda coluna, faria o seguinte:

lyr = iface.activeLayer()

features = lyr.getFeatures()

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

As respostas acima mostram apenas como fazer isso para a camada ativa. Eu acho que, em muitos casos, você pode querer encontrar o referido atributo para uma camada que não seja a camada ativa ou uma camada marcada na janela Camadas. O código abaixo obterá uma lista de todas as camadas que você adicionou à sua janela Camadas (independentemente de estarem marcadas ou ativas) e encontrará o atributo na linha 2, coluna 2.

from qgis.core import QgsProject

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

Nota mapLayersByName retorna uma lista de camadas com o nome fornecido. Estou assumindo que existe um para este exemplo.

ajpieri
fonte