Вибір функцій за допомогою виразу з PyQGIS


13

Як я можу вибрати функції з PyQGIS за допомогою виразу?

Я спробував використовувати, QgsExpressionале метод select не приймає його:

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

Чи можливо це, і якщо так, то як це зробити?

Відповіді:


24

На сьогодні (QGIS v3.x)

  1. Отримайте посилання на шар:

    layer = iface.activeLayer()

  2. Виберіть функції за виразом:

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


До QGIS 2.16

Виконайте такі дії:

  1. Отримайте посилання на шар:

    cLayer = iface.mapCanvas().currentLayer()

  2. Отримати функціюIterator з виразу:

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

    it = cLayer.getFeatures( QgsFeatureRequest( expr ) )

  3. Створіть список ідентифікаторів функцій з результату, отриманого в 2 .:

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

  4. Виберіть функції за допомогою ідентифікаторів, отриманих у 3 .:

    cLayer.setSelectedFeatures( ids )


ПРИМІТКА. Якщо ви хочете встановити вираз зі значенням рядка , вам потрібно додати такі лапки таким чином:

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

Якщо значення рядка походить від змінної, ви можете зробити це:

myVariable = 'my string'
expr = QgsExpression( " \"name\" = '{}' ".format(myVariable) )

Як я можу сказати "\"ogc_fid\"=482 AND name=\"hello world\""? Тут написано, що це не доступно в python: qgis.org/api/… . Може бути, ви знаєте спосіб обійти це обмеження?
Єнія Іванова

2
Майте на увазі, що назви полів повинні бути подвійними, цитата - значення рядків одинарними, а цифри не потребують лапок. У вашому прикладі: "\"ogc_fid\"=482 AND \"name\"='hello world'". До речі, посилання, яке ви включили у свій коментар, насправді вказує, що статичний атрибут BinaryOperatorTextнедоступний у прив'язках Python, але оператори працюють QgsExpression, навіть якщо вони використовуються через прив'язки Python.
Герман Каррільо

@ GermánCarrillo Я використовую ваш метод вище, але не можу змусити його повернути будь-які значення, незважаючи на те, щоб скопіювати та вставити відоме значення для пошуку. Колонка містить рядки, тому я використав expr = QgsExpression("\"police_ref\" = 'P0580996'"). Я спробував додати пошуковий знак до пошукового терміну (для одинарних лапок), але це не має значення. Цікаво, що якщо я відкрию таблицю атрибутів, яку я запитую, і використовую там конструктор виразів, він робить вибір, якщо поліція_ref, яку я використовую як приклад, знаходиться в першому ряду, але не інакше
Алекс

@ GermánCarrillo вибачте, не маю на увазі, я не впевнений, що я зробив по-іншому, але я можу зробити це, щоб вибрати функції зараз! Для інших, хто читає, вам не потрібен символ перерви для одиничних цитат
Алекс

6

Це працювало для мене на консолі QGIS Python

layer = qgis.utils.iface.activeLayer()
layer .selectByExpression(" \"ogc_fid\" = '{}' ".format(482))

Ласкаво просимо до GIS SE. Як новий користувач, будь ласка, прийміть Тур . Існуюча (і прийнята) відповідь набагато повніша. Як це покращується на цьому? Як правило, спосіб заробити репутаційні бали - відповісти на відповіді без відповіді , але нова повнота відповідь на трирічне запитання буде бажаною, якщо вона спеціально вирішує проблему з попереднім рішенням (в цьому випадку цю проблему обов'язково слід згадати) .
Вінс

2

Вам потрібно лише протестувати його в інтерфейсі GUI: "Вибрати за виразом". Якщо він працює, ви можете вставити його у свій код Python в оточенні подвійних лапок.

exp = QgsExpression("ogc_fid=482")

Якщо ви порівнюєте з рядком, ви можете додати одну цитату ''.

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

Це той самий принцип у python, він може зробити різницю між подвійною цитатою та одиничною цитатою.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.