Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Working distance within filter for vector layer cache
  • Loading branch information
nyalldawson committed Aug 5, 2021
1 parent 70b24b5 commit 2cab3bb
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 1 deletion.
4 changes: 4 additions & 0 deletions python/core/auto_generated/qgscachedfeatureiterator.sip.in
Expand Up @@ -28,6 +28,8 @@ This constructor creates a feature iterator, that delivers all cached features.
:param featureRequest: The feature request to answer
%End

~QgsCachedFeatureIterator();

virtual bool rewind();

%Docstring
Expand Down Expand Up @@ -67,6 +69,8 @@ We have a local special iterator for FilterFids, no need to run the generic.
:return: bool ``True`` if the operation was OK
%End

private:
QgsCachedFeatureIterator( const QgsCachedFeatureIterator &other );
};

class QgsCachedFeatureWriterIterator : QgsAbstractFeatureIterator
Expand Down
33 changes: 32 additions & 1 deletion src/core/qgscachedfeatureiterator.cpp
Expand Up @@ -17,6 +17,7 @@
#include "qgsvectorlayercache.h"
#include "qgsexception.h"
#include "qgsvectorlayer.h"
#include "qgsgeometryengine.h"

QgsCachedFeatureIterator::QgsCachedFeatureIterator( QgsVectorLayerCache *vlCache, const QgsFeatureRequest &featureRequest )
: QgsAbstractFeatureIterator( featureRequest )
Expand All @@ -36,6 +37,25 @@ QgsCachedFeatureIterator::QgsCachedFeatureIterator( QgsVectorLayerCache *vlCache
close();
return;
}

// prepare spatial filter geometries for optimal speed
switch ( mRequest.spatialFilterType() )
{
case Qgis::SpatialFilterType::NoFilter:
case Qgis::SpatialFilterType::BoundingBox:
break;

case Qgis::SpatialFilterType::DistanceWithin:
if ( !mRequest.referenceGeometry().isEmpty() )
{
mDistanceWithinGeom = mRequest.referenceGeometry();
mDistanceWithinEngine.reset( QgsGeometry::createGeometryEngine( mDistanceWithinGeom.constGet() ) );
mDistanceWithinEngine->prepareGeometry();
mDistanceWithin = mRequest.distanceWithin();
}
break;
}

if ( !mFilterRect.isNull() )
{
// update request to be the unprojected filter rect
Expand Down Expand Up @@ -70,6 +90,8 @@ QgsCachedFeatureIterator::QgsCachedFeatureIterator( QgsVectorLayerCache *vlCache
close();
}

QgsCachedFeatureIterator::~QgsCachedFeatureIterator() = default;

bool QgsCachedFeatureIterator::fetchFeature( QgsFeature &f )
{
f.setValid( false );
Expand All @@ -91,7 +113,16 @@ bool QgsCachedFeatureIterator::fetchFeature( QgsFeature &f )
{
f.setValid( true );
geometryToDestinationCrs( f, mTransform );
return true;

bool result = true;
if ( mDistanceWithinEngine && mDistanceWithinEngine->distance( f.geometry().constGet() ) > mDistanceWithin )
{
f.setValid( false );
result = false;
}

if ( result )
return true;
}
}
close();
Expand Down
11 changes: 11 additions & 0 deletions src/core/qgscachedfeatureiterator.h
Expand Up @@ -40,6 +40,8 @@ class CORE_EXPORT QgsCachedFeatureIterator : public QgsAbstractFeatureIterator
*/
QgsCachedFeatureIterator( QgsVectorLayerCache *vlCache, const QgsFeatureRequest &featureRequest );

~QgsCachedFeatureIterator() override;

/**
* Rewind to the beginning of the iterator
*
Expand Down Expand Up @@ -76,11 +78,19 @@ class CORE_EXPORT QgsCachedFeatureIterator : public QgsAbstractFeatureIterator
bool nextFeatureFilterFids( QgsFeature &f ) override { return fetchFeature( f ); }

private:
#ifdef SIP_RUN
QgsCachedFeatureIterator( const QgsCachedFeatureIterator &other );
#endif

QList< QgsFeatureId > mFeatureIds;
QgsVectorLayerCache *mVectorLayerCache = nullptr;
QList< QgsFeatureId >::ConstIterator mFeatureIdIterator;
QgsCoordinateTransform mTransform;
QgsRectangle mFilterRect;

QgsGeometry mDistanceWithinGeom;
std::unique_ptr< QgsGeometryEngine > mDistanceWithinEngine;
double mDistanceWithin = 0;
};

/**
Expand Down Expand Up @@ -133,5 +143,6 @@ class CORE_EXPORT QgsCachedFeatureWriterIterator : public QgsAbstractFeatureIter
QgsFeatureIds mFids;
QgsCoordinateTransform mTransform;
QgsRectangle mFilterRect;

};
#endif // QGSCACHEDFEATUREITERATOR_H

0 comments on commit 2cab3bb

Please sign in to comment.