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).
Trois types basiques sont supportés :
nombre — aussi bien les nombres entiers que décimaux, par exemple 123, 3.14
texte — ils doivent être entre guillemets simples: 'hello world'
référence de colonne — lors de l’évaluation, la référence est remplacée par la valeur réelle du champ. Les noms ne sont pas échappés.
Les opérations suivantes sont disponibles:
opérateurs arithmétiques: +, -, *, /, ^
parenthèses: pour faire respecter la précédence des opérateurs: (1 + 1) * 3
les unaires plus et moins: -12, +5
fonctions mathématiques: sqrt, sin, cos, tan, asin, acos, atan
fonctions géométriques: $area, $length
Et les prédicats suivants sont pris en charge:
comparaison: =, !=, >, >=, <, <=
comparaison partielle: LIKE (avec % ou _), ~ (expressions régulières)
prédicats logiques: AND, OR, NOT
Vérification de la valeur NULL: IS NULL, IS NOT NULL
Exemples de prédicats:
Exemples d’expressions scalaires:
>>> 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
L’exemple suivant évaluera l’expression renseignée sur une entité. “Colonne” est le nom du champ de la couche.
>>> exp = QgsExpression('Column = 99')
>>> value = exp.evaluate(feature, layer.pendingFields())
>>> bool(value)
True
Vous pouvez aussi utiliser QgsExpression.prepare() si vous avez besoin de vérifier plus d’une entité. Utiliser QgsExpression.prepare() accélérera le temps d’évaluation.
>>> 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
L’exemple suivant peut être utilisé pour filtrer une couche et ne renverra que les entités qui correspondent au prédicat.
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"