QGIS are un oarecare suport pentru analiza expresiilor, cum ar fi SQL. Doar un mic subset al sintaxei SQL este acceptat. Expresiile pot fi evaluate fie ca predicate booleene (returnând True sau False), fie ca funcții (care întorc o valoare scalară). Parcurgeți Expresii din Manualul Utilizatorului, pentru o listă completă a funcțiilor disponibile.
Trei tipuri de bază sunt acceptate:
— număr atât numere întregi cât și numere zecimale, de exemplu, 123, 3.14
șir — acesta trebuie să fie cuprins între ghilimele simple: 'hello world'
referință către coloană — atunci când se evaluează, referința este substituită cu valoarea reală a câmpului. Numele nu sunt protejate.
Următoarele operațiuni sunt disponibile:
operatori aritmetici: +, -, *, /, ^
paranteze: pentru forțarea priorității operatorului: (1 + 1) * 3
plus și minus unari: -12, +5
funcții matematice: sqrt, sin, cos, tan, asin, acos, atan
funcții de conversie: to_int, to_real, to_string, to_date
funcții geometrice: $area, $length
funcții de manipulare a geometriei: $x, $y, $geometry, num_geometries, centroid
Și următoarele predicate sunt suportate:
comparație: =, !=, >, >=, <, <=
potrivirea paternurilor: LIKE (folosind % și _), ~ (expresii regulate)
predicate logice: AND, OR, NOT
verificarea valorii NULL: IS NULL, IS NOT NULL
Exemple de predicate:
Exemple de expresii scalare:
>>> 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
Următorul exemplu poate fi folosit pentru a filtra un strat și pentru a întoarce orice entitate care se potrivește unui predicat.
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"