mirror of
https://github.com/qgis/QGIS.git
synced 2025-03-04 00:30:59 -05:00
This adds a new input type for expression inputs. Expression inputs can be linked to a parent layer so that the builder shows the correct fields and layer variables. It's designed for two use cases: 1. to be used when an algorithm specifically requires an expression, eg Select by Expression and Extract by Expression. 2. to be potentially used as a replacement input instead of string or number literals in algorithms. Eg - if the simplify algorithm tolerance parameter was replaced with an expression paremeter, then this expression would be evaluated for every feature before simplifying that feature. It would allow parameters to be calculated per feature, as opposed to the current approach of calculating a parameter once before running the algorithm. It would also mean algorithms like "variable distance buffer" would no longer be needed, as a single "buffer" algorithm could then be used for either a fixed distance, field based, or expression based distance.
83 lines
3.5 KiB
Python
83 lines
3.5 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
"""
|
|
***************************************************************************
|
|
SelectByExpression.py
|
|
---------------------
|
|
Date : July 2014
|
|
Copyright : (C) 2014 by Michael Douchin
|
|
***************************************************************************
|
|
* *
|
|
* This program is free software; you can redistribute it and/or modify *
|
|
* it under the terms of the GNU General Public License as published by *
|
|
* the Free Software Foundation; either version 2 of the License, or *
|
|
* (at your option) any later version. *
|
|
* *
|
|
***************************************************************************
|
|
"""
|
|
|
|
__author__ = 'Michael Douchin'
|
|
__date__ = 'July 2014'
|
|
__copyright__ = '(C) 2014, Michael Douchin'
|
|
|
|
# This will get replaced with a git SHA1 when you do a git archive
|
|
|
|
__revision__ = '$Format:%H$'
|
|
|
|
from qgis.core import QgsExpression, QgsVectorLayer
|
|
from processing.core.GeoAlgorithmExecutionException import GeoAlgorithmExecutionException
|
|
from processing.core.parameters import ParameterVector
|
|
from processing.core.parameters import ParameterSelection
|
|
from processing.core.outputs import OutputVector
|
|
from processing.core.GeoAlgorithm import GeoAlgorithm
|
|
from processing.core.parameters import ParameterExpression
|
|
from processing.tools import dataobjects
|
|
|
|
|
|
class SelectByExpression(GeoAlgorithm):
|
|
|
|
LAYERNAME = 'LAYERNAME'
|
|
EXPRESSION = 'EXPRESSION'
|
|
RESULT = 'RESULT'
|
|
METHOD = 'METHOD'
|
|
|
|
def defineCharacteristics(self):
|
|
self.name, self.i18n_name = self.trAlgorithm('Select by expression')
|
|
self.group, self.i18n_group = self.trAlgorithm('Vector selection tools')
|
|
|
|
self.methods = [self.tr('creating new selection'),
|
|
self.tr('adding to current selection'),
|
|
self.tr('removing from current selection'),
|
|
self.tr('selecting within current selection')]
|
|
|
|
self.addParameter(ParameterVector(self.LAYERNAME,
|
|
self.tr('Input Layer')))
|
|
self.addParameter(ParameterExpression(self.EXPRESSION,
|
|
self.tr("Expression"), parent_layer=self.LAYERNAME))
|
|
self.addParameter(ParameterSelection(self.METHOD,
|
|
self.tr('Modify current selection by'), self.methods, 0))
|
|
self.addOutput(OutputVector(self.RESULT, self.tr('Selected (expression)'), True))
|
|
|
|
def processAlgorithm(self, progress):
|
|
filename = self.getParameterValue(self.LAYERNAME)
|
|
layer = dataobjects.getObjectFromUri(filename)
|
|
oldSelection = set(layer.selectedFeaturesIds())
|
|
method = self.getParameterValue(self.METHOD)
|
|
|
|
if method == 0:
|
|
behaviour = QgsVectorLayer.SetSelection
|
|
elif method == 1:
|
|
behaviour = QgsVectorLayer.AddToSelection
|
|
elif method == 2:
|
|
behavior = QgsVectorLayer.RemoveFromSelection
|
|
elif method == 3:
|
|
behaviour = QgsVectorLayer.IntersectSelection
|
|
|
|
expression = self.getParameterValue(self.EXPRESSION)
|
|
qExp = QgsExpression(expression)
|
|
if qExp.hasParserError():
|
|
raise GeoAlgorithmExecutionException(qExp.parserErrorString())
|
|
|
|
layer.selectByExpression(expression, behaviour)
|
|
self.setOutputValue(self.RESULT, filename)
|