Come leggere i valori degli attributi usando PyQGIS?


18

Qual è il modo per ottenere le informazioni contenute nella tabella degli attributi, diciamo nella colonna 2, riga 2 usando pyqgis?


Questo è utile, ma sembra darti solo il valore degli attributi. Sembra che gli attributi debbano essere una coppia nome / valore. Come si ottiene il nome per ciascun attributo? È questo ciò che riguarda i "campi"?
ajpieri,

Questo non risponde davvero alla domanda. Se hai una domanda diversa, puoi farla facendo clic su Poni domanda . Puoi anche aggiungere una taglia per attirare più attenzione a questa domanda una volta che hai abbastanza reputazione . - Dalla recensione
Martin Hügi,

Risposte:


43

Per eseguire il ciclo su ogni funzione in un livello, utilizzare il getFeatures()generatore. Questo restituisce un iteratore di features ( QgsFeature) nel layer.

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

Se sei interessato solo a una particolare funzionalità, anziché a tutte le funzionalità del livello, puoi accedervi usando a QgsFeatureRequested è FID:

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

Una volta che hai un QgsFeatureoggetto, puoi utilizzare il attributes()metodo per recuperare gli attributi (aka colonne o campi) associati a quella funzione (aka riga), ad esempio:

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

Se si desidera indicizzare il campo in base al nome, anziché a un numero, è necessario utilizzare i mapping dei campi:

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

L'indice di campo non dovrebbe cambiare durante il ciclo, quindi è necessario chiamarlo solo una volta.

Ulteriori informazioni ed esempi nel ricettario PyQGIS: http://www.qgis.org/pyqgis-cookbook/vector.html#iterating-over-vector-layer

Aggiornare

È possibile accedere agli attributi caratteristica molto più facilmente utilizzando il QgsFeaturecome una dict, ad esempio,

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

Non sono sicuro di quale versione sia arrivata o se sia sempre stata lì.


11

Pensavo di aggiungere effettivamente un po 'di codice, dato che googling questo problema restituisce questa domanda ... la maggior parte delle persone preferisce una spiegazione rapida o uno snippet di codice a un collegamento che porta a una pagina che contiene molte informazioni aggiuntive.

Per ottenere le informazioni in una tabella devi prima accedere alle funzionalità del livello . Nel mio caso ho inserito le funzionalità in una variabile. Quindi esegui il ciclo tra le funzioni e per ciascuna funzione chiami i suoi attributi , che possono quindi essere stampati utilizzando il loro indice di colonna . Ad esempio, se desidero ottenere tutti i valori nella seconda colonna, farei questo:

lyr = iface.activeLayer()

features = lyr.getFeatures()

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

1

Le risposte sopra mostrano solo come farlo per il livello attivo. Penso che, in molti casi, potresti voler trovare detto attributo per un livello che non è i livelli attivi o un livello controllato nella finestra Livelli. Il codice seguente otterrà un elenco di tutti i livelli aggiunti alla finestra Livelli (indipendentemente dal fatto che siano selezionati o attivi) e troverà l'attributo nella riga 2, colonna 2.

from qgis.core import QgsProject

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

Nota mapLayersByName restituisce un elenco di livelli con il nome specificato. Suppongo che ne esista uno per questo esempio.

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.