@@ -81,7 +81,7 @@ QgsBufferAlgorithm *QgsBufferAlgorithm::createInstance() const
81
81
82
82
QVariantMap QgsBufferAlgorithm::processAlgorithm ( const QVariantMap ¶meters, QgsProcessingContext &context, QgsProcessingFeedback *feedback )
83
83
{
84
- std::unique_ptr< QgsFeatureSource > source ( parameterAsSource ( parameters, QStringLiteral ( " INPUT" ), context ) );
84
+ std::unique_ptr< QgsProcessingFeatureSource > source ( parameterAsSource ( parameters, QStringLiteral ( " INPUT" ), context ) );
85
85
if ( !source )
86
86
throw QgsProcessingException ( invalidSourceError ( parameters, QStringLiteral ( " INPUT" ) ) );
87
87
@@ -98,7 +98,7 @@ QVariantMap QgsBufferAlgorithm::processAlgorithm( const QVariantMap ¶meters,
98
98
double miterLimit = parameterAsDouble ( parameters, QStringLiteral ( " MITER_LIMIT" ), context );
99
99
double bufferDistance = parameterAsDouble ( parameters, QStringLiteral ( " DISTANCE" ), context );
100
100
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 () );
102
102
QgsProperty bufferProperty;
103
103
if ( dynamicBuffer )
104
104
{
@@ -108,7 +108,8 @@ QVariantMap QgsBufferAlgorithm::processAlgorithm( const QVariantMap ¶meters,
108
108
long count = source->featureCount ();
109
109
110
110
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 );
112
113
113
114
double step = count > 0 ? 100.0 / count : 1 ;
114
115
int current = 0 ;
0 commit comments