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
>>> 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 Exception(exp.parserErrorString())
value = exp.evaluate()
if exp.hasEvalError():
raise ValueError(exp.evalErrorString())
print value
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"