Wybieranie funkcji za pomocą wyrażenia za pomocą PyQGIS

13

Jak mogę wybrać funkcje w PyQGIS za pomocą wyrażenia?

Próbowałem użyć QgsExpressionmetody, ale wybrana metoda jej nie przyjmuje:

exp = QgsExpression("'ogc_fid' = 482")
cLayer = canvas.currentLayer()
cLayer.select(exp)

Czy to możliwe, a jeśli tak, jak to zrobić?

ustroetz
źródło

Odpowiedzi:

24

Obecnie (QGIS v3.x)

  1. Uzyskaj odniesienie do warstwy:

    layer = iface.activeLayer()

  2. Wybierz funkcje według wyrażenia:

    layer.selectByExpression( "\"ogc_fid\"=482" )


Przed QGIS 2.16

Wykonaj następujące kroki:

  1. Uzyskaj odniesienie do warstwy:

    cLayer = iface.mapCanvas().currentLayer()

  2. Uzyskaj FeatureIterator z wyrażenia:

    expr = QgsExpression( "\"ogc_fid\"=482" )

    it = cLayer.getFeatures( QgsFeatureRequest( expr ) )

  3. Zbuduj listę identyfikatorów funkcji na podstawie wyników uzyskanych w 2 .:

    ids = [i.id() for i in it]

  4. Wybierz funkcje z identyfikatorami uzyskanymi w 3 .:

    cLayer.setSelectedFeatures( ids )


UWAGA: Jeśli chcesz ustawić wyrażenie z wartością ciągu , musisz dodać znaki cudzysłowu do takiej wartości, w ten sposób:

expr = QgsExpression( " \"name\" = 'my string' " )

Jeśli wartość ciągu pochodzi od zmiennej, możesz to zrobić:

myVariable = 'my string'
expr = QgsExpression( " \"name\" = '{}' ".format(myVariable) )
Germán Carrillo
źródło
Jak mam powiedzieć "\"ogc_fid\"=482 AND name=\"hello world\""? Tutaj napisano, że nie jest to dostępne w Pythonie: qgis.org/api/… . Może znasz sposób na obejście tego ograniczenia?
Jenia Iwanow
2
Należy pamiętać, że nazwy pól muszą być cudzysłowami, wartości ciągów pojedynczych, a liczby nie wymagają cudzysłowów. W przykładzie: "\"ogc_fid\"=482 AND \"name\"='hello world'". BTW, link podany w komentarzu faktycznie oznacza, że ​​atrybut statyczny BinaryOperatorTextnie jest dostępny w powiązaniach Pythona, ale operatory działają QgsExpression, nawet jeśli są używane przez powiązania Pythona.
Germán Carrillo
@ GermánCarrillo Używam powyższej metody, ale nie mogę jej zwrócić wartości, mimo że skopiowałem i wkleiłem znaną wartość do wyszukania. Kolumna zawiera ciągi, więc użyłem expr = QgsExpression("\"police_ref\" = 'P0580996'"). Próbowałem dodać znak przerwania do wyszukiwanego terminu (dla pojedynczych cudzysłowów), ale to nie robi różnicy. Co ciekawe, jeśli otworzę tabelę atrybutów, o którą pytam, i użyję konstruktora wyrażeń, dokona wyboru, jeśli policja_ref, której użyję jako przykład, znajduje się w pierwszym rzędzie, ale nie inaczej
Alex
@ GermánCarrillo przepraszam, nieważne, nie jestem pewien, co zrobiłem inaczej, ale mogę teraz wybrać funkcje! Dla innych czytających nie potrzebujesz przerywnika dla pojedynczych cytatów
Alex
6

To działało dla mnie w QGIS Python Console

layer = qgis.utils.iface.activeLayer()
layer .selectByExpression(" \"ogc_fid\" = '{}' ".format(482))
mehmet ercan
źródło
Witamy w GIS SE. Jako nowy użytkownik, zapoznaj się z przewodnikiem . Istniejąca (i zaakceptowana) odpowiedź jest znacznie bardziej kompletna. Jak to się poprawia? Ogólnie rzecz biorąc, sposobem na zdobycie punktów reputacji jest udzielenie odpowiedzi na pytania bez odpowiedzi, ale nowa kompletna odpowiedź na trzyletnie pytanie byłaby mile widziana, gdyby konkretnie rozwiązała problem z poprzednim rozwiązaniem (w którym to przypadku należy z pewnością wspomnieć o tym problemie) .
Vince
2

Musisz go tylko przetestować w interfejsie GUI: „Wybierz według wyrażenia”. Jeśli to działa, możesz wkleić go w kodzie Pythona otoczonym podwójnymi cudzysłowami „”.

exp = QgsExpression("ogc_fid=482")

Jeśli porównasz do ciągu, możesz dodać pojedynczy cudzysłów „”.

exp = QgsExpression("ogc_fid='482'")

Jest to ta sama zasada w pythonie, może różnicować podwójny cytat i pojedynczy cytat.

Tao
źródło