Фільтруйте функції на основі їх атрибутів за допомогою Python?


16

Як отримати функції за їх атрибутами (схожими на Iqueryfilter в arbobjects) у Qgis за допомогою python? Замість того, щоб отримати всі функції та відфільтрувати їх вручну, чи є якийсь варіант використовувати де пункт для її фільтрації?

Приклад: у мене є назва поля "Округи". Він має більше п'ятдесяти тисяч функцій. Неможливо отримати всі функції та відфільтрувати їх через багато часу. Тож я можу запитати його, використовуючи iqueryfilter.whereclause = 'Counties = Norwich' в архівних об'єктах. Подібна річ мені потрібна в PyQgis.


1
@NathanW так, ти прав. мені потрібно лише повернути дані, використовуючи запит із шару. Ви можете надати мені будь-який приклад у pyqgis?
venkat

@NathanW Привіт, я зрозумів. його працює як запит визначення в аркгізі. дивись цей приклад. t = outputLayer.setSubsetString ('UniqID =' + inputFeat.attribute ("UniqID"). toPyObject ()), якщо t == True: outputProvider = outputLayer.dataProvider () print outputProvider.featureCount (), тобто він лише поверне запит задоволені дані
venkat

@venkat, де в QGIS ви ставите запит? Спасибі.
ianbroad

Відповіді:


12

Двигун вираження QGIS може це зробити за допомогою QgsFeatureRequest.setFilterExpression( unicode )методу (оскільки QGIS 2.2)

request = QgsFeatureRequest().setFilterExpression( u'"Counties" = \'Norwich\'' )
it = l.getFeatures( request )

Починаючи з QGIS 2.10, навіть можливо, що фільтрація таким чином дасть вам додаткову продуктивність порівняно з іншими типами фільтрації (наприклад, реалізацією python).

В основному це стосується, якщо виконуються наступні три умови:

  • Ви використовуєте шар з провайдером Postgis На даний момент (2.16) це реалізує набагато більше, ніж просто постачальник постгігів (просторовий, ogr, oracle ...).
  • Ваше вираз не дуже складно (речі , як >, =, IN, NOT NULL... підтримуються)
  • Ви ввімкнули цю функцію в Налаштуваннях> Параметри> Джерела даних> Обробка джерел даних> Виконати вираз на сервері postgres
  • Перевага від ефективності є оптимальним за допомогою відповідних індексів на таблицях бази даних

З QGIS 3.0 це навіть можна просто зробити

features = l.getFeatures('"Counties" = \'Norwicth\'')

1

Цей пост - який можна вважати відповіддю на повторне запитання - детально описує, як отримати всі атрибути з шару. Автор описує процес, який ви шукаєте, як фільтрування даних вручну після повернення. Це досить повна довідка, і їх посилання дійсно повинно вам допомогти.


2
Це не повторне запитання. я не хочу отримати всі атрибути з шару. Спочатку відфільтруйте його, а потім я хочу отримати функції, які відповідають критеріям фільтра. тобто продуктивність набагато краща.
venkat

1

Використовуючи запит sql, це також легко можливо ogr. Ви можете виконати цей код, наприклад, на консолі python QGIS або в окремому сценарії.
Приклад :

from osgeo import ogr

path = "path to your shapefile.shp"
ID = "FieldID" # For instance 'Countries' 
datasource = ogr.Open(str(path)) # your datasource

layer = datasource.GetLayer(0) # Import layer 0 --> only works with shapefiles
layerName = str( layer.GetName() )# Save the Layersname first

# Do the sql query
# Selects all features from a layer datasource where Field Countries is equal to 'Germany'
layers = datasource.ExecuteSQL("SELECT * FROM %s WHERE %s = '%s'" % (layerName, ID, 'Germany') )
res = []
for i in range(0,layers.GetFeatureCount()):
   f = layers.GetFeature(i)
   g = f.GetGeometryRef()
   res.append(g.Area()) 

# res now contains the measured area of each feature where the attribute ID has the value 'Germany'

0

Визначення фільтрів SQL ще не підтримується за допомогою API QGIS, починаючи з версії 1.9.

Як я розумію з цього статті списку розсилки , підтримка "SQL рідного постачальника" буде лише у майбутньому випуску.

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