QGIS API Documentation 3.99.0-Master (357b655ed83)
Loading...
Searching...
No Matches
qgsalgorithmcentroid.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsalgorithmcentroid.cpp
3 ------------------------
4 begin : April 2017
5 copyright : (C) 2017 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
22#include <QString>
23
24using namespace Qt::StringLiterals;
25
27
28QString QgsCentroidAlgorithm::name() const
29{
30 return u"centroids"_s;
31}
32
33QString QgsCentroidAlgorithm::displayName() const
34{
35 return QObject::tr( "Centroids" );
36}
37
38QStringList QgsCentroidAlgorithm::tags() const
39{
40 return QObject::tr( "centroid,center,average,point,middle" ).split( ',' );
41}
42
43QString QgsCentroidAlgorithm::group() const
44{
45 return QObject::tr( "Vector geometry" );
46}
47
48QString QgsCentroidAlgorithm::groupId() const
49{
50 return u"vectorgeometry"_s;
51}
52
53QString QgsCentroidAlgorithm::outputName() const
54{
55 return QObject::tr( "Centroids" );
56}
57
58QgsFeatureSink::SinkFlags QgsCentroidAlgorithm::sinkFlags() const
59{
60 if ( mAllParts )
62 else
64}
65
66QString QgsCentroidAlgorithm::shortHelpString() const
67{
68 return QObject::tr( "This algorithm creates a new point layer with points representing the centroid of the geometries in an input layer.\n\n"
69 "The attributes associated to each point in the output layer are the same ones associated to the original features." );
70}
71
72QString QgsCentroidAlgorithm::shortDescription() const
73{
74 return QObject::tr( "Creates a new point layer with points representing the centroid of the geometries in an input layer." );
75}
76
77Qgis::ProcessingAlgorithmDocumentationFlags QgsCentroidAlgorithm::documentationFlags() const
78{
80}
81
82QgsCentroidAlgorithm *QgsCentroidAlgorithm::createInstance() const
83{
84 return new QgsCentroidAlgorithm();
85}
86
87void QgsCentroidAlgorithm::initParameters( const QVariantMap & )
88{
89 auto allParts = std::make_unique<QgsProcessingParameterBoolean>(
90 u"ALL_PARTS"_s,
91 QObject::tr( "Create centroid for each part" ),
92 false
93 );
94 allParts->setIsDynamic( true );
95 allParts->setDynamicPropertyDefinition( QgsPropertyDefinition( u"All parts"_s, QObject::tr( "Create centroid for each part" ), QgsPropertyDefinition::Boolean ) );
96 allParts->setDynamicLayerParameterName( u"INPUT"_s );
97 addParameter( allParts.release() );
98}
99
100bool QgsCentroidAlgorithm::prepareAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback * )
101{
102 mAllParts = parameterAsBoolean( parameters, u"ALL_PARTS"_s, context );
103 mDynamicAllParts = QgsProcessingParameters::isDynamic( parameters, u"ALL_PARTS"_s );
104 if ( mDynamicAllParts )
105 mAllPartsProperty = parameters.value( u"ALL_PARTS"_s ).value<QgsProperty>();
106
107 return true;
108}
109
110QgsFeatureList QgsCentroidAlgorithm::processFeature( const QgsFeature &f, QgsProcessingContext &context, QgsProcessingFeedback *feedback )
111{
112 QgsFeatureList list;
113 QgsFeature feature = f;
114 if ( feature.hasGeometry() && !feature.geometry().isEmpty() )
115 {
116 const QgsGeometry geom = feature.geometry();
117
118 bool allParts = mAllParts;
119 if ( mDynamicAllParts )
120 allParts = mAllPartsProperty.valueAsBool( context.expressionContext(), allParts );
121
122 if ( allParts && geom.isMultipart() )
123 {
124 const QgsGeometryCollection *geomCollection = static_cast<const QgsGeometryCollection *>( geom.constGet() );
125
126 const int partCount = geomCollection->partCount();
127 list.reserve( partCount );
128 for ( int i = 0; i < partCount; ++i )
129 {
130 const QgsGeometry partGeometry( geomCollection->geometryN( i )->clone() );
131 const QgsGeometry outputGeometry = partGeometry.centroid();
132 if ( outputGeometry.isNull() )
133 {
134 feedback->reportError( QObject::tr( "Error calculating centroid for feature %1 part %2: %3" ).arg( feature.id() ).arg( i ).arg( outputGeometry.lastError() ) );
135 }
136 feature.setGeometry( outputGeometry );
137 list << feature;
138 }
139 }
140 else
141 {
142 const QgsGeometry outputGeometry = feature.geometry().centroid();
143 if ( outputGeometry.isNull() )
144 {
145 feedback->reportError( QObject::tr( "Error calculating centroid for feature %1: %2" ).arg( feature.id() ).arg( outputGeometry.lastError() ) );
146 }
147 feature.setGeometry( outputGeometry );
148 list << feature;
149 }
150 }
151 else
152 {
153 list << feature;
154 }
155 return list;
156}
157
@ RegeneratesPrimaryKeyInSomeScenarios
Algorithm may drop the existing primary keys or FID values in some scenarios, depending on algorithm ...
Definition qgis.h:3691
QFlags< ProcessingAlgorithmDocumentationFlag > ProcessingAlgorithmDocumentationFlags
Flags describing algorithm behavior for documentation purposes.
Definition qgis.h:3701
virtual QgsAbstractGeometry * clone() const =0
Clones the geometry by performing a deep copy.
QFlags< SinkFlag > SinkFlags
@ RegeneratePrimaryKey
This flag indicates, that a primary key field cannot be guaranteed to be unique and the sink should i...
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
Definition qgsfeature.h:60
QgsFeatureId id
Definition qgsfeature.h:68
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.
int partCount() const override
Returns count of parts contained in the geometry.
const QgsAbstractGeometry * geometryN(int n) const
Returns a const reference to a geometry from within the collection.
A geometry is the spatial representation of a feature.
QString lastError() const
Returns an error string referring to the last error encountered either when this geometry was created...
const QgsAbstractGeometry * constGet() const
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
bool isMultipart() const
Returns true if WKB of the geometry is of WKBMulti* type.
QgsGeometry centroid() const
Returns the center of mass of a geometry.
bool isEmpty() const
Returns true if the geometry is empty (eg a linestring with no vertices, or a collection with no geom...
Contains information about the context in which a processing algorithm is executed.
QgsExpressionContext & expressionContext()
Returns the expression context.
virtual QgsFeatureSink::SinkFlags sinkFlags() const
Returns the feature sink flags to be used for the output.
Base class for providing feedback from a processing algorithm.
virtual void reportError(const QString &error, bool fatalError=false)
Reports that the algorithm encountered an error while executing.
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
@ Boolean
Boolean value.
Definition qgsproperty.h:53
A store for object properties.
QList< QgsFeature > QgsFeatureList