Expresii, filtrarea și calculul valorilor

QGIS are un oarecare suport pentru parsarea expresiilor, cum ar fi SQL. Doar un mic subset al sintaxei SQL este suportat. Expresiile pot fi evaluate fie ca predicate booleene (returnând Adevărat sau Fals) sau ca funcții (care întorc o valoare scalară).

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

  • funcții de conversie: 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"