Skip to content

Commit d3cbe04

Browse files
mhugentnyalldawson
authored andcommitted
Use prepared geometry for spatial query plugin
1 parent 221c4e0 commit d3cbe04

File tree

2 files changed

+32
-20
lines changed

2 files changed

+32
-20
lines changed

src/plugins/spatialquery/qgsspatialquery.cpp

+28-16
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include "qgsvectordataprovider.h"
2222
#include "qgsfeature.h"
2323
#include "qgsgeometrycoordinatetransform.h"
24+
#include "qgsgeometryengine.h"
2425
#include "qgsspatialquery.h"
2526

2627
QgsSpatialQuery::QgsSpatialQuery( MngProgressBar *pb )
@@ -207,32 +208,32 @@ void QgsSpatialQuery::setSpatialIndexReference( QgsFeatureIds &qsetIndexInvalidR
207208

208209
void QgsSpatialQuery::execQuery( QgsFeatureIds &qsetIndexResult, QgsFeatureIds &qsetIndexInvalidTarget, int relation )
209210
{
210-
bool ( QgsGeometry::* operation )( const QgsGeometry * ) const;
211+
bool ( QgsGeometryEngine::* operation )( const QgsAbstractGeometryV2&, QString* ) const;
211212
switch ( relation )
212213
{
213214
case Disjoint:
214-
operation = &QgsGeometry::disjoint;
215+
operation = &QgsGeometryEngine::disjoint;
215216
break;
216217
case Equals:
217-
operation = &QgsGeometry::equals;
218+
operation = &QgsGeometryEngine::isEqual;
218219
break;
219220
case Touches:
220-
operation = &QgsGeometry::touches;
221+
operation = &QgsGeometryEngine::touches;
221222
break;
222223
case Overlaps:
223-
operation = &QgsGeometry::overlaps;
224+
operation = &QgsGeometryEngine::overlaps;
224225
break;
225226
case Within:
226-
operation = &QgsGeometry::within;
227+
operation = &QgsGeometryEngine::within;
227228
break;
228229
case Contains:
229-
operation = &QgsGeometry::contains;
230+
operation = &QgsGeometryEngine::contains;
230231
break;
231232
case Crosses:
232-
operation = &QgsGeometry::crosses;
233+
operation = &QgsGeometryEngine::crosses;
233234
break;
234235
case Intersects:
235-
operation = &QgsGeometry::intersects;
236+
operation = &QgsGeometryEngine::intersects;
236237
break;
237238
default:
238239
qWarning( "undefined operation" );
@@ -244,7 +245,7 @@ void QgsSpatialQuery::execQuery( QgsFeatureIds &qsetIndexResult, QgsFeatureIds &
244245
coordinateTransform->setCoordinateTransform( mLayerTarget, mLayerReference );
245246

246247
// Set function for populate result
247-
void ( QgsSpatialQuery::* funcPopulateIndexResult )( QgsFeatureIds&, QgsFeatureId, QgsGeometry *, bool ( QgsGeometry::* )( const QgsGeometry * ) const );
248+
void ( QgsSpatialQuery::* funcPopulateIndexResult )( QgsFeatureIds&, QgsFeatureId, QgsGeometry *, bool ( QgsGeometryEngine::* )( const QgsAbstractGeometryV2&, QString* ) const );
248249
funcPopulateIndexResult = ( relation == Disjoint )
249250
? &QgsSpatialQuery::populateIndexResultDisjoint
250251
: &QgsSpatialQuery::populateIndexResult;
@@ -273,33 +274,40 @@ void QgsSpatialQuery::execQuery( QgsFeatureIds &qsetIndexResult, QgsFeatureIds &
273274

274275
void QgsSpatialQuery::populateIndexResult(
275276
QgsFeatureIds &qsetIndexResult, QgsFeatureId idTarget, QgsGeometry * geomTarget,
276-
bool ( QgsGeometry::* op )( const QgsGeometry * ) const )
277+
bool ( QgsGeometryEngine::* op )( const QgsAbstractGeometryV2&, QString* ) const )
277278
{
278279
QList<QgsFeatureId> listIdReference;
279280
listIdReference = mIndexReference.intersects( geomTarget->boundingBox() );
280281
if ( listIdReference.isEmpty() )
281282
{
282283
return;
283284
}
285+
286+
//prepare geometry
287+
QgsGeometryEngine* geomEngine = geomTarget->createGeometryEngine( geomTarget->geometry() );
288+
geomEngine->prepareGeometry();
289+
284290
QgsFeature featureReference;
285291
const QgsGeometry * geomReference;
286292
QList<QgsFeatureId>::iterator iterIdReference = listIdReference.begin();
287293
for ( ; iterIdReference != listIdReference.end(); ++iterIdReference )
288294
{
289295
mLayerReference->getFeatures( QgsFeatureRequest().setFilterFid( *iterIdReference ) ).nextFeature( featureReference );
290296
geomReference = featureReference.constGeometry();
291-
if (( geomTarget->*op )( geomReference ) )
297+
298+
if (( geomEngine->*op )( *( geomReference->geometry() ), 0 ) )
292299
{
293300
qsetIndexResult.insert( idTarget );
294301
break;
295302
}
296303
}
297304

305+
delete geomEngine;
298306
} // void QgsSpatialQuery::populateIndexResult(...
299307

300308
void QgsSpatialQuery::populateIndexResultDisjoint(
301309
QgsFeatureIds &qsetIndexResult, QgsFeatureId idTarget, QgsGeometry * geomTarget,
302-
bool ( QgsGeometry::* op )( const QgsGeometry * ) const )
310+
bool ( QgsGeometryEngine::* op )( const QgsAbstractGeometryV2&, QString* ) const )
303311
{
304312
QList<QgsFeatureId> listIdReference;
305313
listIdReference = mIndexReference.intersects( geomTarget->boundingBox() );
@@ -308,6 +316,11 @@ void QgsSpatialQuery::populateIndexResultDisjoint(
308316
qsetIndexResult.insert( idTarget );
309317
return;
310318
}
319+
320+
//prepare geometry
321+
QgsGeometryEngine* geomEngine = geomTarget->createGeometryEngine( geomTarget->geometry() );
322+
geomEngine->prepareGeometry();
323+
311324
QgsFeature featureReference;
312325
const QgsGeometry * geomReference;
313326
QList<QgsFeatureId>::iterator iterIdReference = listIdReference.begin();
@@ -316,8 +329,7 @@ void QgsSpatialQuery::populateIndexResultDisjoint(
316329
{
317330
mLayerReference->getFeatures( QgsFeatureRequest().setFilterFid( *iterIdReference ) ).nextFeature( featureReference );
318331
geomReference = featureReference.constGeometry();
319-
320-
if ( !( geomTarget->*op )( geomReference ) )
332+
if (( geomEngine->*op )( *( geomReference->geometry() ), 0 ) )
321333
{
322334
addIndex = false;
323335
break;
@@ -327,6 +339,6 @@ void QgsSpatialQuery::populateIndexResultDisjoint(
327339
{
328340
qsetIndexResult.insert( idTarget );
329341
}
330-
342+
delete geomEngine;
331343
} // void QgsSpatialQuery::populateIndexResultDisjoint( ...
332344

src/plugins/spatialquery/qgsspatialquery.h

+4-4
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include "qgsmngprogressbar.h"
2525
#include "qgsreaderfeatures.h"
2626

27+
class QgsGeometryEngine;
2728

2829
/**
2930
* \brief Enum with the topologic relations
@@ -137,17 +138,16 @@ class QgsSpatialQuery
137138
*/
138139
void populateIndexResult(
139140
QgsFeatureIds &qsetIndexResult, QgsFeatureId idTarget, QgsGeometry *geomTarget,
140-
bool ( QgsGeometry::* operation )( const QgsGeometry * ) const );
141+
bool ( QgsGeometryEngine::* operation )( const QgsAbstractGeometryV2&, QString* ) const );
141142
/**
142143
* \brief Populate index Result Disjoint
143144
* \param qsetIndexResult Reference to QSet contains the result query
144145
* \param idTarget Id of the feature Target
145146
* \param geomTarget Geometry the feature Target
146147
* \param operation Pointer to function of GEOS operation
147148
*/
148-
void populateIndexResultDisjoint(
149-
QgsFeatureIds &qsetIndexResult, QgsFeatureId idTarget, QgsGeometry *geomTarget,
150-
bool ( QgsGeometry::* operation )( const QgsGeometry * ) const );
149+
void populateIndexResultDisjoint( QgsFeatureIds &qsetIndexResult, QgsFeatureId idTarget, QgsGeometry *geomTarget,
150+
bool ( QgsGeometryEngine::*operation )( const QgsAbstractGeometryV2&, QString* ) const );
151151

152152
MngProgressBar *mPb;
153153
bool mUseReferenceSelection;

0 commit comments

Comments
 (0)