@@ -270,7 +270,7 @@ void QgsOverlayUtils::resolveOverlaps( const QgsFeatureSource &source, QgsFeatur
270
270
requestOnlyIds.setFlags ( QgsFeatureRequest::NoGeometry );
271
271
requestOnlyIds.setSubsetOfAttributes ( QgsAttributeList () );
272
272
273
- // make a set of used feature IDs so they we do not try to reuse them for newly added features
273
+ // make a set of used feature IDs so that we do not try to reuse them for newly added features
274
274
QgsFeature f;
275
275
QSet<QgsFeatureId> fids;
276
276
QgsFeatureIterator it = source.getFeatures ( requestOnlyIds );
@@ -296,6 +296,7 @@ void QgsOverlayUtils::resolveOverlaps( const QgsFeatureSource &source, QgsFeatur
296
296
297
297
QgsFeatureId fid1 = f.id ();
298
298
QgsGeometry g1 = f.geometry ();
299
+ std::unique_ptr< QgsGeometryEngine > g1engine;
299
300
300
301
geometries.insert ( fid1, g1 );
301
302
index.insertFeature ( f );
@@ -307,8 +308,15 @@ void QgsOverlayUtils::resolveOverlaps( const QgsFeatureSource &source, QgsFeatur
307
308
if ( fid1 == fid2 )
308
309
continue ;
309
310
311
+ if ( !g1engine )
312
+ {
313
+ // use prepared geometries for faster intersection tests
314
+ g1engine.reset ( QgsGeometry::createGeometryEngine ( g1.constGet () ) );
315
+ g1engine->prepareGeometry ();
316
+ }
317
+
310
318
QgsGeometry g2 = geometries.value ( fid2 );
311
- if ( !g1. intersects ( g2 ) )
319
+ if ( !g1engine-> intersects ( g2. constGet () ) )
312
320
continue ;
313
321
314
322
QgsGeometry geomIntersection = g1.intersection ( g2 );
@@ -384,6 +392,7 @@ void QgsOverlayUtils::resolveOverlaps( const QgsFeatureSource &source, QgsFeatur
384
392
385
393
// update our temporary copy of the geometry to what is left from it
386
394
g1 = g12;
395
+ g1engine.reset ();
387
396
}
388
397
389
398
++count;
0 commit comments