O QGIS possui alguns recursos para análise de expressões semelhantes à SQL. Apenas um pequeno subconjunto da sintaxe SQL é suportado. As expressões podem ser avaliadas tanto como predicados booleanos (retornando Verdadeiro ou Falso) ou como funções (retornando um valor escalar) . Veja Expressões no Manual do Usuário para uma lista completa das funções disponíveis.
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’`
coluna referência — ao avaliar, a referência é substituída com o valor real do campo. Os nomes não alteram.
As seguintes operações estão disponíveis:
operadores aritméticos: +
, -
, *
, /
, ^
parênteses: para fazer cumprir a precedência do operador: (1 + 1) * 3
Sinal mais e menos: -12
, +5
funções matemáticas: sqrt
, sen
, cos
, tan
, asen
, acos
, atan
Funções de conversão: “to_int”, “to_real”, “to_string”, “to_date”
funções geométricas: $area
, $length
funções de manipulação de geometria: “$x”, “$y”, “$geometry”, “num_geometries”, “centroid”
E os seguintes predicados são suportados:
comparação: =
, !=
, >
, >=
, <
, <=
correspondência padrão: LIKE
(usando % e _), ~
(expressões regulares)
predicados lógicos: AND
, OR
, NOT
verificação de valor nulo: IS NULL
, IS NOT NULL
Exemplos de predicados:
1 + 2 = 3
sen(ângulo) > 0
'Hello' LIKE 'He%'
(x > 10 AND y > 10) OR z = 0
Exemplos de expressões escalares:
2 ^ 10
sqrt(val)
$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
O exemplo seguinte irá avaliar a expressão dada contra uma característica. “Column” é o nome do campo na camada.
>>> exp = QgsExpression('Column = 99')
>>> value = exp.evaluate(feature, layer.pendingFields())
>>> bool(value)
True
Você também pode usar QgsExpression.prepare() se você precisar verificar mais de uma característica. Usando QgsExpression.prepare() irá aumentar a velocidade que a avaliação leva para executar.
>>> 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
O exemplo seguinte pode ser usado para filtrar uma camada e devolver qualquer característica que corresponda a um predicado.
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"