Expresii, filtrarea și calculul valorilor

QGIS has some support for parsing of SQL-like expressions. Only a small subset of SQL syntax is supported. The expressions can be evaluated either as boolean predicates (returning True or False) or as functions (returning a scalar value).

Trei tipuri de bază sunt acceptate:

  • — număr atât numere întregi cât și numere zecimale, de exemplu, 123, 3.14

  • șir — acesta trebuie să fie cuprins între ghilimele simple: 'hello world'

  • referință către coloană — atunci când se evaluează, referința este substituită cu valoarea reală a câmpului. Numele nu sunt protejate.

Următoarele operațiuni sunt disponibile:

  • operatori aritmetici: +, -, *, /, ^

  • paranteze: pentru forțarea priorității operatorului: (1 + 1) * 3

  • plus și minus unari: -12, +5

  • funcții matematice: sqrt, sin, cos, tan, asin, acos, atan

  • funcții geometrice: $area, $length

  • conversion functions: to int, to real, to string

Și următoarele predicate sunt suportate:

  • comparație: =, !=, >, >=, <, <=

  • potrivirea paternurilor: LIKE (folosind % și _), ~ (expresii regulate)

  • predicate logice: AND, OR, NOT

  • verificarea valorii NULL: IS NULL, IS NOT NULL

Exemple de predicate:

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

Exemple de expresii scalare:

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

Parsarea expresiilor

>>> 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')

Evaluarea expresiilor

Expresii de bază

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

Expresii cu entități

Următorul exemplu va evalua expresia dată față de o entitate. “Column” este numele câmpului din strat.

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

De asemenea, puteți folosi QgsExpression.prepare(), dacă trebuie să verificați mai mult de o entitate. Utilizarea QgsExpression.prepare() va spori viteza evaluării.

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

Tratarea erorilor

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

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

print value

Exemple

Următorul exemplu poate fi folosit pentru a filtra un strat și pentru a întoarce orice entitate care se potrivește unui predicat.

def where(layer, exp):
  print "Where"
  exp = QgsExpression(exp)
  if exp.hasParserError():
    raise Exception(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"