Skip to content

Commit be501a0

Browse files
committed
Make more use of prepared geometries for intersection tests
Should speed up a few operations
1 parent 5f1a78d commit be501a0

File tree

3 files changed

+12
-4
lines changed

3 files changed

+12
-4
lines changed

src/core/providers/memory/qgsmemoryfeatureiterator.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include "qgsmemoryprovider.h"
1717

1818
#include "qgsgeometry.h"
19+
#include "qgsgeometryengine.h"
1920
#include "qgslogger.h"
2021
#include "qgsspatialindex.h"
2122
#include "qgsmessagelog.h"
@@ -35,6 +36,8 @@ QgsMemoryFeatureIterator::QgsMemoryFeatureIterator( QgsMemoryFeatureSource *sour
3536
if ( !mRequest.filterRect().isNull() && mRequest.flags() & QgsFeatureRequest::ExactIntersect )
3637
{
3738
mSelectRectGeom = QgsGeometry::fromRect( request.filterRect() );
39+
mSelectRectEngine.reset( QgsGeometry::createGeometryEngine( mSelectRectGeom.geometry() ) );
40+
mSelectRectEngine->prepareGeometry();
3841
}
3942

4043
// if there's spatial index, use it!
@@ -92,7 +95,7 @@ bool QgsMemoryFeatureIterator::nextFeatureUsingList( QgsFeature &feature )
9295
if ( !mRequest.filterRect().isNull() && mRequest.flags() & QgsFeatureRequest::ExactIntersect )
9396
{
9497
// do exact check in case we're doing intersection
95-
if ( mSource->mFeatures.value( *mFeatureIdListIterator ).hasGeometry() && mSource->mFeatures.value( *mFeatureIdListIterator ).geometry().intersects( mSelectRectGeom ) )
98+
if ( mSource->mFeatures.value( *mFeatureIdListIterator ).hasGeometry() && mSelectRectEngine->intersects( *mSource->mFeatures.value( *mFeatureIdListIterator ).geometry().geometry() ) )
9699
hasFeature = true;
97100
}
98101
else
@@ -144,7 +147,7 @@ bool QgsMemoryFeatureIterator::nextFeatureTraverseAll( QgsFeature &feature )
144147
if ( mRequest.flags() & QgsFeatureRequest::ExactIntersect )
145148
{
146149
// using exact test when checking for intersection
147-
if ( mSelectIterator->hasGeometry() && mSelectIterator->geometry().intersects( mSelectRectGeom ) )
150+
if ( mSelectIterator->hasGeometry() && mSelectRectEngine->intersects( *mSelectIterator->geometry().geometry() ) )
148151
hasFeature = true;
149152
}
150153
else

src/core/providers/memory/qgsmemoryfeatureiterator.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ class QgsMemoryFeatureIterator : public QgsAbstractFeatureIteratorFromSource<Qgs
6666
bool nextFeatureTraverseAll( QgsFeature &feature );
6767

6868
QgsGeometry mSelectRectGeom;
69+
std::unique_ptr< QgsGeometryEngine > mSelectRectEngine;
6970
QgsFeatureMap::const_iterator mSelectIterator;
7071
bool mUsingFeatureIdList = false;
7172
QList<QgsFeatureId> mFeatureIdList;

src/core/qgsmaphittest.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include "qgsvectorlayer.h"
2525
#include "qgssymbollayerutils.h"
2626
#include "qgsgeometry.h"
27+
#include "qgsgeometryengine.h"
2728
#include "qgscrscache.h"
2829

2930
QgsMapHitTest::QgsMapHitTest( const QgsMapSettings &settings, const QgsGeometry &polygon, const LayerFilterExpression &layerFilterExpression )
@@ -121,6 +122,7 @@ void QgsMapHitTest::runHitTestLayer( QgsVectorLayer *vl, SymbolSet &usedSymbols,
121122

122123
QgsFeature f;
123124
QgsFeatureRequest request;
125+
std::unique_ptr< QgsGeometryEngine > polygonEngine;
124126
if ( !mOnlyExpressions )
125127
{
126128
if ( mPolygon.isNull() )
@@ -131,6 +133,8 @@ void QgsMapHitTest::runHitTestLayer( QgsVectorLayer *vl, SymbolSet &usedSymbols,
131133
else
132134
{
133135
request.setFilterRect( transformedPolygon.boundingBox() );
136+
polygonEngine.reset( QgsGeometry::createGeometryEngine( transformedPolygon.geometry() ) );
137+
polygonEngine->prepareGeometry();
134138
}
135139
}
136140
QgsFeatureIterator fi = vl->getFeatures( request );
@@ -149,9 +153,9 @@ void QgsMapHitTest::runHitTestLayer( QgsVectorLayer *vl, SymbolSet &usedSymbols,
149153
{
150154
context.expressionContext().setFeature( f );
151155
// filter out elements outside of the polygon
152-
if ( !mOnlyExpressions && !mPolygon.isNull() )
156+
if ( f.geometry() && polygonEngine )
153157
{
154-
if ( !transformedPolygon.intersects( f.geometry() ) )
158+
if ( !polygonEngine->intersects( *f.geometry().geometry() ) )
155159
{
156160
continue;
157161
}

0 commit comments

Comments
 (0)