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). Bekijk Expressies in de Gebruikershandleiding voor een volledige lijst van beschikbare functies.
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
functies voor conversie: to_int, to_real, to_string, to_date
geometrische functies: $area, $length
functies voor afhandelen van geometrie: $x, $y, $geometry, num_geometries, centroid
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:
sin(hoek) > 0
'Hallo' LIKE 'Ha%'
Voorbeelden van scalaire expressies:
sqrt(waarde)
>>> 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')
>>> exp = QgsExpression('1 + 1 = 2')
>>> value = exp.evaluate()
>>> value
1
The following example will evaluate the given expression against a feature. “Column” is the name of the field in the layer.
>>> exp = QgsExpression('Column = 99')
>>> value = exp.evaluate(feature, layer.pendingFields())
>>> bool(value)
True
You can also use QgsExpression.prepare() if you need check more than one feature. Using QgsExpression.prepare() will increase the speed that evaluate takes to run.
>>> exp = QgsExpression('Column = 99')
>>> exp.prepare(layer.pendingFields())
>>> value = exp.evaluate(feature)
>>> bool(value)
True
exp = QgsExpression("1 + 1 = 2 ")
if exp.hasParserError():
raise Exception(exp.parserErrorString())
value = exp.evaluate()
if exp.hasEvalError():
raise ValueError(exp.evalErrorString())
print value
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"