QGIS API Documentation  3.22.4-Białowieża (ce8e65e95e)
qgsalgorithmdifference.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsalgorithmdifference.cpp
3  ---------------------
4  Date : April 2018
5  Copyright : (C) 2018 by Martin Dobias
6  Email : wonder dot sk at gmail dot com
7  ***************************************************************************
8  * *
9  * This program is free software; you can redistribute it and/or modify *
10  * it under the terms of the GNU General Public License as published by *
11  * the Free Software Foundation; either version 2 of the License, or *
12  * (at your option) any later version. *
13  * *
14  ***************************************************************************/
15 
16 #include "qgsalgorithmdifference.h"
17 
18 #include "qgsoverlayutils.h"
19 #include "qgsvectorlayer.h"
20 
22 
23 
24 QString QgsDifferenceAlgorithm::name() const
25 {
26  return QStringLiteral( "difference" );
27 }
28 
29 QString QgsDifferenceAlgorithm::displayName() const
30 {
31  return QObject::tr( "Difference" );
32 }
33 
34 QStringList QgsDifferenceAlgorithm::tags() const
35 {
36  return QObject::tr( "difference,erase,not overlap" ).split( ',' );
37 }
38 
39 QString QgsDifferenceAlgorithm::group() const
40 {
41  return QObject::tr( "Vector overlay" );
42 }
43 
44 QString QgsDifferenceAlgorithm::groupId() const
45 {
46  return QStringLiteral( "vectoroverlay" );
47 }
48 
49 QString QgsDifferenceAlgorithm::shortHelpString() const
50 {
51  return QObject::tr( "This algorithm extracts features from the Input layer that fall outside, or partially overlap, features in the Overlay layer. "
52  "Input layer features that partially overlap feature(s) in the Overlay layer are split along those features' boundary "
53  "and only the portions outside the Overlay layer features are retained." )
54  + QStringLiteral( "\n\n" )
55  + QObject::tr( "Attributes are not modified, although properties such as area or length of the features will "
56  "be modified by the difference operation. If such properties are stored as attributes, those attributes will have to "
57  "be manually updated." );
58 }
59 
60 bool QgsDifferenceAlgorithm::supportInPlaceEdit( const QgsMapLayer *l ) const
61 {
62  const QgsVectorLayer *layer = qobject_cast< const QgsVectorLayer * >( l );
63  if ( !layer )
64  return false;
65 
66  return layer->isSpatial();
67 }
68 
69 QgsProcessingAlgorithm::Flags QgsDifferenceAlgorithm::flags() const
70 {
73  return f;
74 }
75 
76 QgsProcessingAlgorithm *QgsDifferenceAlgorithm::createInstance() const
77 {
78  return new QgsDifferenceAlgorithm();
79 }
80 
81 void QgsDifferenceAlgorithm::initAlgorithm( const QVariantMap & )
82 {
83  addParameter( new QgsProcessingParameterFeatureSource( QStringLiteral( "INPUT" ), QObject::tr( "Input layer" ) ) );
84  addParameter( new QgsProcessingParameterFeatureSource( QStringLiteral( "OVERLAY" ), QObject::tr( "Overlay layer" ) ) );
85  addParameter( new QgsProcessingParameterFeatureSink( QStringLiteral( "OUTPUT" ), QObject::tr( "Difference" ) ) );
86 }
87 
88 
89 QVariantMap QgsDifferenceAlgorithm::processAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback )
90 {
91  std::unique_ptr< QgsFeatureSource > sourceA( parameterAsSource( parameters, QStringLiteral( "INPUT" ), context ) );
92  if ( !sourceA )
93  throw QgsProcessingException( invalidSourceError( parameters, QStringLiteral( "INPUT" ) ) );
94 
95  const std::unique_ptr< QgsFeatureSource > sourceB( parameterAsSource( parameters, QStringLiteral( "OVERLAY" ), context ) );
96  if ( !sourceB )
97  throw QgsProcessingException( invalidSourceError( parameters, QStringLiteral( "OVERLAY" ) ) );
98 
99  const QgsWkbTypes::Type geomType = QgsWkbTypes::promoteNonPointTypesToMulti( sourceA->wkbType() );
100 
101  QString dest;
102  std::unique_ptr< QgsFeatureSink > sink( parameterAsSink( parameters, QStringLiteral( "OUTPUT" ), context, dest, sourceA->fields(), geomType, sourceA->sourceCrs() ) );
103  if ( !sink )
104  throw QgsProcessingException( invalidSinkError( parameters, QStringLiteral( "OUTPUT" ) ) );
105 
106  QVariantMap outputs;
107  outputs.insert( QStringLiteral( "OUTPUT" ), dest );
108 
109  long count = 0;
110  const long total = sourceA->featureCount();
111  QgsOverlayUtils::difference( *sourceA, *sourceB, *sink, context, feedback, count, total, QgsOverlayUtils::OutputA );
112 
113  return outputs;
114 }
115 
Base class for all map layer types.
Definition: qgsmaplayer.h:73
Abstract base class for processing algorithms.
virtual Flags flags() const
Returns the flags indicating how and when the algorithm operates and should be exposed to users.
@ FlagSupportsInPlaceEdits
Algorithm supports in-place editing.
Contains information about the context in which a processing algorithm is executed.
Custom exception class for processing related exceptions.
Definition: qgsexception.h:83
Base class for providing feedback from a processing algorithm.
A feature sink output for processing algorithms.
An input feature source (such as vector layers) parameter for processing algorithms.
Represents a vector layer which manages a vector based data sets.
bool isSpatial() const FINAL
Returns true if this is a geometry layer and false in case of NoGeometry (table only) or UnknownGeome...
static Type promoteNonPointTypesToMulti(Type type) SIP_HOLDGIL
Promotes a WKB geometry type to its multi-type equivalent, with the exception of point geometry types...
Definition: qgswkbtypes.h:451
Type
The WKB type describes the number of dimensions a geometry has.
Definition: qgswkbtypes.h:70