21
21
#include " qgsvectordataprovider.h"
22
22
#include " qgsfeature.h"
23
23
#include " qgsgeometrycoordinatetransform.h"
24
+ #include " qgsgeometryengine.h"
24
25
#include " qgsspatialquery.h"
25
26
26
27
QgsSpatialQuery::QgsSpatialQuery ( MngProgressBar *pb )
@@ -207,32 +208,32 @@ void QgsSpatialQuery::setSpatialIndexReference( QgsFeatureIds &qsetIndexInvalidR
207
208
208
209
void QgsSpatialQuery::execQuery ( QgsFeatureIds &qsetIndexResult, QgsFeatureIds &qsetIndexInvalidTarget, int relation )
209
210
{
210
- bool ( QgsGeometry ::* operation )( const QgsGeometry * ) const ;
211
+ bool ( QgsGeometryEngine ::* operation )( const QgsAbstractGeometryV2&, QString * ) const ;
211
212
switch ( relation )
212
213
{
213
214
case Disjoint:
214
- operation = &QgsGeometry ::disjoint;
215
+ operation = &QgsGeometryEngine ::disjoint;
215
216
break ;
216
217
case Equals:
217
- operation = &QgsGeometry::equals ;
218
+ operation = &QgsGeometryEngine::isEqual ;
218
219
break ;
219
220
case Touches:
220
- operation = &QgsGeometry ::touches;
221
+ operation = &QgsGeometryEngine ::touches;
221
222
break ;
222
223
case Overlaps:
223
- operation = &QgsGeometry ::overlaps;
224
+ operation = &QgsGeometryEngine ::overlaps;
224
225
break ;
225
226
case Within:
226
- operation = &QgsGeometry ::within;
227
+ operation = &QgsGeometryEngine ::within;
227
228
break ;
228
229
case Contains:
229
- operation = &QgsGeometry ::contains;
230
+ operation = &QgsGeometryEngine ::contains;
230
231
break ;
231
232
case Crosses:
232
- operation = &QgsGeometry ::crosses;
233
+ operation = &QgsGeometryEngine ::crosses;
233
234
break ;
234
235
case Intersects:
235
- operation = &QgsGeometry ::intersects;
236
+ operation = &QgsGeometryEngine ::intersects;
236
237
break ;
237
238
default :
238
239
qWarning ( " undefined operation" );
@@ -244,7 +245,7 @@ void QgsSpatialQuery::execQuery( QgsFeatureIds &qsetIndexResult, QgsFeatureIds &
244
245
coordinateTransform->setCoordinateTransform ( mLayerTarget , mLayerReference );
245
246
246
247
// 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 );
248
249
funcPopulateIndexResult = ( relation == Disjoint )
249
250
? &QgsSpatialQuery::populateIndexResultDisjoint
250
251
: &QgsSpatialQuery::populateIndexResult;
@@ -273,33 +274,40 @@ void QgsSpatialQuery::execQuery( QgsFeatureIds &qsetIndexResult, QgsFeatureIds &
273
274
274
275
void QgsSpatialQuery::populateIndexResult (
275
276
QgsFeatureIds &qsetIndexResult, QgsFeatureId idTarget, QgsGeometry * geomTarget,
276
- bool ( QgsGeometry ::* op )( const QgsGeometry * ) const )
277
+ bool ( QgsGeometryEngine ::* op )( const QgsAbstractGeometryV2&, QString * ) const )
277
278
{
278
279
QList<QgsFeatureId> listIdReference;
279
280
listIdReference = mIndexReference .intersects ( geomTarget->boundingBox () );
280
281
if ( listIdReference.isEmpty () )
281
282
{
282
283
return ;
283
284
}
285
+
286
+ // prepare geometry
287
+ QgsGeometryEngine* geomEngine = geomTarget->createGeometryEngine ( geomTarget->geometry () );
288
+ geomEngine->prepareGeometry ();
289
+
284
290
QgsFeature featureReference;
285
291
const QgsGeometry * geomReference;
286
292
QList<QgsFeatureId>::iterator iterIdReference = listIdReference.begin ();
287
293
for ( ; iterIdReference != listIdReference.end (); ++iterIdReference )
288
294
{
289
295
mLayerReference ->getFeatures ( QgsFeatureRequest ().setFilterFid ( *iterIdReference ) ).nextFeature ( featureReference );
290
296
geomReference = featureReference.constGeometry ();
291
- if (( geomTarget->*op )( geomReference ) )
297
+
298
+ if (( geomEngine->*op )( *( geomReference->geometry () ), 0 ) )
292
299
{
293
300
qsetIndexResult.insert ( idTarget );
294
301
break ;
295
302
}
296
303
}
297
304
305
+ delete geomEngine;
298
306
} // void QgsSpatialQuery::populateIndexResult(...
299
307
300
308
void QgsSpatialQuery::populateIndexResultDisjoint (
301
309
QgsFeatureIds &qsetIndexResult, QgsFeatureId idTarget, QgsGeometry * geomTarget,
302
- bool ( QgsGeometry ::* op )( const QgsGeometry * ) const )
310
+ bool ( QgsGeometryEngine ::* op )( const QgsAbstractGeometryV2&, QString * ) const )
303
311
{
304
312
QList<QgsFeatureId> listIdReference;
305
313
listIdReference = mIndexReference .intersects ( geomTarget->boundingBox () );
@@ -308,6 +316,11 @@ void QgsSpatialQuery::populateIndexResultDisjoint(
308
316
qsetIndexResult.insert ( idTarget );
309
317
return ;
310
318
}
319
+
320
+ // prepare geometry
321
+ QgsGeometryEngine* geomEngine = geomTarget->createGeometryEngine ( geomTarget->geometry () );
322
+ geomEngine->prepareGeometry ();
323
+
311
324
QgsFeature featureReference;
312
325
const QgsGeometry * geomReference;
313
326
QList<QgsFeatureId>::iterator iterIdReference = listIdReference.begin ();
@@ -316,8 +329,7 @@ void QgsSpatialQuery::populateIndexResultDisjoint(
316
329
{
317
330
mLayerReference ->getFeatures ( QgsFeatureRequest ().setFilterFid ( *iterIdReference ) ).nextFeature ( featureReference );
318
331
geomReference = featureReference.constGeometry ();
319
-
320
- if ( !( geomTarget->*op )( geomReference ) )
332
+ if (( geomEngine->*op )( *( geomReference->geometry () ), 0 ) )
321
333
{
322
334
addIndex = false ;
323
335
break ;
@@ -327,6 +339,6 @@ void QgsSpatialQuery::populateIndexResultDisjoint(
327
339
{
328
340
qsetIndexResult.insert ( idTarget );
329
341
}
330
-
342
+ delete geomEngine;
331
343
} // void QgsSpatialQuery::populateIndexResultDisjoint( ...
332
344
0 commit comments