"Вибрати за атрибутом" у QGIS за допомогою python?


16

Чи є спосіб використовувати функцію "Select by Attribute" у QGIS за допомогою команди python? У моєму плагіні користувач повинен ввести значення через GUI, і це значення має використовуватися у функції, яка вибирає всі функції, які мають цей атрибут. Ім'я стовпця закріплено в коді, функція повинна шукати лише правильне значення.

У моєму поточному рішенні функція підключає QGIS до бази даних PostgreSQL і запускає оператор SQL. Це створює таблицю з результату, і таблиця візуалізується як Shapefile у QGIS.

В принципі, досить було б виділити особливості, а не створювати новий Shapefile вибору. Використання функції "Вибрати за атрибутом" також пропустить непотрібне підключення до бази даних.

Чи є спосіб використовувати функцію "Вибрати за атрибутом" у python, щоб функції були виділені? Використовуючи функцію в QGIS, усі функції, які не відповідають запиту, є тимчасовим вимиканням, що теж буде нормально.


1
Ці відповіді потребують оновлення qgis 3.
MonsterMushroom

Відповіді:


8

Так. Ви можете отримати всі атрибути через зв'язки python та здійснити додаткову фільтрацію у власному плагіні. Дивіться цей уривок CooQ із книги PyQGIS для пробігу та деякі приклади. Тоді ви просто виключите невідповідні результати з поверненого словника.

Що стосується візуалізації, то, швидше за все, вам доведеться створити ще один шар, оскільки 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);

Як шкода! Я думав, що це можливо в QGIS, тому що це можливо і в ArcGIS, використовуючи arcpy. Тим не менше дякую за вашу відповідь!
користувачHH

Можливо, є спосіб; Я просто не знаю цього. Дайте іншим користувачам сайту деякий час - можливо, хтось і робить.
lynxlynxlynx

Я думаю, що це має бути можливо. У QGIS всі функції візуалізуються, що відповідають вибору, всі інші функції тимчасово вимикаються.
користувачHH

Це, я знайшов. QGIS робить це в основі, але, схоже, він виставляє достатньо інтерфейсу для коректного вибору.
lynxlynxlynx

Чи можете ви надіслати мені посилання?
користувачHH

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 і пізнішої версії), вона буде відфільтрована безпосередньо в базі даних, настільки ефективнішою, ніж інші рішення, при цьому вона ще буде дуже читабельною.


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