Skip to content

Commit 43cd62b

Browse files
committed
[processing] Tweak api for QgsProcessingFeatureBasedAlgorithm
Instead of returning a single QgsFeature from processFeature, we now return a list of features. This allows feature based algorithms which return multiple features per input feature, e.g. "explode" type algorithms which split a single input feature into multiple output features.
1 parent 34553d3 commit 43cd62b

File tree

63 files changed

+103
-97
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

63 files changed

+103
-97
lines changed

python/core/processing/qgsprocessingalgorithm.sip.in

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -855,17 +855,20 @@ Returns the source's coordinate reference system. This will only return a valid
855855
called from a subclasses' processFeature() implementation.
856856
%End
857857

858-
virtual QgsFeature processFeature( const QgsFeature &feature, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) = 0;
858+
virtual QgsFeatureList processFeature( const QgsFeature &feature, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) = 0;
859859
%Docstring
860860
Processes an individual input ``feature`` from the source. Algorithms should implement their
861861
logic in this method for performing the algorithm's operation (e.g. replacing the feature's
862862
geometry with the centroid of the original feature geometry for a 'centroid' type
863863
algorithm).
864864

865-
Implementations should return the modified feature. Returning an invalid feature (e.g.
866-
a default constructed :py:class:`QgsFeature`) will indicate that this feature should be 'skipped',
867-
and will not be added to the algorithm's output. Subclasses can use this approach to
868-
filter the incoming features as desired.
865+
Implementations should return a list containing the modified feature. Returning an empty an list
866+
will indicate that this feature should be 'skipped', and will not be added to the algorithm's output.
867+
Subclasses can use this approach to filter the incoming features as desired.
868+
869+
Additionally, multiple features can be returned for a single input feature. Each returned feature
870+
will be added to the algorithm's output. This allows for "explode" type algorithms where a single
871+
input feature results in multiple output features.
869872

870873
The provided ``feedback`` object can be used to push messages to the log and for giving feedback
871874
to users. Note that handling of progress reports and algorithm cancelation is handled by

python/plugins/processing/algs/qgis/AddTableField.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,4 +97,4 @@ def processFeature(self, feature, context, feedback):
9797
attributes = feature.attributes()
9898
attributes.append(None)
9999
feature.setAttributes(attributes)
100-
return feature
100+
return [feature]

python/plugins/processing/algs/qgis/DeleteColumn.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,4 +88,4 @@ def processFeature(self, feature, context, feedback):
8888
for index in self.field_indices:
8989
del attributes[index]
9090
feature.setAttributes(attributes)
91-
return feature
91+
return [feature]

python/plugins/processing/algs/qgis/DeleteHoles.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,4 +72,4 @@ def prepareAlgorithm(self, parameters, context, feedback):
7272
def processFeature(self, feature, context, feedback):
7373
if feature.hasGeometry():
7474
feature.setGeometry(feature.geometry().removeInteriorRings(self.min_area))
75-
return feature
75+
return [feature]

python/plugins/processing/algs/qgis/DensifyGeometries.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,4 +75,4 @@ def processFeature(self, feature, context, feedback):
7575
if feature.hasGeometry():
7676
new_geometry = feature.geometry().densifyByCount(self.vertices)
7777
feature.setGeometry(new_geometry)
78-
return feature
78+
return [feature]

python/plugins/processing/algs/qgis/DensifyGeometriesInterval.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,4 +74,4 @@ def processFeature(self, feature, context, feedback):
7474
if feature.hasGeometry():
7575
new_geometry = feature.geometry().densifyByDistance(float(interval))
7676
feature.setGeometry(new_geometry)
77-
return feature
77+
return [feature]

python/plugins/processing/algs/qgis/ExtendLines.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,4 +80,4 @@ def processFeature(self, feature, context, feedback):
8080

8181
feature.setGeometry(output_geometry)
8282

83-
return feature
83+
return [feature]

python/plugins/processing/algs/qgis/FieldsMapper.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,4 +168,4 @@ def processFeature(self, feature, context, feedback):
168168
attributes.append(value)
169169
feature.setAttributes(attributes)
170170
self._row_number += 1
171-
return feature
171+
return [feature]

