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?


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á.


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]

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.