Uzyskiwanie danych jednej wybranej funkcji w QGIS przy użyciu Pythona?

10

Mam problem / pytanie dotyczące Pythona i QGIS. Czy można uzyskać dane jednej wybranej funkcji w QGIS przy użyciu Pythona, a jeśli tak, to w jaki sposób?

W moim przykładzie mam warstwę, która pokazuje kilka działek do planowania urbanistycznego. Jeśli teraz wybiorę jedną z paczek, chcę uzyskać dane dokładnie dla tej paczki. Dane te powinny zostać odczytane przez skrypt Pythona, a następnie dodane do automatycznie utworzonego pliku PDF. Ostatni krok jest łatwy, ale nie otrzymałem danych z tej wybranej funkcji.

Możliwe jest uzyskanie danych z aktywnej warstwy, ale czy możliwe jest również uzyskanie danych z jednej wybranej funkcji tej warstwy?

Mam nadzieję, że możesz mi pomóc. pozdrowienia

Sven
źródło

Odpowiedzi:

15

Połączenie telefoniczne layer.selectedFeatures()zwróci listę z wybranymi funkcjami. Następnie możesz wywołać feature.attributeMap()każdą z wybranych funkcji, aby uzyskać słownik atrybutów każdej funkcji.

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

Ostatnio otrzymałem podobne pytanie: jak sprawdzać, czy wybrana jest funkcja podczas iteracji po warstwie wektorowej za pomocą pyqgis?

Cyrus
źródło
dziwne, obiekty QgsFeature, które wynikają z wybranych_funkcji, nie mają metody geometrii ...
user32882 15.09.19
9

Chciałem tylko opublikować kilka aktualizacji poprzedniej odpowiedzi w świetle zmian w QGIS Python API od wersji 2.0 .

Tak jak poprzednio, otrzymasz listę wybranych funkcji iface.activeLayer().selectedFeatures(), jednak w QGISwersjach >= 2.0używasz teraz tej funkcji QgsFeature.attributes()zamiast QgsFeature.attributeMap(). Dwie funkcje nie są dokładnie takie same: attributes()teraz zwraca listę , podczas gdy stara attributeMap()zwróciła słownik . Poświęć chwilę, aby zapoznać się z dokumentacją API dla QgsFeature.attributes(), QgsAttributesitp zrozumieć, w jaki sposób atrybuty są przechowywane / dostępne.

Jeśli jesteś zainteresowany, możesz przeczytać o uzasadnieniu zmian API w tym wątku na liście mailowej: [Qgis-developer] nowe funkcje wyboru interfejsu wektorowego . W skrócie (słowami dewelopera QGIS, Martina Dobiasa):

Dostęp do atrybutów: f.attributeMap()już nie ma, ponieważ atrybuty są teraz przechowywane w wektorze (Python:) listzamiast mapy (Python:) dict. QgsFeatureklasa emuluje obiekt kontenera Python 4, dzięki czemu można uzyskać dostęp do atrybutów tak, jakby QgsFeatureinstancja była listą lub słownikiem, przy czym kluczami są indeksy pól lub nazwy pól:

f[0] ... pierwszy atrybut

f["type"] ... atrybut o nazwie „typ”

Nadal można uzyskać wszystkie atrybuty: f.attributes()zwraca listę wartości.

Jako przykład konkretnie tego, o co pytałeś (jak uzyskać dane dla pojedynczej wybranej funkcji), załóżmy, że posiadasz warstwę zawierającą cityfunkcje, z których każda ma listę atrybutów, w tym countyatrybut. Aby uzyskać countywartość dla wybranego miasta (powiedzmy Helena, AR), wykonaj następujące czynności w konsoli Python:

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

Jeśli chcesz wartości wszystkich pól w tabeli atrybutów miasta, po prostu użyj:

cityData = city.attributes()
J. Taylor
źródło
Możesz także pobrać wszystkie nazwy pól z tego przykładu, używając city.fields (). Names (), co zwróci listę nazw pól.
Cary H
1

Chciałbym dodać coś użytecznego do odpowiedzi udzielonej przez J. Taylora i wskazać, że obecna zaakceptowana odpowiedź z 2012 roku nie jest już poprawna:

Obiekt QgsFeature obsługuje użyteczny __geo_interface__atrybut, który zwraca słownik z danej funkcji. Słownik jest w rzeczywistości w standardzie GeoJSON, więc uwzględniono wszystkie pary atrybut-wartość i geometrię. Ta funkcja istnieje od jakiegoś czasu, po raz pierwszy opisana przez Seana Gilliesa w 2012 roku, z przykładem użycia tutaj . Nie mogłem znaleźć żadnej informacji, z której wersji QGIS jest ona dostępna i nie próbowałem jeszcze QGIS 3, ale na pewno byłem dostępny przynajmniej z 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
źródło