Skip to content

Commit

Permalink
Distance within for oracle provider
Browse files Browse the repository at this point in the history
  • Loading branch information
nyalldawson committed Aug 5, 2021
1 parent 85f67fd commit 26010fb
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 5 deletions.
34 changes: 29 additions & 5 deletions src/providers/oracle/qgsoraclefeatureiterator.cpp
Expand Up @@ -24,6 +24,7 @@
#include "qgsgeometry.h"
#include "qgssettings.h"
#include "qgsexception.h"
#include "qgsgeometryengine.h"

#include <QObject>

Expand Down Expand Up @@ -60,6 +61,23 @@ QgsOracleFeatureIterator::QgsOracleFeatureIterator( QgsOracleFeatureSource *sour
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();
}
break;
}

QVariantList args;
mQry = QSqlQuery( *mConnection );

Expand Down Expand Up @@ -90,13 +108,14 @@ QgsOracleFeatureIterator::QgsOracleFeatureIterator( QgsOracleFeatureSource *sour
else
mAttributeList = mSource->mFields.allAttributesList();

bool limitAtProvider = ( mRequest.limit() >= 0 );
bool limitAtProvider = ( mRequest.limit() >= 0 ) && mRequest.spatialFilterType() != Qgis::SpatialFilterType::DistanceWithin;
QString whereClause;

if ( !mSource->mGeometryColumn.isNull() )
{
// fetch geometry if requested
mFetchGeometry = ( mRequest.flags() & QgsFeatureRequest::NoGeometry ) == 0;
mFetchGeometry = ( mRequest.flags() & QgsFeatureRequest::NoGeometry ) == 0
|| mRequest.spatialFilterType() == Qgis::SpatialFilterType::DistanceWithin;
if ( mRequest.filterType() == QgsFeatureRequest::FilterExpression && mRequest.filterExpression()->needsGeometry() )
{
mFetchGeometry = true;
Expand All @@ -117,7 +136,8 @@ QgsOracleFeatureIterator::QgsOracleFeatureIterator( QgsOracleFeatureSource *sour

args << ( mSource->mSrid < 1 ? QVariant( QVariant::Int ) : mSource->mSrid ) << mFilterRect.xMinimum() << mFilterRect.yMinimum() << mFilterRect.xMaximum() << mFilterRect.yMaximum();

if ( ( mRequest.flags() & QgsFeatureRequest::ExactIntersect ) != 0 )
if ( ( mRequest.flags() & QgsFeatureRequest::ExactIntersect ) != 0
&& mRequest.spatialFilterType() == Qgis::SpatialFilterType::BoundingBox )
{
// sdo_relate requires Spatial
if ( mConnection->hasSpatial() )
Expand Down Expand Up @@ -419,11 +439,15 @@ bool QgsOracleFeatureIterator::fetchFeature( QgsFeature &feature )
col++;
}

geometryToDestinationCrs( feature, mTransform );
if ( mDistanceWithinEngine && mDistanceWithinEngine->distance( feature.geometry().constGet() ) > mRequest.distanceWithin() )
{
continue;
}

feature.setValid( true );
feature.setFields( mSource->mFields ); // allow name-based attribute lookups

geometryToDestinationCrs( feature, mTransform );

return true;
}
}
Expand Down
4 changes: 4 additions & 0 deletions src/providers/oracle/qgsoraclefeatureiterator.h
Expand Up @@ -98,6 +98,10 @@ class QgsOracleFeatureIterator final: public QgsAbstractFeatureIteratorFromSourc

QgsCoordinateTransform mTransform;
QgsRectangle mFilterRect;

QgsGeometry mDistanceWithinGeom;
std::unique_ptr< QgsGeometryEngine > mDistanceWithinEngine;

bool mIsTransactionConnection = false;
};

Expand Down

0 comments on commit 26010fb

Please sign in to comment.