Выбор объектов с помощью выражения с PyQGIS

13

Как выбрать объекты с помощью PyQGIS с помощью выражения?

Я пытался использовать, QgsExpressionно метод выбора не принимает его:

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

Возможно ли это, и если да, то как мне это сделать?

ustroetz
источник

Ответы:

24

Следуй этим шагам:

  1. Получить ссылку на слой:

    cLayer = iface.mapCanvas().currentLayer()

  2. Получить featureIterator из выражения:

    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'"). Я попытался добавить символ прерывания к поисковому запросу (для одинарных кавычек), но это не имеет значения. Интересно, что если я открою таблицу атрибутов, к которой я обращаюсь, и использую там построитель выражений, он делает выбор, если в качестве первой строки используется Police_ref, который я использую в качестве примера, но не иначе
Alex
@ GermánCarrillo извините, не берите в голову, я не уверен, что я сделал по-другому, но я могу заставить его выбирать функции сейчас! Для других читателей вам не нужен брейк-символ для одинарных кавычек
Alex
6

Это сработало для меня на консоли QGIS Python

layer = qgis.utils.iface.activeLayer()
layer .selectByExpression(" \"ogc_fid\" = '{}' ".format(482))
Мехмет Эркан
источник
Добро пожаловать в ГИС ЮВ. Как новый пользователь, пожалуйста, возьмите Тур . Существующий (и принятый) ответ является гораздо более полным. Как это улучшится? Как правило, способ заработать очки репутации состоит в том, чтобы отвечать на оставшиеся без ответа вопросы, но новый полный ответ на трехлетний вопрос был бы желателен, если бы он конкретно касался проблемы с предыдущим решением (в этом случае проблема, безусловно, должна быть упомянута) ,
Винс
2

Вам нужно только проверить это в интерфейсе GUI: «Выбрать по выражению». Если это работает, вы можете вставить его в код Python, заключив его в двойные кавычки "".

exp = QgsExpression("ogc_fid=482")

Если вы сравниваете со строкой, вы можете добавить одинарную кавычку ''.

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

Это тот же принцип в Python, он может иметь значение между двойной кавычкой и одинарной кавычкой.

Tao
источник