«Выбрать по атрибуту» в QGIS, используя python?

16

Есть ли способ использовать функцию «Выбрать по атрибуту» в QGIS с помощью команды python? В моем плагине пользователь должен ввести значение через графический интерфейс, и это значение должно использоваться в функции, которая выбирает все функции, которые имеют этот атрибут. Имя столбца фиксируется в коде, функция должна искать только правильное значение.

В моем текущем решении функция соединяет QGIS с базой данных PostgreSQL и выполняет оператор SQL. Это создает таблицу из результата, и таблица визуализируется как Shapefile в QGIS.

В принципе, этого было бы достаточно, чтобы выделить элементы, а не создавать новый шейп-файл выделения. Использование функции «Выбрать по атрибуту» также пропустит ненужное подключение к базе данных.

Есть ли способ использовать функцию «Выбрать по атрибуту» в Python, чтобы функции были выделены? Используя функцию в QGIS, все функции, которые не соответствуют запросу, временно отключены, что также будет нормально.

userHH
источник
1
Эти ответы нуждаются в обновлении qgis 3.
MonsterMushroom

Ответы:

8

Да. Вы можете получить все атрибуты через привязки Python и реализовать дополнительную фильтрацию в своем собственном плагине. Смотрите этот отрывок из PyQGIS Coobook для краткого изложения и некоторых примеров. Затем вы просто исключили бы любые несоответствующие результаты из возвращенного словаря.

Что касается визуализации, вам, вероятно, все равно придется создать еще один слой, поскольку select()он не имеет подходящих аргументов. Вы можете использовать слой памяти, чтобы избежать необходимости создавать физические файлы (подробнее об этом в кулинарной книге).

редактировать:

На самом деле, вы можете использовать selectedFeaturesIds()с, setSelectedFeatures(ids)чтобы изменить выбор на подмножество, которое вы создали. Цитируя реализацию напрямую:

/** Get a copy of the user-selected features */  
QList<QgsFeature> selectedFeatures();

/** Return reference to identifiers of selected features */
const QSet<qint64> &selectedFeaturesIds() const;

/** Change selection to the new set of features */
void setSelectedFeatures(const QSet<qint64> &ids);
lynxlynxlynx
источник
Как жаль! Я думал, что это возможно в QGIS, потому что это также возможно в ArcGIS с использованием arcpy. Тем не менее, спасибо за ваш ответ!
userHH
Может быть, есть способ; Я просто не знаю этого. Дайте время другим пользователям сайта - может быть, кто-то и сделает.
lynxlynxlynx
Я думаю, что это должно быть возможно. В QGIS все функции визуализируются в соответствии с выделением, все остальные функции временно отключаются.
userHH
Я нашел это. QGIS делает это в основном, но похоже, что он предоставляет достаточно интерфейса для правильной настройки выбора.
lynxlynxlynx
Вы можете отправить мне ссылку?
userHH
9

Начиная с QGIS 2.2 это поддерживается очень естественным образом. Это можно сделать с помощью механизма выражений QGIS, используя QgsFeatureRequest.setFilterExpression( unicode )метод.

# The important part: get the feature iterator with an expression
it = l.getFeatures( QgsFeatureRequest().setFilterExpression ( u'"Counties" = \'Norwich\'' ) )
# Set the selection
l.setSelectedFeatures( [ f.id() for f in it ] )

Лучшее в этом: если у вас последняя версия QGIS (2.10 и более поздние), она будет отфильтрована непосредственно в базе данных, намного более производительной, чем другие решения, и при этом будет очень удобочитаемой.

Матиас Кун
источник