QGIS API Documentation 4.3.0-Master (0d5b841b09e)
Loading...
Searching...
No Matches
qgsalgorithmremovepartsbyarea.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsalgorithmremovepartsbyarea.cpp
3 ---------------------
4 begin : July 2024
5 copyright : (C) 2024 by Nyall Dawson
6 email : nyall dot dawson at gmail dot com
7 ***************************************************************************/
8
9/***************************************************************************
10 * *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
15 * *
16 ***************************************************************************/
17
19
21#include "qgssurface.h"
22
23#include <QString>
24
25using namespace Qt::StringLiterals;
26
28
29QString QgsRemovePartsByAreaAlgorithm::name() const
30{
31 return u"removepartsbyarea"_s;
32}
33
34QString QgsRemovePartsByAreaAlgorithm::displayName() const
35{
36 return QObject::tr( "Remove parts by area" );
37}
38
39QStringList QgsRemovePartsByAreaAlgorithm::tags() const
40{
41 return QObject::tr( "remove,delete,drop,filter,polygon,size" ).split( ',' );
42}
43
44QString QgsRemovePartsByAreaAlgorithm::group() const
45{
46 return QObject::tr( "Vector geometry" );
47}
48
49QString QgsRemovePartsByAreaAlgorithm::groupId() const
50{
51 return u"vectorgeometry"_s;
52}
53
54QString QgsRemovePartsByAreaAlgorithm::outputName() const
55{
56 return QObject::tr( "Cleaned" );
57}
58
59QList<int> QgsRemovePartsByAreaAlgorithm::inputLayerTypes() const
60{
61 return QList<int>() << static_cast< int >( Qgis::ProcessingSourceType::VectorPolygon );
62}
63
64Qgis::ProcessingSourceType QgsRemovePartsByAreaAlgorithm::outputLayerType() const
65{
67}
68
69QString QgsRemovePartsByAreaAlgorithm::shortDescription() const
70{
71 return QObject::tr( "Removes polygons which are smaller than a specified area." );
72}
73
74QString QgsRemovePartsByAreaAlgorithm::shortHelpString() const
75{
76 return QObject::tr(
77 "This algorithm takes a polygon layer and removes polygons which are smaller than a specified area.\n\n"
78 "If the input geometry is a multipart geometry, then the parts will be filtered by their individual areas. If no parts match the "
79 "required minimum area, then the feature will be skipped and omitted from the output layer.\n\n"
80 "If the input geometry is a singlepart geometry, then the feature will be skipped if the geometry's "
81 "area is below the required size and omitted from the output layer.\n\n"
82 "The area will be calculated using Cartesian calculations in the source layer's coordinate reference system.\n\n"
83 "Attributes are not modified."
84 );
85}
86
87QgsRemovePartsByAreaAlgorithm *QgsRemovePartsByAreaAlgorithm::createInstance() const
88{
89 return new QgsRemovePartsByAreaAlgorithm();
90}
91
92Qgis::ProcessingFeatureSourceFlags QgsRemovePartsByAreaAlgorithm::sourceFlags() const
93{
94 // skip geometry checks - this algorithm can be used to repair geometries
96}
97
98void QgsRemovePartsByAreaAlgorithm::initParameters( const QVariantMap & )
99{
100 auto minArea = std::make_unique< QgsProcessingParameterArea >( u"MIN_AREA"_s, QObject::tr( "Remove parts with area less than" ), 0.0, u"INPUT"_s, false, 0 );
101 minArea->setIsDynamic( true );
102 minArea->setDynamicPropertyDefinition( QgsPropertyDefinition( u"MIN_AREA"_s, QObject::tr( "Remove parts with area less than" ), QgsPropertyDefinition::DoublePositive ) );
103 minArea->setDynamicLayerParameterName( u"INPUT"_s );
104 addParameter( minArea.release() );
105}
106
107bool QgsRemovePartsByAreaAlgorithm::prepareAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback * )
108{
109 mMinArea = parameterAsDouble( parameters, u"MIN_AREA"_s, context );
110 mDynamicMinArea = QgsProcessingParameters::isDynamic( parameters, u"MIN_AREA"_s );
111 if ( mDynamicMinArea )
112 mMinAreaProperty = parameters.value( u"MIN_AREA"_s ).value< QgsProperty >();
113
114 return true;
115}
116
117QgsFeatureList QgsRemovePartsByAreaAlgorithm::processFeature( const QgsFeature &feature, QgsProcessingContext &context, QgsProcessingFeedback * )
118{
119 QGS_MARK_ALGORITHM_SOURCE
120
121 QgsFeature f = feature;
122 if ( f.hasGeometry() )
123 {
124 double minArea = mMinArea;
125 if ( mDynamicMinArea )
126 minArea = mMinAreaProperty.valueAsDouble( context.expressionContext(), minArea );
127
128 const QgsGeometry geometry = f.geometry();
129 QgsGeometry outputGeometry;
130 if ( const QgsGeometryCollection *inputCollection = qgsgeometry_cast< const QgsGeometryCollection * >( geometry.constGet() ) )
131 {
132 std::unique_ptr< QgsGeometryCollection> filteredGeometry( inputCollection->createEmptyWithSameType() );
133 const int size = inputCollection->numGeometries();
134 filteredGeometry->reserve( size );
135 for ( int i = 0; i < size; ++i )
136 {
137 if ( const QgsSurface *surface = qgsgeometry_cast< const QgsSurface * >( inputCollection->geometryN( i ) ) )
138 {
139 if ( surface->area() >= minArea )
140 {
141 filteredGeometry->addGeometry( surface->clone() );
142 }
143 }
144 }
145 if ( filteredGeometry->numGeometries() == 0 )
146 {
147 // skip empty features
148 return {};
149 }
150 outputGeometry = QgsGeometry( std::move( filteredGeometry ) );
151 f.setGeometry( outputGeometry );
152 }
153 else if ( const QgsSurface *surface = qgsgeometry_cast< const QgsSurface * >( geometry.constGet() ) )
154 {
155 if ( surface->area() < minArea )
156 {
157 return {};
158 }
159 }
160 else
161 {
162 return {};
163 }
164 }
165 return { f };
166}
167
168
ProcessingSourceType
Processing data source types.
Definition qgis.h:3749
@ VectorPolygon
Vector polygon layers.
Definition qgis.h:3754
@ SkipGeometryValidityChecks
Invalid geometry checks should always be skipped. This flag can be useful for algorithms which always...
Definition qgis.h:3932
QFlags< ProcessingFeatureSourceFlag > ProcessingFeatureSourceFlags
Flags which control how QgsProcessingFeatureSource fetches features.
Definition qgis.h:3943
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
Definition qgsfeature.h:60
A geometry is the spatial representation of a feature.
const QgsAbstractGeometry * constGet() const
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
Contains information about the context in which a processing algorithm is executed.
QgsExpressionContext & expressionContext()
Returns the expression context.
Base class for providing feedback from a processing algorithm.
static bool isDynamic(const QVariantMap &parameters, const QString &name)
Returns true if the parameter with matching name is a dynamic parameter, and must be evaluated once f...
Definition for a property.
Definition qgsproperty.h:47
@ DoublePositive
Positive double value (including 0).
Definition qgsproperty.h:57
A store for object properties.
Surface geometry type.
Definition qgssurface.h:34
T qgsgeometry_cast(QgsAbstractGeometry *geom)
QList< QgsFeature > QgsFeatureList