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
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
>>> 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
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
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"