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,
87 QList< Predicate > predicates;
88 predicates.reserve( selectedPredicates.count() );
89 for (
int i : selectedPredicates )
91 predicates << reversePredicate( static_cast< Predicate >( i ) );
95 if ( predicates.contains( Disjoint ) )
104 std::unique_ptr< QgsGeometryEngine > engine;
117 if ( onlyRequireTargetIds )
127 if ( foundSet.contains( testFeature.
id() ) )
132 if ( predicates.count() == 1 && predicates.at( 0 ) == Disjoint && !disjointSet.contains( testFeature.
id() ) )
141 engine->prepareGeometry();
144 for ( Predicate predicate : qgis::as_const( predicates ) )
146 bool isMatch =
false;
158 disjointSet.remove( testFeature.
id() );
179 foundSet.insert( testFeature.
id() );
180 handleFeatureFunction( testFeature );
190 if ( predicates.contains( Disjoint ) )
192 disjointSet = disjointSet.subtract( foundSet );
194 if ( onlyRequireTargetIds )
200 handleFeatureFunction( f );
210 void QgsSelectByLocationAlgorithm::initAlgorithm(
const QVariantMap & )
212 QStringList methods = QStringList() << QObject::tr(
"creating new selection" )
213 << QObject::tr(
"adding to current selection" )
214 << QObject::tr(
"selecting within current selection" )
215 << QObject::tr(
"removing from current selection" );
219 addPredicateParameter();
221 QObject::tr(
"By comparing to the features from" ),
225 QObject::tr(
"Modify current selection by" ),
226 methods,
false, 0 ) );
229 QString QgsSelectByLocationAlgorithm::name()
const 231 return QStringLiteral(
"selectbylocation" );
234 QgsProcessingAlgorithm::Flags QgsSelectByLocationAlgorithm::flags()
const 239 QString QgsSelectByLocationAlgorithm::displayName()
const 241 return QObject::tr(
"Select by location" );
244 QStringList QgsSelectByLocationAlgorithm::tags()
const 246 return QObject::tr(
"select,intersects,intersecting,disjoint,touching,within,contains,overlaps,relation" ).split(
',' );
249 QString QgsSelectByLocationAlgorithm::group()
const 251 return QObject::tr(
"Vector selection" );
254 QString QgsSelectByLocationAlgorithm::groupId()
const 256 return QStringLiteral(
"vectorselection" );
259 QString QgsSelectByLocationAlgorithm::shortHelpString()
const 261 return QObject::tr(
"This algorithm creates a selection in a vector layer. The criteria for selecting " 262 "features is based on the spatial relationship between each feature and the features in an additional layer." );
265 QgsSelectByLocationAlgorithm *QgsSelectByLocationAlgorithm::createInstance()
const 267 return new QgsSelectByLocationAlgorithm();
272 QgsVectorLayer *selectLayer = parameterAsVectorLayer( parameters, QStringLiteral(
"INPUT" ), context );
277 std::unique_ptr< QgsFeatureSource > intersectSource( parameterAsSource( parameters, QStringLiteral(
"INTERSECT" ), context ) );
278 if ( !intersectSource )
281 const QList< int > selectedPredicates = parameterAsEnums( parameters, QStringLiteral(
"PREDICATE" ), context );
284 auto addToSelection = [&](
const QgsFeature & feature )
286 selectedIds.insert( feature.id() );
288 process( context, selectLayer, intersectSource.get(), selectedPredicates, addToSelection,
true, feedback );
292 results.insert( QStringLiteral(
"OUTPUT" ), parameters.value( QStringLiteral(
"INPUT" ) ) );
301 void QgsExtractByLocationAlgorithm::initAlgorithm(
const QVariantMap & )
305 addPredicateParameter();
307 QObject::tr(
"By comparing to the features from" ),
313 QString QgsExtractByLocationAlgorithm::name()
const 315 return QStringLiteral(
"extractbylocation" );
318 QString QgsExtractByLocationAlgorithm::displayName()
const 320 return QObject::tr(
"Extract by location" );
323 QStringList QgsExtractByLocationAlgorithm::tags()
const 325 return QObject::tr(
"extract,filter,intersects,intersecting,disjoint,touching,within,contains,overlaps,relation" ).split(
',' );
328 QString QgsExtractByLocationAlgorithm::group()
const 330 return QObject::tr(
"Vector selection" );
333 QString QgsExtractByLocationAlgorithm::groupId()
const 335 return QStringLiteral(
"vectorselection" );
338 QString QgsExtractByLocationAlgorithm::shortHelpString()
const 340 return QObject::tr(
"This algorithm creates a new vector layer that only contains matching features from an " 341 "input layer. The criteria for adding features to the resulting layer is defined " 342 "based on the spatial relationship between each feature and the features in an additional layer." );
345 QgsExtractByLocationAlgorithm *QgsExtractByLocationAlgorithm::createInstance()
const 347 return new QgsExtractByLocationAlgorithm();
352 std::unique_ptr< QgsFeatureSource > input( parameterAsSource( parameters, QStringLiteral(
"INPUT" ), context ) );
355 std::unique_ptr< QgsFeatureSource > intersectSource( parameterAsSource( parameters, QStringLiteral(
"INTERSECT" ), context ) );
356 if ( !intersectSource )
359 const QList< int > selectedPredicates = parameterAsEnums( parameters, QStringLiteral(
"PREDICATE" ), context );
361 std::unique_ptr< QgsFeatureSink > sink( parameterAsSink( parameters, QStringLiteral(
"OUTPUT" ), context, dest, input->fields(), input->wkbType(), input->sourceCrs() ) );
366 auto addToSink = [&](
const QgsFeature & feature )
371 process( context, input.get(), intersectSource.get(), selectedPredicates, addToSink,
false, feedback );
374 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)
Selects 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 cancellation 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...