24 void QgsDistanceWithinAlgorithm::addDistanceParameter()
27 QObject::tr(
"Where the features are within" ), 100, QStringLiteral(
"INPUT" ),
false, 0 ) );
28 distanceParam->setIsDynamic(
true );
30 distanceParam->setDynamicLayerParameterName( QStringLiteral(
"INPUT" ) );
32 addParameter( distanceParam.release() );
37 double distance,
const QgsProperty &distanceProperty,
38 const std::function <
void(
const QgsFeature & ) > &handleFeatureFunction,
39 bool onlyRequireTargetIds,
48 bool iterateOverTarget =
false;
58 iterateOverTarget =
true;
65 iterateOverTarget =
true;
74 iterateOverTarget =
true;
82 iterateOverTarget =
true;
88 if ( iterateOverTarget )
90 processByIteratingOverTargetSource( context, targetSource, referenceSource,
91 distance, distanceProperty, handleFeatureFunction,
92 onlyRequireTargetIds, feedback, expressionContext );
96 processByIteratingOverReferenceSource( context, targetSource, referenceSource,
97 distance, handleFeatureFunction,
98 onlyRequireTargetIds, feedback );
104 const double distance,
const QgsProperty &distanceProperty,
105 const std::function <
void(
const QgsFeature & ) > &handleFeatureFunction,
106 bool onlyRequireTargetIds,
110 feedback->
pushWarning( QObject::tr(
"No spatial index exists for intersect layer, performance will be severely degraded" ) );
114 if ( onlyRequireTargetIds )
117 const bool dynamicDistance = distanceProperty.
isActive();
131 double currentDistance = distance;
132 if ( dynamicDistance )
135 currentDistance = distanceProperty.
valueAsDouble( expressionContext, currentDistance );
146 foundSet.insert( f.
id() );
147 handleFeatureFunction( f );
157 const double distance,
158 const std::function <
void(
const QgsFeature & ) > &handleFeatureFunction,
159 bool onlyRequireTargetIds,
163 feedback->
pushWarning( QObject::tr(
"No spatial index exists for input layer, performance will be severely degraded" ) );
181 if ( onlyRequireTargetIds )
191 if ( foundSet.contains( testFeature.
id() ) )
197 foundSet.insert( testFeature.
id() );
198 handleFeatureFunction( testFeature );
211 void QgsSelectWithinDistanceAlgorithm::initAlgorithm(
const QVariantMap & )
213 const 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" );
222 QObject::tr(
"By comparing to the features from" ),
224 addDistanceParameter();
227 QObject::tr(
"Modify current selection by" ),
228 methods,
false, 0 ) );
231 QString QgsSelectWithinDistanceAlgorithm::name()
const
233 return QStringLiteral(
"selectwithindistance" );
236 QgsProcessingAlgorithm::Flags QgsSelectWithinDistanceAlgorithm::flags()
const
241 QString QgsSelectWithinDistanceAlgorithm::displayName()
const
243 return QObject::tr(
"Select within distance" );
246 QStringList QgsSelectWithinDistanceAlgorithm::tags()
const
248 return QObject::tr(
"select,maximum,buffer" ).split(
',' );
251 QString QgsSelectWithinDistanceAlgorithm::group()
const
253 return QObject::tr(
"Vector selection" );
256 QString QgsSelectWithinDistanceAlgorithm::groupId()
const
258 return QStringLiteral(
"vectorselection" );
261 QString QgsSelectWithinDistanceAlgorithm::shortHelpString()
const
263 return QObject::tr(
"This algorithm creates a selection in a vector layer. Features are selected wherever they are within "
264 "the specified maximum distance from the features in an additional reference layer." );
267 QgsSelectWithinDistanceAlgorithm *QgsSelectWithinDistanceAlgorithm::createInstance()
const
269 return new QgsSelectWithinDistanceAlgorithm();
274 QgsVectorLayer *selectLayer = parameterAsVectorLayer( parameters, QStringLiteral(
"INPUT" ), context );
279 const std::unique_ptr< QgsFeatureSource > referenceSource( parameterAsSource( parameters, QStringLiteral(
"REFERENCE" ), context ) );
280 if ( !referenceSource )
283 const double distance = parameterAsDouble( parameters, QStringLiteral(
"DISTANCE" ), context );
286 if ( dynamicDistance )
287 distanceProperty = parameters.
value( QStringLiteral(
"DISTANCE" ) ).value<
QgsProperty >();
292 auto addToSelection = [&](
const QgsFeature & feature )
294 selectedIds.insert( feature.id() );
296 process( context, selectLayer, referenceSource.get(), distance, distanceProperty, addToSelection,
true, feedback, expressionContext );
300 results.insert( QStringLiteral(
"OUTPUT" ), parameters.value( QStringLiteral(
"INPUT" ) ) );
309 void QgsExtractWithinDistanceAlgorithm::initAlgorithm(
const QVariantMap & )
312 QObject::tr(
"Extract features from" ),
315 QObject::tr(
"By comparing to the features from" ),
317 addDistanceParameter();
322 QString QgsExtractWithinDistanceAlgorithm::name()
const
324 return QStringLiteral(
"extractwithindistance" );
327 QString QgsExtractWithinDistanceAlgorithm::displayName()
const
329 return QObject::tr(
"Extract within distance" );
332 QStringList QgsExtractWithinDistanceAlgorithm::tags()
const
334 return QObject::tr(
"extract,filter,select,maximum,buffer" ).split(
',' );
337 QString QgsExtractWithinDistanceAlgorithm::group()
const
339 return QObject::tr(
"Vector selection" );
342 QString QgsExtractWithinDistanceAlgorithm::groupId()
const
344 return QStringLiteral(
"vectorselection" );
347 QString QgsExtractWithinDistanceAlgorithm::shortHelpString()
const
349 return QObject::tr(
"This algorithm creates a new vector layer that only contains matching features from an "
350 "input layer. Features are copied wherever they are within "
351 "the specified maximum distance from the features in an additional reference layer." );
354 QgsExtractWithinDistanceAlgorithm *QgsExtractWithinDistanceAlgorithm::createInstance()
const
356 return new QgsExtractWithinDistanceAlgorithm();
361 std::unique_ptr< QgsProcessingFeatureSource > input( parameterAsSource( parameters, QStringLiteral(
"INPUT" ), context ) );
364 const std::unique_ptr< QgsFeatureSource > referenceSource( parameterAsSource( parameters, QStringLiteral(
"REFERENCE" ), context ) );
365 if ( !referenceSource )
368 const double distance = parameterAsDouble( parameters, QStringLiteral(
"DISTANCE" ), context );
371 if ( dynamicDistance )
372 distanceProperty = parameters.
value( QStringLiteral(
"DISTANCE" ) ).value<
QgsProperty >();
373 QgsExpressionContext expressionContext = createExpressionContext( parameters, context, input.get() );
376 std::unique_ptr< QgsFeatureSink > sink( parameterAsSink( parameters, QStringLiteral(
"OUTPUT" ), context, dest, input->fields(), input->wkbType(), input->sourceCrs() ) );
381 auto addToSink = [&](
const QgsFeature & feature )
387 process( context, input.get(), referenceSource.get(), distance, distanceProperty, addToSink,
false, feedback, expressionContext );
390 results.insert( QStringLiteral(
"OUTPUT" ), dest );
SelectBehavior
Specifies how a selection should be applied.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
void setFeature(const QgsFeature &feature)
Convenience function for setting a feature for the context.
Wrapper for iterator of features from vector data provider or vector layer.
bool nextFeature(QgsFeature &f)
This class wraps a request for features to a vector layer (or directly its vector data provider).
QgsFeatureRequest & setLimit(long long limit)
Set the maximum number of features to request.
QgsFeatureRequest & setDestinationCrs(const QgsCoordinateReferenceSystem &crs, const QgsCoordinateTransformContext &context)
Sets the destination crs for feature's geometries.
QgsFeatureRequest & setNoAttributes()
Set that no attributes will be fetched.
QgsFeatureRequest & setDistanceWithin(const QgsGeometry &geometry, double distance)
Sets a reference geometry and a maximum distance from this geometry to retrieve features within.
@ FastInsert
Use faster inserts, at the cost of updating the passed features to reflect changes made at the provid...
An interface for objects which provide features via a getFeatures method.
virtual QgsCoordinateReferenceSystem sourceCrs() const =0
Returns the coordinate reference system for features in the source.
@ SpatialIndexNotPresent
No spatial index exists for the source.
virtual QgsWkbTypes::Type wkbType() const =0
Returns the geometry type for features returned by this source.
virtual QgsFeatureIterator getFeatures(const QgsFeatureRequest &request=QgsFeatureRequest()) const =0
Returns an iterator for the features in the source.
virtual long long featureCount() const =0
Returns the number of features contained in the source, or -1 if the feature count is unknown.
virtual SpatialIndexPresence hasSpatialIndex() const
Returns an enum value representing the presence of a valid spatial index on the source,...
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
bool hasGeometry() const
Returns true if the feature has an associated geometry.
bool isCanceled() const SIP_HOLDGIL
Tells whether the operation has been canceled already.
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.
@ FlagNotAvailableInStandaloneTool
Algorithm should not be available from the standalone "qgis_process" tool. Used to flag algorithms wh...
@ FlagNoThreading
Algorithm is not thread safe and cannot be run in a background thread, e.g. for algorithms which mani...
Contains information about the context in which a processing algorithm is executed.
QgsCoordinateTransformContext transformContext() const
Returns the coordinate transform context.
Custom exception class for processing related exceptions.
Base class for providing feedback from a processing algorithm.
virtual void pushWarning(const QString &warning)
Pushes a warning informational message from the algorithm.
A double numeric parameter for distance values.
An enum based parameter for processing algorithms, allowing for selection from predefined values.
A feature sink output for processing algorithms.
An input feature source (such as vector layers) parameter for processing algorithms.
A vector layer (with or without geometry) parameter for processing algorithms.
static bool isDynamic(const QVariantMap ¶meters, const QString &name)
Returns true if the parameter with matching name is a dynamic parameter, and must be evaluated once f...
@ TypeVectorAnyGeometry
Any vector layer with geometry.
Definition for a property.
@ DoublePositive
Positive double value (including 0)
A store for object properties.
QVariant value(const QgsExpressionContext &context, const QVariant &defaultValue=QVariant(), bool *ok=nullptr) const
Calculates the current value of the property, including any transforms which are set for the property...
bool isActive() const
Returns whether the property is currently active.
double valueAsDouble(const QgsExpressionContext &context, double defaultValue=0.0, bool *ok=nullptr) const
Calculates the current value of the property and interprets it as a double.
Represents a vector layer which manages a vector based data sets.
QgsExpressionContextScope * createExpressionContextScope() const FINAL
This method needs to be reimplemented in all classes which implement this interface and return an exp...
Q_INVOKABLE void selectByIds(const QgsFeatureIds &ids, Qgis::SelectBehavior behavior=Qgis::SelectBehavior::SetSelection)
Selects matching features using a list of feature IDs.
QSet< QgsFeatureId > QgsFeatureIds