Jak odczytać wartości atrybutów za pomocą PyQGIS?

18

W jaki sposób można uzyskać informacje zawarte w tabeli atrybutów, powiedzmy w kolumnie 2, wiersz 2, używając pyqgis?

użytkownik16018
źródło
Jest to pomocne, ale wydaje się, że daje to tylko wartość atrybutów. Wygląda na to, że atrybuty muszą być parą nazwa / wartość. Jak uzyskać nazwę dla każdego atrybutu? Czy o to właśnie chodzi w „polach”?
ajpieri
To tak naprawdę nie odpowiada na pytanie. Jeśli masz inne pytanie, możesz je zadać, klikając Zadaj pytanie . Możesz także dodać nagrodę za zwrócenie większej uwagi na to pytanie, gdy będziesz mieć wystarczającą reputację . - Z recenzji
Martin Hügi

Odpowiedzi:

43

Aby zapętlić każdą funkcję w warstwie, użyj getFeatures()generatora. Zwraca iterator funkcji ( QgsFeature) w warstwie.

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

Jeśli interesuje Cię tylko konkretna funkcja, zamiast wszystkich funkcji w warstwie, możesz uzyskać do niej dostęp za pomocą a QgsFeatureRequesti jej FID:

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

Po utworzeniu QgsFeatureobiektu możesz użyć attributes()metody do pobrania atrybutów (aka kolumn lub pól) powiązanych z tą funkcją (aka wiersz), np .:

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

Jeśli chcesz zindeksować pole według jego nazwy, a nie liczby, musisz użyć odwzorowań pól:

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

Indeks pola nie powinien się zmieniać podczas pętli, więc wystarczy go wywołać tylko raz.

Więcej informacji i przykładów znajduje się w książce kucharskiej PyQGIS: http://www.qgis.org/pyqgis-cookbook/vector.html#iterating-over-vector-layer

Aktualizacja

Można znacznie łatwiej uzyskać dostęp do atrybutów przy użyciu funkcji QgsFeaturejak dictnp

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

Nie jestem pewien, która wersja się pojawiła lub czy zawsze tam była.

Snorfalorpagus
źródło
11

Pomyślałem, że rzeczywiście dodam trochę kodu, ponieważ google przeglądanie tego problemu zwraca to pytanie ... większość ludzi woli szybkie wyjaśnienie lub fragment kodu zamiast linku prowadzącego do strony zawierającej wiele dodatkowych informacji.

Aby uzyskać informacje w tabeli, musisz najpierw uzyskać dostęp do funkcji warstwy . W moim przypadku funkcje umieszczam w zmiennej. Następnie przeglądasz funkcje i dla każdej funkcji wywołujesz jej atrybuty , które można następnie wydrukować za pomocą indeksu kolumny . Na przykład, jeśli chciałbym uzyskać wszystkie wartości w drugiej kolumnie, zrobiłbym to:

lyr = iface.activeLayer()

features = lyr.getFeatures()

for feat in features:
    attrs = feat.attributes()
    print attrs[1]
BritishSteel
źródło
1

Powyższe odpowiedzi pokazują tylko, jak to zrobić dla warstwy aktywnej. Myślę, że w wielu przypadkach możesz chcieć znaleźć wspomniany atrybut dla warstwy, która nie jest warstwami aktywnymi, lub warstwy zaznaczonej w oknie Warstwy. Poniższy kod wyświetli listę wszystkich warstw dodanych do okna Warstwy (niezależnie od tego, czy są zaznaczone czy aktywne) i znajdzie atrybut w wierszu 2, kolumnie 2.

from qgis.core import QgsProject

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

Uwaga mapLayersByName zwraca listę warstw o ​​podanej nazwie. Zakładam, że istnieje jeden dla tego przykładu.

ajpieri
źródło