Skip to content

Commit

Permalink
[processing] Show progress during index creation for intersection/dif…
Browse files Browse the repository at this point in the history
…ference algorithms
  • Loading branch information
nyalldawson committed Dec 13, 2022
1 parent e6f1254 commit 66aa8eb
Showing 1 changed file with 37 additions and 2 deletions.
39 changes: 37 additions & 2 deletions src/analysis/processing/qgsoverlayutils.cpp
Expand Up @@ -105,7 +105,23 @@ void QgsOverlayUtils::difference( const QgsFeatureSource &sourceA, const QgsFeat
requestB.setNoAttributes();
if ( outputAttrs != OutputBA )
requestB.setDestinationCrs( sourceA.sourceCrs(), context.transformContext() );
const QgsSpatialIndex indexB( sourceB.getFeatures( requestB ), feedback );

double step = sourceB.featureCount() > 0 ? 100.0 / sourceB.featureCount() : 1;
long long i = 0;
QgsFeatureIterator fi = sourceB.getFeatures( requestB );

feedback->setProgressText( QObject::tr( "Creating spatial index" ) );
const QgsSpatialIndex indexB( fi, [&]( const QgsFeature & )->bool
{
i++;
if ( feedback->isCanceled() )
return false;

feedback->setProgress( i * step );

return true;
} );

if ( feedback->isCanceled() )
return;

Expand All @@ -117,6 +133,8 @@ void QgsOverlayUtils::difference( const QgsFeatureSource &sourceA, const QgsFeat
if ( totalCount == 0 )
totalCount = 1; // avoid division by zero

feedback->setProgressText( QObject::tr( "Calculating difference" ) );

QgsFeature featA;
QgsFeatureRequest requestA;
requestA.setInvalidGeometryCheck( context.invalidGeometryCheck() );
Expand Down Expand Up @@ -222,13 +240,30 @@ void QgsOverlayUtils::intersection( const QgsFeatureSource &sourceA, const QgsFe
request.setDestinationCrs( sourceA.sourceCrs(), context.transformContext() );

QgsFeature outFeat;
const QgsSpatialIndex indexB( sourceB.getFeatures( request ), feedback );

double step = sourceB.featureCount() > 0 ? 100.0 / sourceB.featureCount() : 1;
long long i = 0;
QgsFeatureIterator fi = sourceB.getFeatures( request );
feedback->setProgressText( QObject::tr( "Creating spatial index" ) );
const QgsSpatialIndex indexB( fi, [&]( const QgsFeature & )->bool
{
i++;
if ( feedback->isCanceled() )
return false;

feedback->setProgress( i * step );

return true;
} );

if ( feedback->isCanceled() )
return;

if ( totalCount == 0 )
totalCount = 1; // avoid division by zero

feedback->setProgressText( QObject::tr( "Calculating intersection" ) );

QgsFeature featA;
QgsFeatureIterator fitA = sourceA.getFeatures( QgsFeatureRequest().setSubsetOfAttributes( fieldIndicesA ) );
while ( fitA.nextFeature( featA ) )
Expand Down

0 comments on commit 66aa8eb

Please sign in to comment.