From 0d8677928bb65e57261dbf94ef8efa72dcb50aa3 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Wed, 10 Jul 2024 10:20:34 +1000 Subject: [PATCH 1/2] Do not check for validity in Delete Duplicate Geometries alg This isn't required, and can get in the way (Eg when the delete duplicate geometries step is used as part of cleaning up a dataset prior to fixing geometries) --- .../processing/qgsalgorithmdeleteduplicategeometries.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/analysis/processing/qgsalgorithmdeleteduplicategeometries.cpp b/src/analysis/processing/qgsalgorithmdeleteduplicategeometries.cpp index 6f936dc9cb43..3970dbac44f2 100644 --- a/src/analysis/processing/qgsalgorithmdeleteduplicategeometries.cpp +++ b/src/analysis/processing/qgsalgorithmdeleteduplicategeometries.cpp @@ -89,7 +89,7 @@ QVariantMap QgsDeleteDuplicateGeometriesAlgorithm::processAlgorithm( const QVari if ( !sink ) throw QgsProcessingException( invalidSinkError( parameters, QStringLiteral( "OUTPUT" ) ) ); - QgsFeatureIterator it = mSource->getFeatures( QgsFeatureRequest().setSubsetOfAttributes( QgsAttributeList() ) ); + QgsFeatureIterator it = mSource->getFeatures( QgsFeatureRequest().setSubsetOfAttributes( QgsAttributeList() ), Qgis::ProcessingFeatureSourceFlag::SkipGeometryValidityChecks ); double step = mSource->featureCount() > 0 ? 100.0 / mSource->featureCount() : 0; QHash< QgsFeatureId, QgsGeometry > geometries; @@ -170,7 +170,7 @@ QVariantMap QgsDeleteDuplicateGeometriesAlgorithm::processAlgorithm( const QVari step = outputFeatureIds.empty() ? 1 : 100.0 / outputFeatureIds.size(); const QgsFeatureRequest request = QgsFeatureRequest().setFilterFids( outputFeatureIds ).setFlags( Qgis::FeatureRequestFlag::NoGeometry ); - it = mSource->getFeatures( request ); + it = mSource->getFeatures( request, Qgis::ProcessingFeatureSourceFlag::SkipGeometryValidityChecks ); current = 0; while ( it.nextFeature( f ) ) { From a73be3e3489321c1f72505c9fae5f49c13b8c131 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Wed, 10 Jul 2024 10:23:14 +1000 Subject: [PATCH 2/2] Explode lines algorithm should not require valid geometries This check isn't required for this algorith, and can get in the way when using explode as a step prior for data cleaning --- src/analysis/processing/qgsalgorithmexplode.cpp | 5 +++++ src/analysis/processing/qgsalgorithmexplode.h | 1 + 2 files changed, 6 insertions(+) diff --git a/src/analysis/processing/qgsalgorithmexplode.cpp b/src/analysis/processing/qgsalgorithmexplode.cpp index cd48f5ab1cd8..4063448aca27 100644 --- a/src/analysis/processing/qgsalgorithmexplode.cpp +++ b/src/analysis/processing/qgsalgorithmexplode.cpp @@ -105,6 +105,11 @@ QgsFeatureList QgsExplodeAlgorithm::processFeature( const QgsFeature &f, QgsProc } } +Qgis::ProcessingFeatureSourceFlags QgsExplodeAlgorithm::sourceFlags() const +{ + return Qgis::ProcessingFeatureSourceFlag::SkipGeometryValidityChecks; +} + QgsFeatureSink::SinkFlags QgsExplodeAlgorithm::sinkFlags() const { return QgsFeatureSink::RegeneratePrimaryKey; diff --git a/src/analysis/processing/qgsalgorithmexplode.h b/src/analysis/processing/qgsalgorithmexplode.h index d696c414b613..19871592b72e 100644 --- a/src/analysis/processing/qgsalgorithmexplode.h +++ b/src/analysis/processing/qgsalgorithmexplode.h @@ -48,6 +48,7 @@ class QgsExplodeAlgorithm : public QgsProcessingFeatureBasedAlgorithm QString outputName() const override; Qgis::WkbType outputWkbType( Qgis::WkbType inputWkbType ) const override; QgsFeatureList processFeature( const QgsFeature &feature, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override; + Qgis::ProcessingFeatureSourceFlags sourceFlags() const override; QgsFeatureSink::SinkFlags sinkFlags() const override; std::vector< QgsGeometry > extractAsParts( const QgsGeometry &geometry ) const;