QGIS oferece alguns recursos para expressões de análise semelhante à SQL. Apenas um pequeno subconjunto de sintaxe SQL é suportada. As expressões podem ser avaliadas como predicados booleanos (retornando verdadeiro ou falso) ou como funções (que retornam um valor escalar).
Três tipos básicos são suportados:
número — ambos os números inteiros e números decimais, por exemplo, 123, 3.14
texto — eles devem estar entre aspas simples: ‘Olá world’`
As seguintes operações estão disponíveis:
operadores aritméticos: +, -, *, /, ^
parênteses: para fazer cumprir a precedência do operador: (1 + 1) * 3
funções matemáticas: sqrt, sen, cos, tan, asen, acos, atan
funções geométricas: $area, $length
conversão de funções: para int, para real, para string
E os seguintes predicados são suportados:
comparação: =, !=, >, >=, <, <=
Exemplos de predicados:
sen(ângulo) > 0
Examples of scalar expressions:
>>> 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 Expection(exp.parserErrorString())
value = exp.evaluate()
if exp.hasEvalError():
raise ValueError(exp.evalErrorString())
print value
The following example can be used to filter a layer and return any feature that matches a predicate.
def where(layer, exp):
print "Where"
exp = QgsExpression(exp)
if exp.hasParserError():
raise Expection(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"