Skip to content

Commit 399067c

Browse files
committed
[processing] Don't run validity checks for buffer alg
Buffering doesn't care about validity and can sometimes be used to repair geometries (cherry picked from commit 9d5c949)
1 parent 29d4fbb commit 399067c

File tree

3 files changed

+10
-3
lines changed

3 files changed

+10
-3
lines changed

src/analysis/processing/qgsalgorithmbuffer.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ QgsBufferAlgorithm *QgsBufferAlgorithm::createInstance() const
8181

8282
QVariantMap QgsBufferAlgorithm::processAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback )
8383
{
84-
std::unique_ptr< QgsFeatureSource > source( parameterAsSource( parameters, QStringLiteral( "INPUT" ), context ) );
84+
std::unique_ptr< QgsProcessingFeatureSource > source( parameterAsSource( parameters, QStringLiteral( "INPUT" ), context ) );
8585
if ( !source )
8686
throw QgsProcessingException( invalidSourceError( parameters, QStringLiteral( "INPUT" ) ) );
8787

@@ -98,7 +98,7 @@ QVariantMap QgsBufferAlgorithm::processAlgorithm( const QVariantMap &parameters,
9898
double miterLimit = parameterAsDouble( parameters, QStringLiteral( "MITER_LIMIT" ), context );
9999
double bufferDistance = parameterAsDouble( parameters, QStringLiteral( "DISTANCE" ), context );
100100
bool dynamicBuffer = QgsProcessingParameters::isDynamic( parameters, QStringLiteral( "DISTANCE" ) );
101-
QgsExpressionContext expressionContext = createExpressionContext( parameters, context, dynamic_cast< QgsProcessingFeatureSource * >( source.get() ) );
101+
QgsExpressionContext expressionContext = createExpressionContext( parameters, context, source.get() );
102102
QgsProperty bufferProperty;
103103
if ( dynamicBuffer )
104104
{
@@ -108,7 +108,8 @@ QVariantMap QgsBufferAlgorithm::processAlgorithm( const QVariantMap &parameters,
108108
long count = source->featureCount();
109109

110110
QgsFeature f;
111-
QgsFeatureIterator it = source->getFeatures();
111+
// buffer doesn't care about invalid features, and buffering can be used to repair geometries
112+
QgsFeatureIterator it = source->getFeatures( QgsFeatureRequest(), QgsProcessingFeatureSource::FlagSkipGeometryValidityChecks );
112113

113114
double step = count > 0 ? 100.0 / count : 1;
114115
int current = 0;

src/analysis/processing/qgsalgorithmmultiringconstantbuffer.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,11 @@ QgsFields QgsMultiRingConstantBufferAlgorithm::outputFields( const QgsFields &in
113113
return fields;
114114
}
115115

116+
QgsProcessingFeatureSource::Flag QgsMultiRingConstantBufferAlgorithm::sourceFlags() const
117+
{
118+
return QgsProcessingFeatureSource::FlagSkipGeometryValidityChecks;
119+
}
120+
116121
QgsFeatureList QgsMultiRingConstantBufferAlgorithm::processFeature( const QgsFeature &feature, QgsProcessingContext &context, QgsProcessingFeedback *feedback )
117122
{
118123
double currentDistance = 0;

src/analysis/processing/qgsalgorithmmultiringconstantbuffer.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ class QgsMultiRingConstantBufferAlgorithm : public QgsProcessingFeatureBasedAlgo
4949
QString outputName() const override;
5050
QgsFields outputFields( const QgsFields &inputFields ) const override;
5151
QgsProcessing::SourceType outputLayerType() const override { return QgsProcessing::TypeVectorPolygon; }
52+
QgsProcessingFeatureSource::Flag sourceFlags() const override;
5253
QgsWkbTypes::Type outputWkbType( QgsWkbTypes::Type inputWkbType ) const override { Q_UNUSED( inputWkbType ); return QgsWkbTypes::Polygon; }
5354
bool prepareAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override;
5455
QgsFeatureList processFeature( const QgsFeature &feature, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override;

0 commit comments

Comments
 (0)