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.
68 lines
2.8 KiB
Python
68 lines
2.8 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
"""
|
|
***************************************************************************
|
|
ExtractByExpression.py
|
|
---------------------
|
|
Date : October 2016
|
|
Copyright : (C) 2016 by Nyall Dawson
|
|
***************************************************************************
|
|
* *
|
|
* 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__ = 'Nyall Dawson'
|
|
__date__ = 'October 2016'
|
|
__copyright__ = '(C) 2016, Nyall Dawson'
|
|
|
|
# This will get replaced with a git SHA1 when you do a git archive
|
|
|
|
__revision__ = '$Format:%H$'
|
|
|
|
import processing
|
|
from qgis.core import QgsExpression, QgsVectorLayer, QgsFeatureRequest
|
|
from processing.core.GeoAlgorithmExecutionException import GeoAlgorithmExecutionException
|
|
from processing.core.parameters import ParameterVector
|
|
from processing.core.outputs import OutputVector
|
|
from processing.core.GeoAlgorithm import GeoAlgorithm
|
|
from processing.core.parameters import ParameterString, ParameterExpression
|
|
from processing.tools import dataobjects
|
|
|
|
|
|
class ExtractByExpression(GeoAlgorithm):
|
|
|
|
INPUT = 'INPUT'
|
|
EXPRESSION = 'EXPRESSION'
|
|
OUTPUT = 'OUTPUT'
|
|
|
|
def defineCharacteristics(self):
|
|
self.name, self.i18n_name = self.trAlgorithm('Extract by expression')
|
|
self.group, self.i18n_group = self.trAlgorithm('Vector selection tools')
|
|
|
|
self.addParameter(ParameterVector(self.INPUT,
|
|
self.tr('Input Layer')))
|
|
self.addParameter(ParameterExpression(self.EXPRESSION,
|
|
self.tr("Expression"), parent_layer=self.INPUT))
|
|
self.addOutput(OutputVector(self.OUTPUT, self.tr('Extracted (expression)')))
|
|
|
|
def processAlgorithm(self, progress):
|
|
layer = dataobjects.getObjectFromUri(self.getParameterValue(self.INPUT))
|
|
expression_string = self.getParameterValue(self.EXPRESSION)
|
|
writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(layer.fields(), layer.wkbType(), layer.crs())
|
|
|
|
expression = QgsExpression(expression_string)
|
|
if not expression.hasParserError():
|
|
req = QgsFeatureRequest().setFilterExpression(expression_string)
|
|
else:
|
|
raise GeoAlgorithmExecutionException(expression.parserErrorString())
|
|
|
|
for f in layer.getFeatures(req):
|
|
writer.addFeature(f)
|
|
|
|
del writer
|