26QString QgsMultiDifferenceAlgorithm::name()
const
28 return QStringLiteral(
"multidifference" );
31QString QgsMultiDifferenceAlgorithm::displayName()
const
33 return QObject::tr(
"Difference (multiple)" );
36QStringList QgsMultiDifferenceAlgorithm::tags()
const
38 return QObject::tr(
"difference,erase,not overlap" ).split(
',' );
41QString QgsMultiDifferenceAlgorithm::group()
const
43 return QObject::tr(
"Vector overlay" );
46QString QgsMultiDifferenceAlgorithm::groupId()
const
48 return QStringLiteral(
"vectoroverlay" );
51QString QgsMultiDifferenceAlgorithm::shortHelpString()
const
53 return QObject::tr(
"This algorithm extracts features from the Input layer that fall completely outside or only partially overlap the features from any of the Overlay layer(s). "
54 "For each overlay layer the difference is calculated between the result of all previous difference operations and this overlay layer. "
55 "Input layer features that partially overlap feature(s) in the Overlay layers are split along those features' boundary "
56 "and only the portions outside the Overlay layer features are retained." )
57 + QStringLiteral(
"\n\n" )
58 + QObject::tr(
"Attributes are not modified, although properties such as area or length of the features will "
59 "be modified by the difference operation. If such properties are stored as attributes, those attributes will have to "
60 "be manually updated." );
65 return new QgsMultiDifferenceAlgorithm();
68void QgsMultiDifferenceAlgorithm::initAlgorithm(
const QVariantMap & )
78 std::unique_ptr< QgsFeatureSource > sourceA( parameterAsSource( parameters, QStringLiteral(
"INPUT" ), context ) );
82 const QList< QgsMapLayer * > layers = parameterAsLayerList( parameters, QStringLiteral(
"OVERLAYS" ), context );
85 long totalLayerCount = 0;
94 if ( layer->type() != Qgis::LayerType::Vector )
102 std::unique_ptr< QgsFeatureSink > sink;
106 if ( totalLayerCount == 1 )
109 sink.reset( parameterAsSink( parameters, QStringLiteral(
"OUTPUT" ), context, dest, sourceA->fields(), geometryType,
crs ) );
113 outputs.insert( QStringLiteral(
"OUTPUT" ), dest );
115 QgsVectorLayer *overlayLayer = qobject_cast< QgsVectorLayer * >( layers.at( 0 ) );
117 const long total = sourceA->featureCount();
118 QgsOverlayUtils::difference( *sourceA, *overlayLayer, *sink, context, feedback, count, total, QgsOverlayUtils::OutputA );
131 multiStepFeedback.setCurrentStep( i );
136 QgsVectorLayer *overlayLayer = qobject_cast< QgsVectorLayer * >( layer );
143 QString
id = QStringLiteral(
"memory:" );
145 QgsOverlayUtils::difference( *sourceA, *overlayLayer, *sink, context, &multiStepFeedback, count, sourceA->featureCount(), QgsOverlayUtils::OutputA );
149 else if ( i == totalLayerCount - 1 )
152 std::unique_ptr< QgsFeatureSink > sink( parameterAsSink( parameters, QStringLiteral(
"OUTPUT" ), context, dest, differenceLayer->
fields(), geometryType,
crs ) );
156 outputs.insert( QStringLiteral(
"OUTPUT" ), dest );
158 QgsOverlayUtils::difference( *differenceLayer, *overlayLayer, *sink, context, &multiStepFeedback, count, differenceLayer->
featureCount(), QgsOverlayUtils::OutputA );
162 QString
id = QStringLiteral(
"memory:" );
164 QgsOverlayUtils::difference( *differenceLayer, *overlayLayer, *sink, context, &multiStepFeedback, count, differenceLayer->
featureCount(), QgsOverlayUtils::OutputA );
WkbType
The WKB type describes the number of dimensions a geometry has.
This class represents a coordinate reference system (CRS).
bool isCanceled() const SIP_HOLDGIL
Tells whether the operation has been canceled already.
Base class for all map layer types.
Abstract base class for processing algorithms.
Contains information about the context in which a processing algorithm is executed.
Custom exception class for processing related exceptions.
Base class for providing feedback from a processing algorithm.
Processing feedback object for multi-step operations.
A feature sink output for processing algorithms.
An input feature source (such as vector layers) parameter for processing algorithms.
A parameter for processing algorithms which accepts multiple map layers.
static QgsMapLayer * mapLayerFromString(const QString &string, QgsProcessingContext &context, bool allowLoadingNewLayers=true, QgsProcessingUtils::LayerHint typeHint=QgsProcessingUtils::LayerHint::UnknownType)
Interprets a string as a map layer within the supplied context.
static QgsFeatureSink * createFeatureSink(QString &destination, QgsProcessingContext &context, const QgsFields &fields, Qgis::WkbType geometryType, const QgsCoordinateReferenceSystem &crs, const QVariantMap &createOptions=QVariantMap(), const QStringList &datasourceOptions=QStringList(), const QStringList &layerOptions=QStringList(), QgsFeatureSink::SinkFlags sinkFlags=QgsFeatureSink::SinkFlags(), QgsRemappingSinkDefinition *remappingDefinition=nullptr)
Creates a feature sink ready for adding features.
@ TypeVectorAnyGeometry
Any vector layer with geometry.
Represents a vector layer which manages a vector based data sets.
long long featureCount(const QString &legendKey) const
Number of features rendered with specified legend key.
QgsFields fields() const FINAL
Returns the list of fields of this layer.
static Qgis::WkbType multiType(Qgis::WkbType type) SIP_HOLDGIL
Returns the multi type for a WKB type.
const QgsCoordinateReferenceSystem & crs