24 void QgsLocationBasedAlgorithm::addPredicateParameter()
27 QObject::tr(
"Where the features (geometric predicate)" ),
28 predicateOptionsList(),
true, QVariant::fromValue( QList< int >() << 0 ) ) );
30 QVariantMap predicateMetadata;
31 QVariantMap widgetMetadata;
32 widgetMetadata.insert( QStringLiteral(
"useCheckBoxes" ),
true );
33 widgetMetadata.insert( QStringLiteral(
"columns" ), 2 );
34 predicateMetadata.insert( QStringLiteral(
"widget_wrapper" ), widgetMetadata );
35 predicateParam->setMetadata( predicateMetadata );
37 addParameter( predicateParam.release() );
40 QgsLocationBasedAlgorithm::Predicate QgsLocationBasedAlgorithm::reversePredicate( QgsLocationBasedAlgorithm::Predicate predicate )
const 65 QStringList QgsLocationBasedAlgorithm::predicateOptionsList()
const 67 return QStringList() << QObject::tr(
"intersect" )
68 << QObject::tr(
"contain" )
69 << QObject::tr(
"disjoint" )
70 << QObject::tr(
"equal" )
71 << QObject::tr(
"touch" )
72 << QObject::tr(
"overlap" )
73 << QObject::tr(
"are within" )
74 << QObject::tr(
"cross" );
79 const QList< int > &selectedPredicates,
80 const std::function <
void(
const QgsFeature & ) > &handleFeatureFunction,
81 bool onlyRequireTargetIds,
89 processByIteratingOverTargetSource( context, targetSource, intersectSource,
90 selectedPredicates, handleFeatureFunction,
91 onlyRequireTargetIds, feedback );
101 processByIteratingOverIntersectSource( context, targetSource, intersectSource,
102 selectedPredicates, handleFeatureFunction,
103 onlyRequireTargetIds, feedback );
109 const QList< int > &selectedPredicates,
110 const std::function <
void(
const QgsFeature & ) > &handleFeatureFunction,
111 bool onlyRequireTargetIds,
115 feedback->
reportError( QObject::tr(
"No spatial index exists for intersect layer, performance will be severely degraded" ) );
119 if ( onlyRequireTargetIds )
126 std::unique_ptr< QgsGeometryEngine > engine;
142 bool isMatch =
false;
143 bool isDisjoint =
true;
152 engine->prepareGeometry();
155 for (
int predicate : selectedPredicates )
157 switch ( static_cast< Predicate>( predicate ) )
194 foundSet.insert( f.
id() );
195 handleFeatureFunction( f );
199 if ( isDisjoint && selectedPredicates.contains( Disjoint ) )
201 foundSet.insert( f.
id() );
202 handleFeatureFunction( f );
212 const QList< int > &selectedPredicates,
213 const std::function <
void(
const QgsFeature & ) > &handleFeatureFunction,
214 bool onlyRequireTargetIds,
218 feedback->
reportError( QObject::tr(
"No spatial index exists for input layer, performance will be severely degraded" ) );
223 QList< Predicate > predicates;
224 predicates.reserve( selectedPredicates.count() );
225 for (
int i : selectedPredicates )
227 predicates << reversePredicate( static_cast< Predicate >( i ) );
231 if ( predicates.contains( Disjoint ) )
240 std::unique_ptr< QgsGeometryEngine > engine;
253 if ( onlyRequireTargetIds )
263 if ( foundSet.contains( testFeature.
id() ) )
268 if ( predicates.count() == 1 && predicates.at( 0 ) == Disjoint && !disjointSet.contains( testFeature.
id() ) )
277 engine->prepareGeometry();
280 for ( Predicate predicate : qgis::as_const( predicates ) )
282 bool isMatch =
false;
294 disjointSet.remove( testFeature.
id() );
315 foundSet.insert( testFeature.
id() );
316 handleFeatureFunction( testFeature );
326 if ( predicates.contains( Disjoint ) )
328 disjointSet = disjointSet.subtract( foundSet );
330 if ( onlyRequireTargetIds )
336 handleFeatureFunction( f );
346 void QgsSelectByLocationAlgorithm::initAlgorithm(
const QVariantMap & )
348 QStringList methods = QStringList() << QObject::tr(
"creating new selection" )
349 << QObject::tr(
"adding to current selection" )
350 << QObject::tr(
"selecting within current selection" )
351 << QObject::tr(
"removing from current selection" );
355 addPredicateParameter();
357 QObject::tr(
"By comparing to the features from" ),
361 QObject::tr(
"Modify current selection by" ),
362 methods,
false, 0 ) );
365 QString QgsSelectByLocationAlgorithm::name()
const 367 return QStringLiteral(
"selectbylocation" );
370 QgsProcessingAlgorithm::Flags QgsSelectByLocationAlgorithm::flags()
const 375 QString QgsSelectByLocationAlgorithm::displayName()
const 377 return QObject::tr(
"Select by location" );
380 QStringList QgsSelectByLocationAlgorithm::tags()
const 382 return QObject::tr(
"select,intersects,intersecting,disjoint,touching,within,contains,overlaps,relation" ).split(
',' );
385 QString QgsSelectByLocationAlgorithm::group()
const 387 return QObject::tr(
"Vector selection" );
390 QString QgsSelectByLocationAlgorithm::groupId()
const 392 return QStringLiteral(
"vectorselection" );
395 QString QgsSelectByLocationAlgorithm::shortHelpString()
const 397 return QObject::tr(
"This algorithm creates a selection in a vector layer. The criteria for selecting " 398 "features is based on the spatial relationship between each feature and the features in an additional layer." );
401 QgsSelectByLocationAlgorithm *QgsSelectByLocationAlgorithm::createInstance()
const 403 return new QgsSelectByLocationAlgorithm();
408 QgsVectorLayer *selectLayer = parameterAsVectorLayer( parameters, QStringLiteral(
"INPUT" ), context );
413 std::unique_ptr< QgsFeatureSource > intersectSource( parameterAsSource( parameters, QStringLiteral(
"INTERSECT" ), context ) );
414 if ( !intersectSource )
417 const QList< int > selectedPredicates = parameterAsEnums( parameters, QStringLiteral(
"PREDICATE" ), context );
420 auto addToSelection = [&](
const QgsFeature & feature )
422 selectedIds.insert( feature.id() );
424 process( context, selectLayer, intersectSource.get(), selectedPredicates, addToSelection,
true, feedback );
428 results.insert( QStringLiteral(
"OUTPUT" ), parameters.value( QStringLiteral(
"INPUT" ) ) );
437 void QgsExtractByLocationAlgorithm::initAlgorithm(
const QVariantMap & )
441 addPredicateParameter();
443 QObject::tr(
"By comparing to the features from" ),
449 QString QgsExtractByLocationAlgorithm::name()
const 451 return QStringLiteral(
"extractbylocation" );
454 QString QgsExtractByLocationAlgorithm::displayName()
const 456 return QObject::tr(
"Extract by location" );
459 QStringList QgsExtractByLocationAlgorithm::tags()
const 461 return QObject::tr(
"extract,filter,intersects,intersecting,disjoint,touching,within,contains,overlaps,relation" ).split(
',' );
464 QString QgsExtractByLocationAlgorithm::group()
const 466 return QObject::tr(
"Vector selection" );
469 QString QgsExtractByLocationAlgorithm::groupId()
const 471 return QStringLiteral(
"vectorselection" );
474 QString QgsExtractByLocationAlgorithm::shortHelpString()
const 476 return QObject::tr(
"This algorithm creates a new vector layer that only contains matching features from an " 477 "input layer. The criteria for adding features to the resulting layer is defined " 478 "based on the spatial relationship between each feature and the features in an additional layer." );
481 QgsExtractByLocationAlgorithm *QgsExtractByLocationAlgorithm::createInstance()
const 483 return new QgsExtractByLocationAlgorithm();
488 std::unique_ptr< QgsFeatureSource > input( parameterAsSource( parameters, QStringLiteral(
"INPUT" ), context ) );
491 std::unique_ptr< QgsFeatureSource > intersectSource( parameterAsSource( parameters, QStringLiteral(
"INTERSECT" ), context ) );
492 if ( !intersectSource )
495 const QList< int > selectedPredicates = parameterAsEnums( parameters, QStringLiteral(
"PREDICATE" ), context );
497 std::unique_ptr< QgsFeatureSink > sink( parameterAsSink( parameters, QStringLiteral(
"OUTPUT" ), context, dest, input->fields(), input->wkbType(), input->sourceCrs() ) );
502 auto addToSink = [&](
const QgsFeature & feature )
507 process( context, input.get(), intersectSource.get(), selectedPredicates, addToSink,
false, feedback );
510 results.insert( QStringLiteral(
"OUTPUT" ), dest );
QgsFeatureRequest & setDestinationCrs(const QgsCoordinateReferenceSystem &crs, const QgsCoordinateTransformContext &context)
Sets the destination crs for feature's geometries.
Wrapper for iterator of features from vector data provider or vector layer.
No spatial index exists for the source.
Use faster inserts, at the cost of updating the passed features to reflect changes made at the provid...
A rectangle specified with double values.
QSet< QgsFeatureId > QgsFeatureIds
Base class for providing feedback from a processing algorithm.
void setProgress(double progress)
Sets the current progress for the feedback object.
virtual Flags flags() const
Returns the flags indicating how and when the algorithm operates and should be exposed to users...
The feature class encapsulates a single feature including its id, geometry and a list of field/values...
bool hasGeometry() const
Returns true if the feature has an associated geometry.
A feature sink output for processing algorithms.
An enum based parameter for processing algorithms, allowing for selection from predefined values...
Algorithm is not thread safe and cannot be run in a background thread, e.g. for algorithms which mani...
QgsFeatureRequest & setNoAttributes()
Set that no attributes will be fetched.
This class wraps a request for features to a vector layer (or directly its vector data provider)...
Custom exception class for processing related exceptions.
virtual SpatialIndexPresence hasSpatialIndex() const
Returns an enum value representing the presence of a valid spatial index on the source, if it can be determined.
QgsFeatureRequest & setFilterRect(const QgsRectangle &rectangle)
Sets the rectangle from which features will be taken.
QgsCoordinateTransformContext transformContext() const
Returns the coordinate transform context.
A vector layer (with or without geometry) parameter for processing algorithms.
virtual QgsCoordinateReferenceSystem sourceCrs() const =0
Returns the coordinate reference system for features in the source.
static QgsGeometryEngine * createGeometryEngine(const QgsAbstractGeometry *geometry)
Creates and returns a new geometry engine.
const QgsAbstractGeometry * constGet() const
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
SelectBehavior
Selection behavior.
QgsFeatureRequest & setFilterFids(const QgsFeatureIds &fids)
Sets feature IDs that should be fetched.
bool isCanceled() const
Tells whether the operation has been canceled already.
An interface for objects which provide features via a getFeatures method.
An input feature source (such as vector layers) parameter for processing algorithms.
QgsRectangle boundingBox() const
Returns the bounding box of the geometry.
Q_INVOKABLE void selectByIds(const QgsFeatureIds &ids, QgsVectorLayer::SelectBehavior behavior=QgsVectorLayer::SetSelection)
Selects matching features using a list of feature IDs.
virtual void reportError(const QString &error, bool fatalError=false)
Reports that the algorithm encountered an error while executing.
bool nextFeature(QgsFeature &f)
Geometry is not required. It may still be returned if e.g. required for a filter condition.
Represents a vector layer which manages a vector based data sets.
virtual QgsFeatureIds allFeatureIds() const
Returns a list of all feature IDs for features present in the source.
Contains information about the context in which a processing algorithm is executed.
Any vector layer with geometry.
virtual QgsFeatureIterator getFeatures(const QgsFeatureRequest &request=QgsFeatureRequest()) const =0
Returns an iterator for the features in the source.
QgsFeatureRequest & setFlags(QgsFeatureRequest::Flags flags)
Sets flags that affect how features will be fetched.
virtual long featureCount() const =0
Returns the number of features contained in the source, or -1 if the feature count is unknown...