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(
"class" ), QStringLiteral(
"processing.gui.wrappers.EnumWidgetWrapper" ) );
33 widgetMetadata.insert( QStringLiteral(
"useCheckBoxes" ),
true );
34 widgetMetadata.insert( QStringLiteral(
"columns" ), 2 );
35 predicateMetadata.insert( QStringLiteral(
"widget_wrapper" ), widgetMetadata );
36 predicateParam->setMetadata( predicateMetadata );
38 addParameter( predicateParam.release() );
41 QgsLocationBasedAlgorithm::Predicate QgsLocationBasedAlgorithm::reversePredicate( QgsLocationBasedAlgorithm::Predicate predicate )
const 66 QStringList QgsLocationBasedAlgorithm::predicateOptionsList()
const 68 return QStringList() << QObject::tr(
"intersect" )
69 << QObject::tr(
"contain" )
70 << QObject::tr(
"disjoint" )
71 << QObject::tr(
"equal" )
72 << QObject::tr(
"touch" )
73 << QObject::tr(
"overlap" )
74 << QObject::tr(
"are within" )
75 << QObject::tr(
"cross" );
80 const QList< int > &selectedPredicates,
81 const std::function <
void(
const QgsFeature & ) > &handleFeatureFunction,
82 bool onlyRequireTargetIds,
88 QList< Predicate > predicates;
89 predicates.reserve( selectedPredicates.count() );
90 for (
int i : selectedPredicates )
92 predicates << reversePredicate( static_cast< Predicate >( i ) );
96 if ( predicates.contains( Disjoint ) )
105 std::unique_ptr< QgsGeometryEngine > engine;
118 if ( onlyRequireTargetIds )
128 if ( foundSet.contains( testFeature.
id() ) )
133 if ( predicates.count() == 1 && predicates.at( 0 ) == Disjoint && !disjointSet.contains( testFeature.
id() ) )
142 engine->prepareGeometry();
145 for ( Predicate predicate : qgis::as_const( predicates ) )
147 bool isMatch =
false;
159 disjointSet.remove( testFeature.
id() );
180 foundSet.insert( testFeature.
id() );
181 handleFeatureFunction( testFeature );
191 if ( predicates.contains( Disjoint ) )
193 disjointSet = disjointSet.subtract( foundSet );
195 if ( onlyRequireTargetIds )
201 handleFeatureFunction( f );
211 void QgsSelectByLocationAlgorithm::initAlgorithm(
const QVariantMap & )
213 QStringList methods = QStringList() << QObject::tr(
"creating new selection" )
214 << QObject::tr(
"adding to current selection" )
215 << QObject::tr(
"selecting within current selection" )
216 << QObject::tr(
"removing from current selection" );
220 addPredicateParameter();
222 QObject::tr(
"By comparing to the features from" ),
226 QObject::tr(
"Modify current selection by" ),
227 methods,
false, 0 ) );
230 QString QgsSelectByLocationAlgorithm::name()
const 232 return QStringLiteral(
"selectbylocation" );
235 QgsProcessingAlgorithm::Flags QgsSelectByLocationAlgorithm::flags()
const 240 QString QgsSelectByLocationAlgorithm::displayName()
const 242 return QObject::tr(
"Select by location" );
245 QStringList QgsSelectByLocationAlgorithm::tags()
const 247 return QObject::tr(
"select,intersects,intersecting,disjoint,touching,within,contains,overlaps,relation" ).split(
',' );
250 QString QgsSelectByLocationAlgorithm::group()
const 252 return QObject::tr(
"Vector selection" );
255 QString QgsSelectByLocationAlgorithm::groupId()
const 257 return QStringLiteral(
"vectorselection" );
260 QString QgsSelectByLocationAlgorithm::shortHelpString()
const 262 return QObject::tr(
"This algorithm creates a selection in a vector layer. The criteria for selecting " 263 "features is based on the spatial relationship between each feature and the features in an additional layer." );
266 QgsSelectByLocationAlgorithm *QgsSelectByLocationAlgorithm::createInstance()
const 268 return new QgsSelectByLocationAlgorithm();
273 QgsVectorLayer *selectLayer = parameterAsVectorLayer( parameters, QStringLiteral(
"INPUT" ), context );
278 std::unique_ptr< QgsFeatureSource > intersectSource( parameterAsSource( parameters, QStringLiteral(
"INTERSECT" ), context ) );
279 if ( !intersectSource )
282 const QList< int > selectedPredicates = parameterAsEnums( parameters, QStringLiteral(
"PREDICATE" ), context );
285 auto addToSelection = [&](
const QgsFeature & feature )
287 selectedIds.insert( feature.id() );
289 process( context, selectLayer, intersectSource.get(), selectedPredicates, addToSelection,
true, feedback );
293 results.insert( QStringLiteral(
"OUTPUT" ), parameters.value( QStringLiteral(
"INPUT" ) ) );
302 void QgsExtractByLocationAlgorithm::initAlgorithm(
const QVariantMap & )
306 addPredicateParameter();
308 QObject::tr(
"By comparing to the features from" ),
314 QString QgsExtractByLocationAlgorithm::name()
const 316 return QStringLiteral(
"extractbylocation" );
319 QString QgsExtractByLocationAlgorithm::displayName()
const 321 return QObject::tr(
"Extract by location" );
324 QStringList QgsExtractByLocationAlgorithm::tags()
const 326 return QObject::tr(
"extract,filter,intersects,intersecting,disjoint,touching,within,contains,overlaps,relation" ).split(
',' );
329 QString QgsExtractByLocationAlgorithm::group()
const 331 return QObject::tr(
"Vector selection" );
334 QString QgsExtractByLocationAlgorithm::groupId()
const 336 return QStringLiteral(
"vectorselection" );
339 QString QgsExtractByLocationAlgorithm::shortHelpString()
const 341 return QObject::tr(
"This algorithm creates a new vector layer that only contains matching features from an " 342 "input layer. The criteria for adding features to the resulting layer is defined " 343 "based on the spatial relationship between each feature and the features in an additional layer." );
346 QgsExtractByLocationAlgorithm *QgsExtractByLocationAlgorithm::createInstance()
const 348 return new QgsExtractByLocationAlgorithm();
353 std::unique_ptr< QgsFeatureSource > input( parameterAsSource( parameters, QStringLiteral(
"INPUT" ), context ) );
356 std::unique_ptr< QgsFeatureSource > intersectSource( parameterAsSource( parameters, QStringLiteral(
"INTERSECT" ), context ) );
357 if ( !intersectSource )
360 const QList< int > selectedPredicates = parameterAsEnums( parameters, QStringLiteral(
"PREDICATE" ), context );
362 std::unique_ptr< QgsFeatureSink > sink( parameterAsSink( parameters, QStringLiteral(
"OUTPUT" ), context, dest, input->fields(), input->wkbType(), input->sourceCrs() ) );
367 auto addToSink = [&](
const QgsFeature & feature )
372 process( context, input.get(), intersectSource.get(), selectedPredicates, addToSink,
false, feedback );
375 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.
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...
void selectByIds(const QgsFeatureIds &ids, SelectBehavior behavior=SetSelection)
Select matching features using a list of feature IDs.
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.
Base class for feedback objects to be used for cancelation of something running in a worker thread...
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.
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.
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...