QGIS API Documentation  3.14.0-Pi (9f7028fd23)
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 QString QgsDifferenceAlgorithm::group() const
35 {
36  return QObject::tr( "Vector overlay" );
37 }
38 
39 QString QgsDifferenceAlgorithm::groupId() const
40 {
41  return QStringLiteral( "vectoroverlay" );
42 }
43 
44 QString QgsDifferenceAlgorithm::shortHelpString() const
45 {
46  return QObject::tr( "This algorithm extracts features from the Input layer that fall outside, or partially overlap, features in the Overlay layer. "
47  "Input layer features that partially overlap feature(s) in the Overlay layer are split along those features' boundary "
48  "and only the portions outside the Overlay layer features are retained." )
49  + QStringLiteral( "\n\n" )
50  + QObject::tr( "Attributes are not modified, although properties such as area or length of the features will "
51  "be modified by the difference operation. If such properties are stored as attributes, those attributes will have to "
52  "be manually updated." );
53 }
54 
55 bool QgsDifferenceAlgorithm::supportInPlaceEdit( const QgsMapLayer *l ) const
56 {
57  const QgsVectorLayer *layer = qobject_cast< const QgsVectorLayer * >( l );
58  if ( !layer )
59  return false;
60 
61  return layer->isSpatial();
62 }
63 
64 QgsProcessingAlgorithm::Flags QgsDifferenceAlgorithm::flags() const
65 {
68  return f;
69 }
70 
71 QgsProcessingAlgorithm *QgsDifferenceAlgorithm::createInstance() const
72 {
73  return new QgsDifferenceAlgorithm();
74 }
75 
76 void QgsDifferenceAlgorithm::initAlgorithm( const QVariantMap & )
77 {
78  addParameter( new QgsProcessingParameterFeatureSource( QStringLiteral( "INPUT" ), QObject::tr( "Input layer" ) ) );
79  addParameter( new QgsProcessingParameterFeatureSource( QStringLiteral( "OVERLAY" ), QObject::tr( "Overlay layer" ) ) );
80  addParameter( new QgsProcessingParameterFeatureSink( QStringLiteral( "OUTPUT" ), QObject::tr( "Difference" ) ) );
81 }
82 
83 
84 QVariantMap QgsDifferenceAlgorithm::processAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback )
85 {
86  std::unique_ptr< QgsFeatureSource > sourceA( parameterAsSource( parameters, QStringLiteral( "INPUT" ), context ) );
87  if ( !sourceA )
88  throw QgsProcessingException( invalidSourceError( parameters, QStringLiteral( "INPUT" ) ) );
89 
90  std::unique_ptr< QgsFeatureSource > sourceB( parameterAsSource( parameters, QStringLiteral( "OVERLAY" ), context ) );
91  if ( !sourceB )
92  throw QgsProcessingException( invalidSourceError( parameters, QStringLiteral( "OVERLAY" ) ) );
93 
94  QgsWkbTypes::Type geomType = QgsWkbTypes::multiType( sourceA->wkbType() );
95 
96  QString dest;
97  std::unique_ptr< QgsFeatureSink > sink( parameterAsSink( parameters, QStringLiteral( "OUTPUT" ), context, dest, sourceA->fields(), geomType, sourceA->sourceCrs() ) );
98  if ( !sink )
99  throw QgsProcessingException( invalidSinkError( parameters, QStringLiteral( "OUTPUT" ) ) );
100 
101  QVariantMap outputs;
102  outputs.insert( QStringLiteral( "OUTPUT" ), dest );
103 
104  int count = 0;
105  int total = sourceA->featureCount();
106  QgsOverlayUtils::difference( *sourceA, *sourceB, *sink, context, feedback, count, total, QgsOverlayUtils::OutputA );
107 
108  return outputs;
109 }
110 
QgsWkbTypes::multiType
static Type multiType(Type type)
Returns the multi type for a WKB type.
Definition: qgswkbtypes.h:301
QgsProcessingFeedback
Definition: qgsprocessingfeedback.h:37
QgsVectorLayer::isSpatial
bool isSpatial() const FINAL
Returns true if this is a geometry layer and false in case of NoGeometry (table only) or UnknownGeome...
Definition: qgsvectorlayer.cpp:3591
QgsProcessingParameterFeatureSource
Definition: qgsprocessingparameters.h:2612
QgsWkbTypes::Type
Type
The WKB type describes the number of dimensions a geometry has.
Definition: qgswkbtypes.h:68
QgsProcessingParameterFeatureSink
Definition: qgsprocessingparameters.h:2773
qgsalgorithmdifference.h
QgsProcessingContext
Definition: qgsprocessingcontext.h:43
qgsvectorlayer.h
QgsProcessingAlgorithm
Definition: qgsprocessingalgorithm.h:51
QgsVectorLayer
Definition: qgsvectorlayer.h:385
QgsMapLayer
Definition: qgsmaplayer.h:81
qgsoverlayutils.h
QgsProcessingAlgorithm::flags
virtual Flags flags() const
Returns the flags indicating how and when the algorithm operates and should be exposed to users.
Definition: qgsprocessingalgorithm.cpp:88
QgsProcessingException
Definition: qgsexception.h:82
QgsProcessingAlgorithm::FlagSupportsInPlaceEdits
@ FlagSupportsInPlaceEdits
Algorithm supports in-place editing.
Definition: qgsprocessingalgorithm.h:77