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:
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]
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 importQgsProject
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.
Respostas:
Para percorrer todos os recursos de uma camada, use o
getFeatures()
gerador. Isso retorna um iterador de features (QgsFeature
) na camada.Se você estiver interessado apenas em um recurso específico, em vez de todos os recursos da camada, poderá acessá-lo usando um
QgsFeatureRequest
e é FID:Depois de ter um
QgsFeature
objeto, você pode usar oattributes()
método para recuperar os atributos (também conhecidos como colunas ou campos) associados a esse recurso (conhecido como linha), por exemplo:Se você deseja indexar o campo por seu nome, e não por um número, use os mapeamentos de campo:
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
QgsFeature
como umdict
, por exemplo,Não tenho certeza de qual versão veio ou se sempre esteve lá.
fonte
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:
fonte
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.
Nota mapLayersByName retorna uma lista de camadas com o nome fornecido. Estou assumindo que existe um para este exemplo.
fonte