QGIS has some support for parsing of SQL-like expressions. Only a small subset of SQL syntax is supported. The expressions can be evaluated either as boolean predicates (returning True or False) or as functions (returning a scalar value).
Se le da apoyo a tres tipos:
numero - números enteros y números con decimales, e.j. 123, 3.14
cadena - se tiene que encerrar en comas individuales: 'hola mundo'
columna de referencia - cuando se evalúa, la referencia se substituye con el valor actual del campo. Los nombres no se escapan.
Los siguientes operadores están disponibles:
operadores aritméticos: “+”. “-”, “/”, ^
paréntesis: para hacer cumplir la precedencia del operador: (1 + 1) * 3
unario mas y menos: -12, +5
funciones matemáticas: sqrt, sin, cos, tan, asin, acos, atan
funciones geométricas: $area, $length
Se apoya las siguientes predicciones:
comparación: =, !=, >, >=, <, <=
patrones iguales: LIKE (using % and _), ~ (expresión regular)
lógica predicado: AND, OR, NOT
revisión de valores NULO: IS NULL, IS NOT NULL
Ejemplos de predicado:
sin(angulo) > 0
‘Hello’ LIKE ‘He%’`
Ejemplo de escala de expresiones:
>>> 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
El siguiente ejemplo evalua las expresiones dadas con un elemento. “Columna” es el nombre del campo en una capa.
>>> exp = QgsExpression('Column = 99')
>>> value = exp.evaluate(feature, layer.pendingFields())
>>> bool(value)
True
También puedes utilizar QgsExpression.prepare() Si necesitas mas de una característica, utilizando, Using QgsExpression.prepare() puede aumentar la velocidad de la cual se corre evaluación.
>>> 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
El siguiente ejemplo se puede utilizar para filtra capas y regresar cualquier característica que empata con el 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"