Obtendo os dados de um recurso selecionado no QGIS usando Python?

10

Eu tenho um problema / pergunta sobre python e QGIS. É possível obter os dados de um recurso selecionado no QGIS usando python? Em caso afirmativo, como?

No meu exemplo, tenho uma camada que mostra algumas parcelas para o planejamento urbano. Se agora eu selecionar uma das parcelas, quero obter os dados exatamente dessa parcela. Esses dados devem ser lidos por um script python e depois adicionados a um arquivo PDF criado automaticamente. O último passo é fácil, mas não obtive os dados desse recurso selecionado.

É possível obter dados da camada ativa, mas também é possível obter os dados de um recurso selecionado dessa camada?

Espero que possa me ajudar. Saudações

Sven
fonte

Respostas:

15

A chamada layer.selectedFeatures()retornará uma lista com os recursos selecionados. Você pode chamar feature.attributeMap()cada um dos recursos selecionados para obter um dicionário dos atributos de cada recurso.

layer = qgis.utils.iface.activeLayer()
selected_features = layer.selectedFeatures()
for i in selected_features:
    attrs = i.attributeMap()
    for (k,attr) in attrs.iteritems():
    print "%d: %s" % (k, attr.toString())

Recentemente, tive uma pergunta semelhante respondida aqui: Ao iterar sobre uma camada vetorial com pyqgis, como verifico se um recurso está selecionado?

Cyrus
fonte
estranho, o QgsFeature objetos que resulta da selected_features não tem nenhum método geometria ...
user32882
9

Eu só queria postar algumas atualizações na resposta anterior à luz das alterações na API Python do QGIS desde a versão 2.0 .

Como antes, você obteria uma lista dos recursos selecionados iface.activeLayer().selectedFeatures(), no entanto, nas QGISversões >= 2.0agora você usa a função em QgsFeature.attributes()vez de QgsFeature.attributeMap(). As duas funções não são exatamente as mesmas: attributes()agora retorna uma lista , enquanto as antigas attributeMap()retornaram um dicionário . Tome um momento para navegar na documentação da API para QgsFeature.attributes(), QgsAttributes, etc entender como atributos são armazenados / acessado.

Se você estiver interessado, pode ler sobre algumas das razões por trás das alterações da API neste segmento de lista de discussão: [Qgis-developer] novos recursos de seleção de API de vetor . Resumidamente (nas palavras do desenvolvedor do QGIS, Martin Dobias):

Acesso a atributos: não existe f.attributeMap()mais, porque os atributos agora estão armazenados em um vetor (Python :) em listvez de em um mapa (Python :) dict. QgsFeatureA classe emula o objeto de contêiner python 4 para que você possa acessar atributos como se a QgsFeatureinstância fosse uma lista ou dicionário, com chaves sendo índices ou nomes de campos:

f[0] ... primeiro atributo

f["type"] ... atributo chamado "type"

Ainda é possível obter todos os atributos: f.attributes()retorna uma lista de valores.

Portanto, como um exemplo específico do que você perguntou como fazer (obtenha dados para um único recurso selecionado), suponha que você tenha uma camada de cityrecursos contendo cada um com uma lista de atributos, incluindo um countyatributo. Para obter o countyvalor para uma cidade específica que você selecionou (por exemplo Helena, AR), faça o seguinte no console do Python:

city = iface.activeLayer().selectedFeatures()[0]
city["county"]
# OUTPUTS: u'Phillips'

Se você deseja os valores de todos os campos na tabela de atributos da cidade, basta usar:

cityData = city.attributes()
J. Taylor
fonte
Além disso, você pode obter todos os nomes de campos deste exemplo usando city.fields (). Names () que retornaria uma lista de nomes de campos.
Cary H
1

Gostaria de adicionar algo útil à resposta fornecida por J. Taylor e apontar que a resposta atual aceita de 2012 não está mais correta:

O objeto QgsFeature suporta __geo_interface__atributo útil , que retorna um dicionário de um determinado recurso. O dicionário está na verdade em um padrão GeoJSON, para que você inclua todos os pares de atributo-valor e geometria. O recurso já existe há algum tempo, descrito pela primeira vez por Sean Gillies em 2012, com um exemplo de uso aqui . Não consegui encontrar nenhuma informação de qual versão do QGIS está disponível e ainda não testei o QGIS 3, mas certamente estava disponível pelo menos no QGIS 2.14.

TL; DR:

layer = qgis.utils.iface.activeLayer()
selected_features = layer.selectedFeatures()
for i in selected_features:
    attrs = i.__geo_interface__
    print attrs # GeoJSON attributes of a feature
adamczi
fonte