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:
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]
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 importQgsProject
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.
Odpowiedzi:
Aby zapętlić każdą funkcję w warstwie, użyj
getFeatures()
generatora. Zwraca iterator funkcji (QgsFeature
) w warstwie.Jeśli interesuje Cię tylko konkretna funkcja, zamiast wszystkich funkcji w warstwie, możesz uzyskać do niej dostęp za pomocą a
QgsFeatureRequest
i jej FID:Po utworzeniu
QgsFeature
obiektu możesz użyćattributes()
metody do pobrania atrybutów (aka kolumn lub pól) powiązanych z tą funkcją (aka wiersz), np .:Jeśli chcesz zindeksować pole według jego nazwy, a nie liczby, musisz użyć odwzorowań pól:
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
QgsFeature
jakdict
npNie jestem pewien, która wersja się pojawiła lub czy zawsze tam była.
źródło
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:
źródło
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.
Uwaga mapLayersByName zwraca listę warstw o podanej nazwie. Zakładam, że istnieje jeden dla tego przykładu.
źródło