Ottenere i dati di una funzione selezionata in QGIS usando Python?


10

Ho un problema / domanda riguardo a Python e QGIS. È possibile ottenere i dati di una funzione selezionata in QGIS usando Python, e se sì come?

Nel mio esempio ho uno strato che mostra alcuni pacchi per la pianificazione urbana. Se ora seleziono uno dei pacchi, voglio ottenere i dati esattamente per questo pacco. Questi dati devono essere letti da uno script Python e quindi aggiunti a un file PDF creato automaticamente. L'ultimo passaggio è semplice, ma non ho ricevuto i dati da questa funzione selezionata.

È possibile ottenere dati dal livello attivo, ma è anche possibile ottenere i dati da una funzione selezionata di questo livello?

Spero che tu mi possa aiutare. Saluti

Risposte:


15

La chiamata layer.selectedFeatures()restituirà un elenco con le funzioni selezionate. È quindi possibile chiamare feature.attributeMap()ciascuna delle funzionalità selezionate per ottenere un dizionario degli attributi di ciascuna funzionalità.

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())

Di recente ho ricevuto una domanda simile qui: Quando si scorre su un livello vettoriale con pyqgis, come posso verificare se una funzione è selezionata?


strano, gli oggetti QgsFeature che risultano dalle funzionalità selezionate_non hanno un metodo di geometria ...
user32882

9

Volevo solo pubblicare alcuni aggiornamenti alla risposta precedente alla luce delle modifiche all'API QGIS Python dalla versione 2.0 .

Come prima, si otterrebbe un elenco di funzionalità selezionate con iface.activeLayer().selectedFeatures(), tuttavia nelle QGISversioni >= 2.0ora si utilizza la funzione QgsFeature.attributes()anziché QgsFeature.attributeMap(). Le due funzioni non sono esattamente le stesse: attributes()ora restituisce un elenco , mentre il vecchio attributeMap()restituiva un dizionario . Prendetevi un momento per sfogliare la documentazione delle API per QgsFeature.attributes(), QgsAttributesecc per capire come attributi sono memorizzati / accessibili.

Se sei interessato, puoi leggere alcune delle motivazioni alla base delle modifiche all'API su questo thread della mailing list: [Qgis-developer] nuove funzionalità di selezione di API vettoriali . In breve (nelle parole dello sviluppatore di QGIS Martin Dobias):

Accesso agli attributi: non esiste f.attributeMap()più, poiché gli attributi sono ora memorizzati in un vettore (Python:) listanziché in una mappa (Python:) dict. QgsFeatureclass emula l'oggetto contenitore python 4 in modo da poter accedere agli attributi come se QgsFeatureistanza fosse un elenco o un dizionario, con le chiavi che sono indici di campo o nomi di campo:

f[0] ... primo attributo

f["type"] ... attributo denominato "tipo"

È ancora possibile ottenere tutti gli attributi: f.attributes()restituisce un elenco di valori.

Quindi, come esempio specifico di ciò che ti è stato chiesto come fare (ottenere i dati per una singola funzione che hai selezionato), supponi di avere un livello di cityfunzionalità che contengono ciascuna un elenco di attributi, incluso un countyattributo. Per ottenere il countyvalore per una città specifica selezionata (ad esempio Helena, AR), procedi come segue nella console di Python:

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

Se vuoi i valori di tutti i campi nella tabella degli attributi della città, allora dovresti semplicemente usare:

cityData = city.attributes()

Inoltre puoi ottenere tutti i nomi dei campi da questo esempio usando city.fields (). Names () che restituirebbe un elenco di nomi di campo.
Cary H

1

Vorrei aggiungere qualcosa di utile alla risposta fornita da J. Taylor e sottolineare che l'attuale risposta accettata dal 2012 non è più corretta:

L'oggetto QgsFeature supporta un utile __geo_interface__attributo, che restituisce un dizionario da una determinata funzione. Il dizionario è in realtà in uno standard GeoJSON, quindi ottieni tutte le coppie attributo-valore e la geometria incluse. La funzione esiste da qualche tempo, descritta per la prima volta da Sean Gillies nel 2012, con un esempio di utilizzo qui . Non sono riuscito a trovare alcuna informazione da quale versione di QGIS sia disponibile e non ho ancora provato QGIS 3, ma sicuramente era disponibile almeno da 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.