QGIS API Documentation 3.99.0-Master (357b655ed83)
Loading...
Searching...
No Matches
qgsalgorithmremovepartsbylength.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsalgorithmremovepartsbylength.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
20#include "qgscurve.h"
22
23#include <QString>
24
25using namespace Qt::StringLiterals;
26
28
29QString QgsRemovePartsByLengthAlgorithm::name() const
30{
31 return u"removepartsbylength"_s;
32}
33
34QString QgsRemovePartsByLengthAlgorithm::displayName() const
35{
36 return QObject::tr( "Remove parts by length" );
37}
38
39QStringList QgsRemovePartsByLengthAlgorithm::tags() const
40{
41 return QObject::tr( "remove,delete,drop,filter,lines,linestring,polyline,size" ).split( ',' );
42}
43
44QString QgsRemovePartsByLengthAlgorithm::group() const
45{
46 return QObject::tr( "Vector geometry" );
47}
48
49QString QgsRemovePartsByLengthAlgorithm::groupId() const
50{
51 return u"vectorgeometry"_s;
52}
53
54QString QgsRemovePartsByLengthAlgorithm::outputName() const
55{
56 return QObject::tr( "Cleaned" );
57}
58
59QList<int> QgsRemovePartsByLengthAlgorithm::inputLayerTypes() const
60{
61 return QList<int>() << static_cast< int >( Qgis::ProcessingSourceType::VectorLine );
62}
63
64Qgis::ProcessingSourceType QgsRemovePartsByLengthAlgorithm::outputLayerType() const
65{
67}
68
69QString QgsRemovePartsByLengthAlgorithm::shortDescription() const
70{
71 return QObject::tr( "Removes lines which are shorter than a specified length." );
72}
73
74QString QgsRemovePartsByLengthAlgorithm::shortHelpString() const
75{
76 return QObject::tr( "This algorithm takes a line layer and removes lines which are shorter than a specified length.\n\n"
77 "If the input geometry is a multipart geometry, then the parts will be filtered by their individual lengths. If no parts match the "
78 "required minimum length, then the feature will be skipped and omitted from the output layer.\n\n"
79 "If the input geometry is a singlepart geometry, then the feature will be skipped if the geometry's "
80 "length is below the required size and omitted from the output layer.\n\n"
81 "The length will be calculated using Cartesian calculations in the source layer's coordinate reference system.\n\n"
82 "Attributes are not modified." );
83}
84
85QgsRemovePartsByLengthAlgorithm *QgsRemovePartsByLengthAlgorithm::createInstance() const
86{
87 return new QgsRemovePartsByLengthAlgorithm();
88}
89
90Qgis::ProcessingFeatureSourceFlags QgsRemovePartsByLengthAlgorithm::sourceFlags() const
91{
92 // skip geometry checks - this algorithm can be used to repair geometries
94}
95
96void QgsRemovePartsByLengthAlgorithm::initParameters( const QVariantMap & )
97{
98 auto minLength = std::make_unique< QgsProcessingParameterDistance >( u"MIN_LENGTH"_s, QObject::tr( "Remove parts with lengths less than" ), 0.0, u"INPUT"_s, false, 0 );
99 minLength->setIsDynamic( true );
100 minLength->setDynamicPropertyDefinition( QgsPropertyDefinition( u"MIN_LENGTH"_s, QObject::tr( "Remove parts with length less than" ), QgsPropertyDefinition::DoublePositive ) );
101 minLength->setDynamicLayerParameterName( u"INPUT"_s );
102 addParameter( minLength.release() );
103}
104
105bool QgsRemovePartsByLengthAlgorithm::prepareAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback * )
106{
107 mMinLength = parameterAsDouble( parameters, u"MIN_LENGTH"_s, context );
108 mDynamicMinLength = QgsProcessingParameters::isDynamic( parameters, u"MIN_LENGTH"_s );
109 if ( mDynamicMinLength )
110 mMinLengthProperty = parameters.value( u"MIN_LENGTH"_s ).value< QgsProperty >();
111
112 return true;
113}
114
115QgsFeatureList QgsRemovePartsByLengthAlgorithm::processFeature( const QgsFeature &feature, QgsProcessingContext &context, QgsProcessingFeedback * )
116{
117 QgsFeature f = feature;
118 if ( f.hasGeometry() )
119 {
120 double minLength = mMinLength;
121 if ( mDynamicMinLength )
122 minLength = mMinLengthProperty.valueAsDouble( context.expressionContext(), minLength );
123
124 const QgsGeometry geometry = f.geometry();
125 QgsGeometry outputGeometry;
126 if ( const QgsGeometryCollection *inputCollection = qgsgeometry_cast< const QgsGeometryCollection * >( geometry.constGet() ) )
127 {
128 std::unique_ptr< QgsGeometryCollection > filteredGeometry( inputCollection->createEmptyWithSameType() );
129 const int size = inputCollection->numGeometries();
130 filteredGeometry->reserve( size );
131 for ( int i = 0; i < size; ++i )
132 {
133 if ( const QgsCurve *curve = qgsgeometry_cast< const QgsCurve * >( inputCollection->geometryN( i ) ) )
134 {
135 if ( curve->length() >= minLength )
136 {
137 filteredGeometry->addGeometry( curve->clone() );
138 }
139 }
140 }
141 if ( filteredGeometry->numGeometries() == 0 )
142 {
143 // skip empty features
144 return {};
145 }
146 outputGeometry = QgsGeometry( std::move( filteredGeometry ) );
147 f.setGeometry( outputGeometry );
148 }
149 else if ( const QgsCurve *curve = qgsgeometry_cast< const QgsCurve * >( geometry.constGet() ) )
150 {
151 if ( curve->length() < minLength )
152 {
153 return {};
154 }
155 }
156 else
157 {
158 return {};
159 }
160 }
161 return { f };
162}
163
164
ProcessingSourceType
Processing data source types.
Definition qgis.h:3602
@ VectorLine
Vector line layers.
Definition qgis.h:3606
@ SkipGeometryValidityChecks
Invalid geometry checks should always be skipped. This flag can be useful for algorithms which always...
Definition qgis.h:3782
QFlags< ProcessingFeatureSourceFlag > ProcessingFeatureSourceFlags
Flags which control how QgsProcessingFeatureSource fetches features.
Definition qgis.h:3793
Abstract base class for curved geometry type.
Definition qgscurve.h:36
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
Definition qgsfeature.h:60
QgsGeometry geometry
Definition qgsfeature.h:71
bool hasGeometry() const
Returns true if the feature has an associated geometry.
void setGeometry(const QgsGeometry &geometry)
Set the feature's geometry.
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:58
A store for object properties.
T qgsgeometry_cast(QgsAbstractGeometry *geom)
QList< QgsFeature > QgsFeatureList