Expressies, filteren en waarden berekenen

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

Drie basistypen worden ondersteund:

  • number — zowel gehele getallen als decimale getallen, bijv. 123, 3.14

  • string — zij moeten zijn omsloten door enkele aanhalingstekens: 'hallo wereld'

  • kolomverwijzing — tijdens evaluatie wordt de verwijzing vervangen door de actuele waarde van het veld. De namen worden niet geëscaped.

De volgende bewerkingen zijn beschikbaar:

  • rekenkundige operatoren: +, -, *, /, ^

  • haakjes: voor het forceren van de voorrang van de operator: (1 + 1) * 3

  • unaire plus en minus: -12, +5

  • wiskundige functies: sqrt, sin, cos, tan, asin, acos, atan

  • geometrische functies: $area, $length

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

En de volgende termen worden ondersteund:

  • vergelijking: =, !=, >, >=, <, <=

  • overeenkomst van patroon: LIKE (gebruiken van % en _), ~ (reguliere expressies)

  • logische termen: AND, OR, NOT

  • controle op waarde NULL: IS NULL, IS NOT NULL

Voorbeelden van termen:

  • 1 + 2 = 3
  • sin(hoek) > 0

  • 'Hallo' LIKE 'Ha%'

  • (x > 10 AND y > 10) OR z = 0

Voorbeelden van scalaire expressies:

  • 2 ^ 10
  • sqrt(waarde)

  • $length + 1

Parsen van expressies

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

Evalueren van expressies

Basisexpressies

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

Expressies met objecten

Het voorbeeld evalueert de opgegeven expressie ten opzichte van een object. “Kolom” is de naam van het veld in de laag.

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

U kunt ook QgsExpression.prepare() gebruiken als u mmer dan één object wilt controleren. Het gebruiken van QgsExpression.prepare() zal de snelheid verhogen die de evaluatie nodig heeft om te worden uitgevoerd.

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

Fouten afhandelen

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

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

print value

Voorbeelden

Het volgende voorbeeld kan worden gebruikt om een laag te filteren en elk object terug te geven dat overeenkomt met een term.

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"