Expressões, filtragem e cálculo dos valores

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’`

  • 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 geométricas: $area, $length

  • conversão de funções: para int, para real, para string

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

Expressões de Análise

>>> 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')

Expressões de Avaliação

Expressões Básicas

>>> exp = QgsExpression('1 + 1 = 2')
>>> value = exp.evaluate()
>>> value
1

Expressões com características

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

Manipulação de erros

exp = QgsExpression("1 + 1 = 2 ")
if exp.hasParserError():
  raise Exception(exp.parserErrorString())

value = exp.evaluate()
if exp.hasEvalError():
  raise ValueError(exp.evalErrorString())

print value

Exemplos

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"