python/plugins/processing/algs/qgis/GeometryByExpression.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,4 +118,4 @@ def processFeature(self, feature, context, feedback):
118118
raise QgsProcessingException(
119119
self.tr('{} is not a geometry').format(value))
120120
feature.setGeometry(value)
121-
return feature
121+
return [feature]

python/plugins/processing/algs/qgis/LinesToPolygons.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ def processFeature(self, feature, context, feedback):
8888
feature.setGeometry(QgsGeometry(self.convertToPolygons(feature.geometry())))
8989
if feature.geometry().isEmpty():
9090
feedback.reportError(self.tr("One or more line ignored due to geometry not having a minimum of three vertices."))
91-
return feature
91+
return [feature]
9292

9393
def convertWkbToPolygons(self, wkb):
9494
multi_wkb = None

python/plugins/processing/algs/qgis/OffsetLine.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,4 +113,4 @@ def processFeature(self, feature, context, feedback):
113113

114114
feature.setGeometry(output_geometry)
115115

116-
return feature
116+
return [feature]

python/plugins/processing/algs/qgis/Orthogonalize.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,4 +91,4 @@ def processFeature(self, feature, context, feedback):
9191
self.tr('Error orthogonalizing geometry'))
9292

9393
feature.setGeometry(output_geometry)
94-
return feature
94+
return [feature]

python/plugins/processing/algs/qgis/PointOnSurface.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,4 +75,4 @@ def processFeature(self, feature, context, feedback):
7575
raise QgsProcessingException(self.tr('Error calculating point on surface: `{error_message}`'.format(error_message=output_geometry.error())))
7676

7777
feature.setGeometry(output_geometry)
78-
return feature
78+
return [feature]

python/plugins/processing/algs/qgis/PolygonsToLines.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ def outputWkbType(self, input_wkb_type):
7979
def processFeature(self, feature, context, feedback):
8080
if feature.hasGeometry():
8181
feature.setGeometry(QgsGeometry(self.convertToLines(feature.geometry())))
82-
return feature
82+
return [feature]
8383

8484
def convertWkbToLines(self, wkb):
8585
multi_wkb = None

python/plugins/processing/algs/qgis/ReverseLineDirection.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,4 +67,4 @@ def processFeature(self, feature, context, feedback):
6767
outGeom = QgsGeometry(reversedLine)
6868

6969
feature.setGeometry(outGeom)
70-
return feature
70+
return [feature]

python/plugins/processing/algs/qgis/SetMValue.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,4 +100,4 @@ def processFeature(self, feature, context, feedback):
100100

101101
feature.setGeometry(QgsGeometry(new_geom))
102102

103-
return feature
103+
return [feature]

python/plugins/processing/algs/qgis/SetZValue.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,4 +101,4 @@ def processFeature(self, feature, context, feedback):
101101

102102
feature.setGeometry(QgsGeometry(new_geom))
103103

104-
return feature
104+
return [feature]

python/plugins/processing/algs/qgis/SingleSidedBuffer.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,4 +122,4 @@ def processFeature(self, feature, context, feedback):
122122

123123
feature.setGeometry(output_geometry)
124124

125-
return feature
125+
return [feature]

python/plugins/processing/algs/qgis/TextToFloat.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,4 +85,4 @@ def processFeature(self, feature, context, feedback):
8585
feature[self.field_idx] = float(value)
8686
except:
8787
feature[self.field_idx] = None
88-
return feature
88+
return [feature]

src/3d/processing/qgsalgorithmtessellate.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ QgsTessellateAlgorithm *QgsTessellateAlgorithm::createInstance() const
7474
return new QgsTessellateAlgorithm();
7575
}
7676

77-
QgsFeature QgsTessellateAlgorithm::processFeature( const QgsFeature &feature, QgsProcessingContext &, QgsProcessingFeedback * )
77+
QgsFeatureList QgsTessellateAlgorithm::processFeature( const QgsFeature &feature, QgsProcessingContext &, QgsProcessingFeedback * )
7878
{
7979
QgsFeature f = feature;
8080
if ( f.hasGeometry() )
@@ -105,7 +105,7 @@ QgsFeature QgsTessellateAlgorithm::processFeature( const QgsFeature &feature, Qg
105105
f.setGeometry( g );
106106
}
107107
}
108-
return f;
108+
return QgsFeatureList() << f;
109109
}
110110

