QGIS API Documentation 3.28.0-Firenze (ed3ad0430f)
qgsalgorithmpoleofinaccessibility.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsalgorithmpoleofinaccessibility.cpp
3 ---------------------
4 begin : December 2019
5 copyright : (C) 2019 by Alexander Bruy
6 email : alexander dot bruy 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#include "qgsapplication.h"
20
22
23QString QgsPoleOfInaccessibilityAlgorithm::name() const
24{
25 return QStringLiteral( "poleofinaccessibility" );
26}
27
28QString QgsPoleOfInaccessibilityAlgorithm::displayName() const
29{
30 return QObject::tr( "Pole of inaccessibility" );
31}
32
33QStringList QgsPoleOfInaccessibilityAlgorithm::tags() const
34{
35 return QObject::tr( "furthest,point,distant,extreme,maximum,centroid,center,centre" ).split( ',' );
36}
37
38QString QgsPoleOfInaccessibilityAlgorithm::group() const
39{
40 return QObject::tr( "Vector geometry" );
41}
42
43QString QgsPoleOfInaccessibilityAlgorithm::groupId() const
44{
45 return QStringLiteral( "vectorgeometry" );
46}
47
48QString QgsPoleOfInaccessibilityAlgorithm::shortHelpString() const
49{
50 return QObject::tr( "This algorithm calculates the pole of inaccessibility for a polygon layer, which is the most "
51 "distant internal point from the boundary of the surface. This algorithm uses the 'polylabel' "
52 "algorithm (Vladimir Agafonkin, 2016), which is an iterative approach guaranteed to find the "
53 "true pole of inaccessibility within a specified tolerance (in layer units). More precise "
54 "tolerances require more iterations and will take longer to calculate." )
55 + QStringLiteral( "\n\n" )
56 + QObject::tr( "The distance from the calculated pole to the polygon boundary will be stored as a new "
57 "attribute in the output layer." );
58}
59
60QString QgsPoleOfInaccessibilityAlgorithm::svgIconPath() const
61{
62 return QgsApplication::iconPath( QStringLiteral( "/algorithms/mAlgorithmCentroids.svg" ) );
63}
64
65QIcon QgsPoleOfInaccessibilityAlgorithm::icon() const
66{
67 return QgsApplication::getThemeIcon( QStringLiteral( "/algorithms/mAlgorithmCentroids.svg" ) );
68}
69
70QString QgsPoleOfInaccessibilityAlgorithm::outputName() const
71{
72 return QObject::tr( "Point" );
73}
74
75QList<int> QgsPoleOfInaccessibilityAlgorithm::inputLayerTypes() const
76{
77 return QList<int>() << QgsProcessing::TypeVectorPolygon;
78}
79
80QgsProcessing::SourceType QgsPoleOfInaccessibilityAlgorithm::outputLayerType() const
81{
83}
84
85QgsWkbTypes::Type QgsPoleOfInaccessibilityAlgorithm::outputWkbType( QgsWkbTypes::Type inputWkbType ) const
86{
87 Q_UNUSED( inputWkbType );
88
89 return QgsWkbTypes::Point;
90}
91
92QgsFields QgsPoleOfInaccessibilityAlgorithm::outputFields( const QgsFields &inputFields ) const
93{
94 QgsFields outputFields = inputFields;
95 outputFields.append( QgsField( QStringLiteral( "dist_pole" ), QVariant::Double ) );
96
97 return outputFields;
98}
99
100QgsPoleOfInaccessibilityAlgorithm *QgsPoleOfInaccessibilityAlgorithm::createInstance() const
101{
102 return new QgsPoleOfInaccessibilityAlgorithm();
103}
104
105void QgsPoleOfInaccessibilityAlgorithm::initParameters( const QVariantMap & )
106{
107 auto toleranceParam = std::make_unique < QgsProcessingParameterDistance >( QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), 1.0, QStringLiteral( "INPUT" ), 0.0 );
108 toleranceParam->setIsDynamic( true );
109 toleranceParam->setDynamicPropertyDefinition( QgsPropertyDefinition( QStringLiteral( "Tolerance" ), QObject::tr( "Tolerance" ), QgsPropertyDefinition::Double ) );
110 toleranceParam->setDynamicLayerParameterName( QStringLiteral( "INPUT" ) );
111 addParameter( toleranceParam.release() );
112}
113
114bool QgsPoleOfInaccessibilityAlgorithm::prepareAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback * )
115{
116 mTolerance = parameterAsDouble( parameters, QStringLiteral( "TOLERANCE" ), context );
117 mDynamicTolerance = QgsProcessingParameters::isDynamic( parameters, QStringLiteral( "TOLERANCE" ) );
118 if ( mDynamicTolerance )
119 mToleranceProperty = parameters.value( QStringLiteral( "TOLERANCE" ) ).value< QgsProperty >();
120
121 return true;
122}
123
124QgsFeatureList QgsPoleOfInaccessibilityAlgorithm::processFeature( const QgsFeature &feature, QgsProcessingContext &context, QgsProcessingFeedback * )
125{
126 QgsFeature outFeature = feature;
127 if ( outFeature.hasGeometry() )
128 {
129 double tolerance = mTolerance;
130 if ( mDynamicTolerance )
131 tolerance = mToleranceProperty.valueAsDouble( context.expressionContext(), tolerance );
132
133 double distance;
134 const QgsGeometry outputGeom = outFeature.geometry().poleOfInaccessibility( tolerance, &distance );
135 if ( outputGeom.isNull() )
136 {
137 throw QgsProcessingException( QObject::tr( "Error calculating pole of inaccessibility" ) );
138 }
139 QgsAttributes attrs = outFeature.attributes();
140 attrs.append( distance );
141 outFeature.setAttributes( attrs );
142 outFeature.setGeometry( outputGeom );
143 }
144 else
145 {
146 QgsAttributes attrs = outFeature.attributes();
147 attrs.append( QVariant() );
148 outFeature.setAttributes( attrs );
149 }
150
151 return QgsFeatureList() << outFeature;
152}
153
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
static QString iconPath(const QString &iconFile)
Returns path to the desired icon file.
A vector of attributes.
Definition: qgsattributes.h:59
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
Definition: qgsfeature.h:56
QgsAttributes attributes
Definition: qgsfeature.h:65
void setAttributes(const QgsAttributes &attrs)
Sets the feature's attributes.
Definition: qgsfeature.cpp:160
QgsGeometry geometry
Definition: qgsfeature.h:67
bool hasGeometry() const
Returns true if the feature has an associated geometry.
Definition: qgsfeature.cpp:233
void setGeometry(const QgsGeometry &geometry)
Set the feature's geometry.
Definition: qgsfeature.cpp:170
Encapsulate a field in an attribute table or data source.
Definition: qgsfield.h:51
Container of fields for a vector layer.
Definition: qgsfields.h:45
bool append(const QgsField &field, FieldOrigin origin=OriginProvider, int originIndex=-1)
Appends a field. The field must have unique name, otherwise it is rejected (returns false)
Definition: qgsfields.cpp:59
A geometry is the spatial representation of a feature.
Definition: qgsgeometry.h:164
QgsGeometry poleOfInaccessibility(double precision, double *distanceToBoundary=nullptr) const
Calculates the approximate pole of inaccessibility for a surface, which is the most distant internal ...
Q_GADGET bool isNull
Definition: qgsgeometry.h:166
Contains information about the context in which a processing algorithm is executed.
QgsExpressionContext & expressionContext()
Returns the expression context.
Custom exception class for processing related exceptions.
Definition: qgsexception.h:83
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...
SourceType
Data source types enum.
Definition: qgsprocessing.h:46
@ TypeVectorPolygon
Vector polygon layers.
Definition: qgsprocessing.h:51
@ TypeVectorPoint
Vector point layers.
Definition: qgsprocessing.h:49
Definition for a property.
Definition: qgsproperty.h:46
@ Double
Double value (including negative values)
Definition: qgsproperty.h:56
A store for object properties.
Definition: qgsproperty.h:230
Type
The WKB type describes the number of dimensions a geometry has.
Definition: qgswkbtypes.h:70
QList< QgsFeature > QgsFeatureList
Definition: qgsfeature.h:922