Espressioni, Filtraggio e Calcolo di Valori

QGIS offre supporto per l’analisi di espressioni SQL. Solo un piccolo sottoinsieme della sintassi SQL é supportato. Le espressioni possono essere valutate sia come predicati booleani (che restituiscono Vero o Falso) o come funzioni (che restituiscono un valore scalare). Vedi Espressioni nel Manuale dell’Utente per una lista completa delle funzioni presenti.

Sono supportati tre tipi base:

  • numero – sia numeri interi che decimali, e.g. 123, 3.14

  • stringa – devono essere racchiuse tra apici singoli: 'hello world'

  • riferimento a colonna – durante la valutazione, il riferimento é sostituito con il valore del campo. I nomi non sono racchiusi tra apici.

Sono disponibili le seguenti operazioni:

  • operatori aritmetici: +, -, *, /, ^

  • parentesi: per forzare la precedenza tra operatori: (1 + 1) * 3

  • somma e sottrazione unari: -12, +5

  • funzioni matematiche: sqrt, sin, cos, tan, asin, acos, atan

  • funzioni di conversione: to_int, to_real, to_string, to_date

  • funzioni sulla geometria: $area, $length

  • funzioni di manipolazione della geometria: $x, $y, $geometry, num_geometries, centroid

Sono supportati i seguenti predicati:

  • comparazione: =, !=, >, >=, <, <=

  • pattern matching: LIKE (usando % e _), ~ (espressioni regolari)

  • predicati logici: AND, OR, NOT

  • controllo di valori NULL: IS NULL, IS NOT NULL

Esempi di predicati:

  • 1 + 2 = 3
  • sin(angolo) > 0

  • 'Hello' LIKE 'He%'
  • (x > 10 AND y > 10) OR z = 0

Esempi di espressioni scalari:

  • 2 ^ 10
  • sqrt(val)
  • $length + 1

Analisi di Espressioni

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

Valutazione di Espressioni

Espressioni Base

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

Espressioni con geometrie

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

Gestione degli errori

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

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

print value

Esempi

L’esempio seguente puó essere usato per filtrare un layer e restituire qualsiasi geometria che soddisfi il predicato.

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"