Add method to retrieve all features from a QgsProcessingFeatureSource

...even when invalid geometries are present and option is set to
skip invalid or break on invalid.

Some algorithms (e.g. those which repair geometries) need a way
to retrieve all features with invalid geometries, regardless of
the user's settings.
This commit is contained in:
Nyall Dawson 2017-06-26 12:41:00 +10:00
parent 3fb1b4809d
commit ec7477cac7
2 changed files with 30 additions and 0 deletions

View File

@ -480,6 +480,22 @@ QgsProcessingFeatureSource::~QgsProcessingFeatureSource()
delete mSource;
}
QgsFeatureIterator QgsProcessingFeatureSource::getFeatures( const QgsFeatureRequest &request, Flags flags ) const
{
QgsFeatureRequest req( request );
req.setTransformErrorCallback( mTransformErrorCallback );
if ( flags & FlagSkipGeometryValidityChecks )
req.setInvalidGeometryCheck( QgsFeatureRequest::GeometryNoCheck );
else
{
req.setInvalidGeometryCheck( mInvalidGeometryCheck );
req.setInvalidGeometryCallback( mInvalidGeometryCallback );
}
return mSource->getFeatures( req );
}
QgsFeatureIterator QgsProcessingFeatureSource::getFeatures( const QgsFeatureRequest &request ) const
{
QgsFeatureRequest req( request );

View File

@ -230,6 +230,13 @@ class CORE_EXPORT QgsProcessingFeatureSource : public QgsFeatureSource
{
public:
//! Flags controlling how QgsProcessingFeatureSource fetches features
enum Flag
{
FlagSkipGeometryValidityChecks = 1 << 1, //!< Invalid geometry checks should always be skipped. This flag can be useful for algorithms which always require invalid geometries, regardless of any user settings (e.g. "repair geometry" type algorithms).
};
Q_DECLARE_FLAGS( Flags, Flag )
/**
* Constructor for QgsProcessingFeatureSource, accepting an original feature source \a originalSource
* and processing \a context.
@ -241,6 +248,13 @@ class CORE_EXPORT QgsProcessingFeatureSource : public QgsFeatureSource
~QgsProcessingFeatureSource();
/**
* Returns an iterator for the features in the source, respecting the supplied feature \a flags.
* An optional \a request can be used to optimise the returned
* iterator, eg by restricting the returned attributes or geometry.
*/
QgsFeatureIterator getFeatures( const QgsFeatureRequest &request, Flags flags ) const;
QgsFeatureIterator getFeatures( const QgsFeatureRequest &request = QgsFeatureRequest() ) const override;
QgsCoordinateReferenceSystem sourceCrs() const override;
QgsFields fields() const override;