Выражения, фильтрация и вычисление значений

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 (using % and _), ~ (регулярные выражения)
  • логические операторы: AND, OR, NOT
  • проверка на NULL: IS NULL, IS NOT NULL

Примечание по совместимости: математические и геометрические функции, функции преобразования типа и оператор возведения в степень ^ доступны начиная с QGIS 1.4.

Примеры предикатов:

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

Примеры скалярных выражений:

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

Разбор выражений

TODO: parsing, error handling

>>> s = QgsSearchString()
>>> s.setString("1 + 1 = 2")
True
>>> s.setString("1 + 1 =")
False
>>> s.parserErrorMsg()
PyQt4.QtCore.QString(u'syntax error, unexpected $end')

TODO: working with the tree, evaluation as a predicate, as a function, error handling

Вычисление выражений

st = ss.tree()
if not st:
  raise ValueError, "empty expression was used"

print st.makeSearchString()

res = st.checkAgainst(fields, feature.attributeMap())

res, value = st.getValue(st, fields, feature.attributeMap(), feature.geometry())

print st.errorMsg()

Содержание

Предыдущий раздел

Отрисовка карты и печать

Следующий раздел

Измерения

На этой странице