111111
///@endcond

src/3d/processing/qgsalgorithmtessellate.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ class QgsTessellateAlgorithm : public QgsProcessingFeatureBasedAlgorithm
4747
QgsProcessing::SourceType outputLayerType() const override;
4848
QgsWkbTypes::Type outputWkbType( QgsWkbTypes::Type inputWkbType ) const override;
4949

50-
QgsFeature processFeature( const QgsFeature &feature, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override;
50+
QgsFeatureList processFeature( const QgsFeature &feature, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override;
5151

5252
};
5353

src/analysis/processing/qgsalgorithmaddincrementalfield.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ bool QgsAddIncrementalFieldAlgorithm::prepareAlgorithm( const QVariantMap &param
9595
return true;
9696
}
9797

98-
QgsFeature QgsAddIncrementalFieldAlgorithm::processFeature( const QgsFeature &feature, QgsProcessingContext &, QgsProcessingFeedback * )
98+
QgsFeatureList QgsAddIncrementalFieldAlgorithm::processFeature( const QgsFeature &feature, QgsProcessingContext &, QgsProcessingFeedback * )
9999
{
100100
if ( !mGroupedFieldNames.empty() && mGroupedFields.empty() )
101101
{
@@ -127,7 +127,7 @@ QgsFeature QgsAddIncrementalFieldAlgorithm::processFeature( const QgsFeature &fe
127127
mGroupedValues[ groupAttributes ] = value;
128128
}
129129
f.setAttributes( attributes );
130-
return f;
130+
return QgsFeatureList() << f;
131131
}
132132

133133
///@endcond

src/analysis/processing/qgsalgorithmaddincrementalfield.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ class QgsAddIncrementalFieldAlgorithm : public QgsProcessingFeatureBasedAlgorith
5050
QgsFields outputFields( const QgsFields &inputFields ) const override;
5151

5252
bool prepareAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override;
53-
QgsFeature processFeature( const QgsFeature &feature, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override;
53+
QgsFeatureList processFeature( const QgsFeature &feature, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override;
5454

5555
private:
5656

src/analysis/processing/qgsalgorithmassignprojection.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,9 @@ bool QgsAssignProjectionAlgorithm::prepareAlgorithm( const QVariantMap &paramete
7373
return true;
7474
}
7575

76-
QgsFeature QgsAssignProjectionAlgorithm::processFeature( const QgsFeature &feature, QgsProcessingContext &, QgsProcessingFeedback * )
76+
QgsFeatureList QgsAssignProjectionAlgorithm::processFeature( const QgsFeature &feature, QgsProcessingContext &, QgsProcessingFeedback * )
7777
{
78-
return feature;
78+
return QgsFeatureList() << feature;
7979
}
8080

8181
///@endcond

src/analysis/processing/qgsalgorithmassignprojection.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ class QgsAssignProjectionAlgorithm : public QgsProcessingFeatureBasedAlgorithm
4949
QString outputName() const override;
5050

5151
bool prepareAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override;
52-
QgsFeature processFeature( const QgsFeature &feature, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override;
52+
QgsFeatureList processFeature( const QgsFeature &feature, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override;
5353

5454
private:
5555

src/analysis/processing/qgsalgorithmboundary.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ QgsWkbTypes::Type QgsBoundaryAlgorithm::outputWkbType( QgsWkbTypes::Type inputWk
9595
return outputWkb;
9696
}
9797

98-
QgsFeature QgsBoundaryAlgorithm::processFeature( const QgsFeature &feature, QgsProcessingContext &, QgsProcessingFeedback *feedback )
98+
QgsFeatureList QgsBoundaryAlgorithm::processFeature( const QgsFeature &feature, QgsProcessingContext &, QgsProcessingFeedback *feedback )
9999
{
100100
QgsFeature outFeature = feature;
101101

@@ -113,7 +113,7 @@ QgsFeature QgsBoundaryAlgorithm::processFeature( const QgsFeature &feature, QgsP
113113
outFeature.setGeometry( outputGeometry );
114114
}
115115
}
116-
return outFeature;
116+
return QgsFeatureList() << outFeature;
117117
}
118118

119119
///@endcond

src/analysis/processing/qgsalgorithmboundary.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ class QgsBoundaryAlgorithm : public QgsProcessingFeatureBasedAlgorithm
4747

4848
QString outputName() const override;
4949
QgsWkbTypes::Type outputWkbType( QgsWkbTypes::Type inputWkbType ) const override;
50-
QgsFeature processFeature( const QgsFeature &feature, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override;
50+
QgsFeatureList processFeature( const QgsFeature &feature, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override;
5151
};
5252

5353
///@endcond PRIVATE

src/analysis/processing/qgsalgorithmboundingbox.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ QgsFields QgsBoundingBoxAlgorithm::outputFields( const QgsFields &inputFields )
7171
return fields;
7272
}
7373

74-
QgsFeature QgsBoundingBoxAlgorithm::processFeature( const QgsFeature &feature, QgsProcessingContext &, QgsProcessingFeedback * )
74+
QgsFeatureList QgsBoundingBoxAlgorithm::processFeature( const QgsFeature &feature, QgsProcessingContext &, QgsProcessingFeedback * )
7575
{
7676
QgsFeature f = feature;
7777
if ( f.hasGeometry() )
@@ -95,7 +95,7 @@ QgsFeature QgsBoundingBoxAlgorithm::processFeature( const QgsFeature &feature, Q
9595
<< QVariant();
9696
f.setAttributes( attrs );
9797
}
98-
return f;
98+
return QgsFeatureList() << f;
9999
}
100100

101101
///@endcond

src/analysis/processing/qgsalgorithmboundingbox.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ class QgsBoundingBoxAlgorithm : public QgsProcessingFeatureBasedAlgorithm
4646
QString outputName() const override;
4747
QgsWkbTypes::Type outputWkbType( QgsWkbTypes::Type ) const override { return QgsWkbTypes::Polygon; }
4848
QgsFields outputFields( const QgsFields &inputFields ) const override;
49-
QgsFeature processFeature( const QgsFeature &feature, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override;
49+
QgsFeatureList processFeature( const QgsFeature &feature, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override;
5050

5151
};
5252

src/analysis/processing/qgsalgorithmcentroid.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ QgsCentroidAlgorithm *QgsCentroidAlgorithm::createInstance() const
6666
return new QgsCentroidAlgorithm();
6767
}
6868

69-
QgsFeature QgsCentroidAlgorithm::processFeature( const QgsFeature &f, QgsProcessingContext &, QgsProcessingFeedback *feedback )
69+
QgsFeatureList QgsCentroidAlgorithm::processFeature( const QgsFeature &f, QgsProcessingContext &, QgsProcessingFeedback *feedback )
7070
{
7171
QgsFeature feature = f;
7272
if ( feature.hasGeometry() )
@@ -77,7 +77,7 @@ QgsFeature QgsCentroidAlgorithm::processFeature( const QgsFeature &f, QgsProcess
7777
feedback->pushInfo( QObject::tr( "Error calculating centroid for feature %1" ).arg( feature.id() ) );
7878
}
7979
}
80-
return feature;
80+
return QgsFeatureList() << feature;
8181
}
8282

8383
///@endcond

src/analysis/processing/qgsalgorithmcentroid.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ class QgsCentroidAlgorithm : public QgsProcessingFeatureBasedAlgorithm
4949
QgsProcessing::SourceType outputLayerType() const override { return QgsProcessing::TypeVectorPoint; }
5050
QgsWkbTypes::Type outputWkbType( QgsWkbTypes::Type inputWkbType ) const override { Q_UNUSED( inputWkbType ); return QgsWkbTypes::Point; }
5151

52-
QgsFeature processFeature( const QgsFeature &feature, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override;
52+
QgsFeatureList processFeature( const QgsFeature &feature, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override;
5353
};
5454

5555
///@endcond PRIVATE

src/analysis/processing/qgsalgorithmconvexhull.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ QgsFields QgsConvexHullAlgorithm::outputFields( const QgsFields &inputFields ) c
6969
return fields;
7070
}
7171

72-
QgsFeature QgsConvexHullAlgorithm::processFeature( const QgsFeature &feature, QgsProcessingContext &, QgsProcessingFeedback *feedback )
72+
QgsFeatureList QgsConvexHullAlgorithm::processFeature( const QgsFeature &feature, QgsProcessingContext &, QgsProcessingFeedback *feedback )
7373
{
7474
QgsFeature f = feature;
7575
if ( f.hasGeometry() )
@@ -93,7 +93,7 @@ QgsFeature QgsConvexHullAlgorithm::processFeature( const QgsFeature &feature, Qg
9393
f.setAttributes( attrs );
9494
}
9595
}
96-
return f;
96+
return QgsFeatureList() << f;
9797
}
9898

9999
///@endcond

src/analysis/processing/qgsalgorithmconvexhull.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ class QgsConvexHullAlgorithm : public QgsProcessingFeatureBasedAlgorithm
4747
QString outputName() const override;
4848
QgsWkbTypes::Type outputWkbType( QgsWkbTypes::Type ) const override { return QgsWkbTypes::Polygon; }
4949
QgsFields outputFields( const QgsFields &inputFields ) const override;
50-
QgsFeature processFeature( const QgsFeature &feature, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override;
50+
QgsFeatureList processFeature( const QgsFeature &feature, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override;
5151

5252
};
5353

src/analysis/processing/qgsalgorithmdropgeometry.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,11 +74,11 @@ QgsFeatureRequest QgsDropGeometryAlgorithm::request() const
7474
return QgsFeatureRequest().setFlags( QgsFeatureRequest::NoGeometry );
7575
}
7676

77-
QgsFeature QgsDropGeometryAlgorithm::processFeature( const QgsFeature &feature, QgsProcessingContext &, QgsProcessingFeedback * )
77+
QgsFeatureList QgsDropGeometryAlgorithm::processFeature( const QgsFeature &feature, QgsProcessingContext &, QgsProcessingFeedback * )
7878
{
7979
QgsFeature f = feature;
8080
f.clearGeometry();
81-
return f;
81+
return QgsFeatureList() << f;
8282
}
8383

8484
///@endcond

src/analysis/processing/qgsalgorithmdropgeometry.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ class QgsDropGeometryAlgorithm : public QgsProcessingFeatureBasedAlgorithm
4848
QString outputName() const override;
4949
QgsWkbTypes::Type outputWkbType( QgsWkbTypes::Type inputWkbType ) const override;
5050
QgsFeatureRequest request() const override;
51-
QgsFeature processFeature( const QgsFeature &feature, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override;
51+
QgsFeatureList processFeature( const QgsFeature &feature, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override;
5252
};
5353

5454
///@endcond PRIVATE

src/analysis/processing/qgsalgorithmdropmzvalues.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ bool QgsDropMZValuesAlgorithm::prepareAlgorithm( const QVariantMap &parameters,
8282
return true;
8383
}
8484

85-
QgsFeature QgsDropMZValuesAlgorithm::processFeature( const QgsFeature &feature, QgsProcessingContext &, QgsProcessingFeedback * )
85+
QgsFeatureList QgsDropMZValuesAlgorithm::processFeature( const QgsFeature &feature, QgsProcessingContext &, QgsProcessingFeedback * )
8686
{
8787
QgsFeature f = feature;
8888
if ( f.hasGeometry() )
@@ -95,7 +95,7 @@ QgsFeature QgsDropMZValuesAlgorithm::processFeature( const QgsFeature &feature,
9595
f.setGeometry( QgsGeometry( newGeom.release() ) );
9696
}
9797

98-
return f;
98+
return QgsFeatureList() << f;
9999
}
100100

101101
///@endcond

src/analysis/processing/qgsalgorithmdropmzvalues.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ class QgsDropMZValuesAlgorithm : public QgsProcessingFeatureBasedAlgorithm
4848
QString outputName() const override;
4949
QgsWkbTypes::Type outputWkbType( QgsWkbTypes::Type inputWkbType ) const override;
5050
bool prepareAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override;
51-
QgsFeature processFeature( const QgsFeature &feature, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override;
51+
QgsFeatureList processFeature( const QgsFeature &feature, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override;
5252

5353
private:
5454

0 commit comments

Comments
 (0)