Вирази, фільтрація та обчислення значень

QGIS має може виконувати синтаксичний аналіз SQL-подібних виразів. Підтримується лише обмежена підмножина мови SQL. Вирази можуть розглядатися як логічні предикати (обчислюються як True чи False) або як функції (обчислюються як скалярна величина).

Реалізовано підтримку трьох основних типів даних:

  • число — цілі та десяткові числа, наприклад 123, 3.14

  • рядок — повинні включатися в одинарні лапки: 'hello world'

  • посилання на стовпчик — під час обчислення посилання замінюється на значення вказаного поля. Імена полів не екрануються.

Доступні такі операції:

  • арифметичні оператори: +, -, *, /, ^

  • дужки: для зміни пріоритету операцій: (1 + 1) * 3

  • унарні плюс та мінус: -12, +5

  • математичні функції: sqrt, sin, cos, tan, asin, acos, atan

  • геометричні функції: $area, $length

  • функції перетворення типів даних: to int, to real, to string

Крім того, підтримуються наступні предикати:

  • порівняння: =, !=, >, >=, <, <=

  • відповідність зразку: LIKE (з використанням % та _), ~ (регулярні вирази)

  • логічні предикати: AND, OR, NOT

  • перевірка на NULL: IS NULL, IS NOT NULL

Приклади предикатів:

  • 1 + 2 = 3
  • sin(angle) > 0
  • 'Hello' LIKE 'He%'
  • (x > 10 AND y > 10) OR z = 0

Приклади скалярних виразів:

  • 2 ^ 10
  • sqrt(val)
  • $length + 1

Аналіз виразів

>>> exp = QgsExpression('1 + 1 = 2')
>>> exp.hasParserError()
False
>>> exp = QgsExpression('1 + 1 = ')
>>> exp.hasParserError()
True
>>> exp.parserErrorString()
PyQt4.QtCore.QString(u'syntax error, unexpected $end')

Обчислення виразів

Базові вирази

>>> exp = QgsExpression('1 + 1 = 2')
>>> value = exp.evaluate()
>>> value
1

Вирази з об’єктами

У наступних прикладах вираз обчислюється для поточного об’єкта. «Column» це назва поля атрибутивної таблиці шару.

>>> exp = QgsExpression('Column = 99')
>>> value = exp.evaluate(feature, layer.pendingFields())
>>> bool(value)
True

Якщо необхідно перевірити декілька об’єктів використовуйте QgsExpression.prepare().Використання :func:`QgsExpression.prepare()`підвищить швидкість аналізу та обчислення виразу.

>>> exp = QgsExpression('Column = 99')
>>> exp.prepare(layer.pendingFields())
>>> value = exp.evaluate(feature)
>>> bool(value)
True

Обробка помилок

exp = QgsExpression("1 + 1 = 2 ")
if exp.hasParserError():
  raise Expection(exp.parserErrorString())

value = exp.evaluate()
if exp.hasEvalError():
  raise ValueError(exp.evalErrorString())

print value

Приклади

Наступний приклад можна використовувати для фільтрації шару та отриманні об’єктів, які задовольняють умові.

def where(layer, exp):
  print "Where"
  exp = QgsExpression(exp)
  if exp.hasParserError():
    raise Expection(exp.parserErrorString())
  exp.prepare(layer.pendingFields())
  for feature in layer.getFeatures():
    value = exp.evaluate(feature)
    if exp.hasEvalError():
      raise ValueError(exp.evalErrorString())
    if bool(value):
      yield feature

layer = qgis.utils.iface.activeLayer()
for f in where(layer, 'Test > 1.0'):
  print f + " Matches expression"