QGIS API Documentation  3.6.0-Noosa (5873452)
qgsalgorithmfilter.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsalgorithmfilter.cpp
3  ---------------------
4  begin : April 2018
5  copyright : (C) 2018 by Matthias Kuhn
6  email : [email protected]
7  ***************************************************************************/
8 
9 /***************************************************************************
10  * *
11  * This program is free software; you can redistribute it and/or modify *
12  * it under the terms of the GNU General Public License as published by *
13  * the Free Software Foundation; either version 2 of the License, or *
14  * (at your option) any later version. *
15  * *
16  ***************************************************************************/
17 
18 #include "qgsalgorithmfilter.h"
19 #include "qgsapplication.h"
20 
22 
23 QString QgsFilterAlgorithm::name() const
24 {
25  return QStringLiteral( "filter" );
26 }
27 
28 QString QgsFilterAlgorithm::displayName() const
29 {
30  return QObject::tr( "Feature filter" );
31 }
32 
33 QStringList QgsFilterAlgorithm::tags() const
34 {
35  return QObject::tr( "filter,proxy,redirect,route" ).split( ',' );
36 }
37 
38 QString QgsFilterAlgorithm::group() const
39 {
40  return QObject::tr( "Vector table" );
41 }
42 
43 QString QgsFilterAlgorithm::groupId() const
44 {
45  return QStringLiteral( "vectortable" );
46 }
47 
48 QgsProcessingAlgorithm::Flags QgsFilterAlgorithm::flags() const
49 {
50  return FlagHideFromToolbox;
51 }
52 
53 QString QgsFilterAlgorithm::shortHelpString() const
54 {
55  return QObject::tr( "This algorithm filters features from the input layer and redirects them to one or several outputs." );
56 }
57 
58 QgsFilterAlgorithm *QgsFilterAlgorithm::createInstance() const
59 {
60  return new QgsFilterAlgorithm();
61 }
62 
63 QgsFilterAlgorithm::~QgsFilterAlgorithm()
64 {
65  qDeleteAll( mOutputs );
66 }
67 
68 void QgsFilterAlgorithm::initAlgorithm( const QVariantMap &configuration )
69 {
70  addParameter( new QgsProcessingParameterFeatureSource( QStringLiteral( "INPUT" ), QObject::tr( "Input layer" ) ) );
71 
72  const QVariantList outputs = configuration.value( QStringLiteral( "outputs" ) ).toList();
73  for ( const QVariant &output : outputs )
74  {
75  const QVariantMap outputDef = output.toMap();
76  const QString name = QStringLiteral( "OUTPUT_%1" ).arg( outputDef.value( QStringLiteral( "name" ) ).toString() );
77  QgsProcessingParameterFeatureSink *outputParam = new QgsProcessingParameterFeatureSink( name, outputDef.value( QStringLiteral( "name" ) ).toString() );
78  QgsProcessingParameterDefinition::Flags flags = QgsProcessingParameterDefinition::Flags();
80  if ( outputDef.value( QStringLiteral( "isModelOutput" ) ).toBool() )
82  outputParam->setFlags( flags );
83  addParameter( outputParam );
84  mOutputs.append( new Output( name, outputDef.value( QStringLiteral( "expression" ) ).toString() ) );
85  }
86 }
87 
88 
89 QVariantMap QgsFilterAlgorithm::processAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback )
90 {
91  std::unique_ptr< QgsProcessingFeatureSource > source( parameterAsSource( parameters, QStringLiteral( "INPUT" ), context ) );
92  if ( !source )
93  throw QgsProcessingException( invalidSourceError( parameters, QStringLiteral( "INPUT" ) ) );
94 
95  QgsExpressionContext expressionContext = createExpressionContext( parameters, context, source.get() );
96  for ( Output *output : qgis::as_const( mOutputs ) )
97  {
98  output->sink.reset( parameterAsSink( parameters, output->name, context, output->destinationIdentifier, source->fields(), source->wkbType(), source->sourceCrs() ) );
99  if ( !output->sink )
100  throw QgsProcessingException( invalidSinkError( parameters, output->name ) );
101  output->expression.prepare( &expressionContext );
102  }
103 
104  long count = source->featureCount();
105 
106  QgsFeature f;
108 
109  double step = count > 0 ? 100.0 / count : 1;
110  int current = 0;
111 
112  while ( it.nextFeature( f ) )
113  {
114  if ( feedback->isCanceled() )
115  {
116  break;
117  }
118 
119  expressionContext.setFeature( f );
120 
121  for ( Output *output : qgis::as_const( mOutputs ) )
122  {
123  if ( output->expression.evaluate( &expressionContext ).toBool() )
124  {
125  output->sink->addFeature( f, QgsFeatureSink::FastInsert );
126  }
127  }
128 
129  feedback->setProgress( current * step );
130  current++;
131  }
132 
133  QVariantMap outputs;
134  for ( const Output *output : qgis::as_const( mOutputs ) )
135  {
136  outputs.insert( output->name, output->destinationIdentifier );
137  }
138  qDeleteAll( mOutputs );
139  mOutputs.clear();
140  return outputs;
141 }
142 
143 
Wrapper for iterator of features from vector data provider or vector layer.
Use faster inserts, at the cost of updating the passed features to reflect changes made at the provid...
Base class for providing feedback from a processing algorithm.
Invalid geometry checks should always be skipped. This flag can be useful for algorithms which always...
void setFeature(const QgsFeature &feature)
Convenience function for setting a feature for the context.
void setProgress(double progress)
Sets the current progress for the feedback object.
Definition: qgsfeedback.h:63
void setFlags(Flags flags)
Sets the flags associated with the parameter.
The feature class encapsulates a single feature including its id, geometry and a list of field/values...
Definition: qgsfeature.h:55
A feature sink output for processing algorithms.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
This class wraps a request for features to a vector layer (or directly its vector data provider)...
Custom exception class for processing related exceptions.
Definition: qgsexception.h:82
Destination parameter is final output. The parameter name will be used.
bool isCanceled() const
Tells whether the operation has been canceled already.
Definition: qgsfeedback.h:54
An input feature source (such as vector layers) parameter for processing algorithms.
bool nextFeature(QgsFeature &f)
Parameter is hidden and should not be shown to users.
Contains information about the context in which a processing algorithm is executed.