Expressies, filteren en waarden berekenen

QGIS heeft enige ondersteuning voor het parsen van SQL-achtige expressies. Alleen een klein deel van de syntaxis voor SQL wordt ondersteund. De expressies kunnen worden geëvalueerd ófwel als Booleaanse uitdrukkingen (die True of False teruggeven) of als functies (die een scalaire waarde teruggeven).

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

  • functies voor conversie: 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"