QGIS API Documentation 4.1.0-Master (5bf3c20f3c9)
Loading...
Searching...
No Matches
qgsalgorithmconcavehullbyfeature.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsalgorithmconcavehullbyfeature.cpp
3 ---------------------
4 begin : May 2025
5 copyright : (C) 2025 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 QgsConcaveHullByFeatureAlgorithm::name() const
29{
30 return u"concavehullbyfeature"_s;
31}
32
33QString QgsConcaveHullByFeatureAlgorithm::displayName() const
34{
35 return QObject::tr( "Concave hull (by feature)" );
36}
37
38QStringList QgsConcaveHullByFeatureAlgorithm::tags() const
39{
40 return QObject::tr( "concave,hull,bounds,bounding,convex" ).split( ',' );
41}
42
43QString QgsConcaveHullByFeatureAlgorithm::group() const
44{
45 return QObject::tr( "Vector geometry" );
46}
47
48QString QgsConcaveHullByFeatureAlgorithm::groupId() const
49{
50 return u"vectorgeometry"_s;
51}
52
53QString QgsConcaveHullByFeatureAlgorithm::outputName() const
54{
55 return QObject::tr( "Concave hulls" );
56}
57
58QString QgsConcaveHullByFeatureAlgorithm::shortHelpString() const
59{
60 return QObject::tr( "This algorithm calculates the concave hull for each feature in an input layer." )
61 + u"\n\n"_s
62 + QObject::tr( "A concave hull is a polygon which contains all the points of the input geometries, but is a better approximation than the convex hull to the area occupied by the input." )
63 + u"\n\n"_s
64 + QObject::tr( "It is frequently used to convert a multi-point into a polygonal area which contains all the points from the input geometry." )
65 + u"\n\n"_s
66 + QObject::tr( "See the 'Concave hull (by layer)' algorithm for a concave hull calculation which covers the whole layer or grouped subsets of features." );
67}
68
69QString QgsConcaveHullByFeatureAlgorithm::shortDescription() const
70{
71 return QObject::tr( "Calculates the concave hull for each feature in an input layer." );
72}
73
74QgsConcaveHullByFeatureAlgorithm *QgsConcaveHullByFeatureAlgorithm::createInstance() const
75{
76 return new QgsConcaveHullByFeatureAlgorithm();
77}
78
79void QgsConcaveHullByFeatureAlgorithm::initParameters( const QVariantMap & )
80{
81 addParameter( new QgsProcessingParameterNumber( u"ALPHA"_s, QObject::tr( "Threshold (0-1, where 1 is equivalent with Convex Hull)" ), Qgis::ProcessingNumberParameterType::Double, 0.3, false, 0, 1 ) );
82 addParameter( new QgsProcessingParameterBoolean( u"HOLES"_s, QObject::tr( "Allow holes" ), true ) );
83}
84
85QList<int> QgsConcaveHullByFeatureAlgorithm::inputLayerTypes() const
86{
87 return QList<int>() << static_cast<int>( Qgis::ProcessingSourceType::VectorPoint );
88}
89
90QgsFields QgsConcaveHullByFeatureAlgorithm::outputFields( const QgsFields &inputFields ) const
91{
92 QgsFields newFields;
93 newFields.append( QgsField( u"area"_s, QMetaType::Type::Double, QString(), 20, 6 ) );
94 newFields.append( QgsField( u"perimeter"_s, QMetaType::Type::Double, QString(), 20, 6 ) );
95 return QgsProcessingUtils::combineFields( inputFields, newFields );
96}
97
98bool QgsConcaveHullByFeatureAlgorithm::prepareAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback * )
99{
100#if GEOS_VERSION_MAJOR == 3 && GEOS_VERSION_MINOR < 11
101 throw QgsProcessingException( QObject::tr( "This algorithm requires a QGIS build based on GEOS 3.11 or later" ) );
102#endif
103 mPercentage = parameterAsDouble( parameters, u"ALPHA"_s, context );
104 mAllowHoles = parameterAsBool( parameters, u"HOLES"_s, context );
105 return true;
106}
107
108QgsFeatureList QgsConcaveHullByFeatureAlgorithm::processFeature( const QgsFeature &feature, QgsProcessingContext &, QgsProcessingFeedback *feedback )
109{
110 QgsFeature f = feature;
111 if ( f.hasGeometry() )
112 {
113 QgsGeometry outputGeometry;
114 const QgsAbstractGeometry *inputGeometry = f.geometry().constGet();
116 if ( !collection || collection->numGeometries() == 1 )
117 {
118 feedback->reportError( QObject::tr( "Cannot calculate convex hull for a single point feature (%1) (try 'Concave hull (by layer)' algorithm instead)." ).arg( f.id() ) );
119 f.clearGeometry();
120 }
121 else
122 {
123 outputGeometry = f.geometry().concaveHull( mPercentage, mAllowHoles );
124 if ( outputGeometry.isNull() && !outputGeometry.lastError().isEmpty() )
125 feedback->reportError( outputGeometry.lastError() );
126 f.setGeometry( outputGeometry );
127 }
128 if ( outputGeometry.type() == Qgis::GeometryType::Polygon )
129 {
130 QgsAttributes attrs = f.attributes();
131 attrs << outputGeometry.constGet()->area() << outputGeometry.constGet()->perimeter();
132 f.setAttributes( attrs );
133 }
134 else
135 {
136 if ( outputGeometry.type() == Qgis::GeometryType::Line )
137 {
138 feedback->pushWarning( QObject::tr( "Concave hull for feature %1 resulted in a linestring, ignoring" ).arg( f.id() ) );
139 }
140 else if ( outputGeometry.type() == Qgis::GeometryType::Point )
141 {
142 feedback->pushWarning( QObject::tr( "Concave hull for feature %1 resulted in a point, ignoring" ).arg( f.id() ) );
143 }
144 QgsAttributes attrs = f.attributes();
145 attrs << QVariant() << QVariant();
146 f.setAttributes( attrs );
147 }
148 }
149 return QgsFeatureList() << f;
150}
151
@ VectorPoint
Vector point layers.
Definition qgis.h:3648
@ Point
Points.
Definition qgis.h:380
@ Line
Lines.
Definition qgis.h:381
@ Polygon
Polygons.
Definition qgis.h:382
@ Double
Double/float values.
Definition qgis.h:3921
Abstract base class for all geometries.
virtual double perimeter() const
Returns the planar, 2-dimensional perimeter of the geometry.
virtual double area() const
Returns the planar, 2-dimensional area of the geometry.
A vector of attributes.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
Definition qgsfeature.h:60
QgsAttributes attributes
Definition qgsfeature.h:69
QgsFeatureId id
Definition qgsfeature.h:68
void setAttributes(const QgsAttributes &attrs)
Sets the feature's attributes.
QgsGeometry geometry
Definition qgsfeature.h:71
void clearGeometry()
Removes any geometry associated with the feature.
bool hasGeometry() const
Returns true if the feature has an associated geometry.
void setGeometry(const QgsGeometry &geometry)
Set the feature's geometry.
Encapsulate a field in an attribute table or data source.
Definition qgsfield.h:56
Container of fields for a vector layer.
Definition qgsfields.h:46
bool append(const QgsField &field, Qgis::FieldOrigin origin=Qgis::FieldOrigin::Provider, int originIndex=-1)
Appends a field.
Definition qgsfields.cpp:75
int numGeometries() const
Returns the number of geometries 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.
Qgis::GeometryType type
QgsGeometry concaveHull(double targetPercent, bool allowHoles=false) const
Returns a possibly concave polygon that contains all the points in the geometry.
Contains information about the context in which a processing algorithm is executed.
Custom exception class for processing related exceptions.
Base class for providing feedback from a processing algorithm.
virtual void pushWarning(const QString &warning)
Pushes a warning informational message from the algorithm.
virtual void reportError(const QString &error, bool fatalError=false)
Reports that the algorithm encountered an error while executing.
A boolean parameter for processing algorithms.
A numeric parameter for processing algorithms.
static QgsFields combineFields(const QgsFields &fieldsA, const QgsFields &fieldsB, const QString &fieldsBPrefix=QString())
Combines two field lists, avoiding duplicate field names (in a case-insensitive manner).
T qgsgeometry_cast(QgsAbstractGeometry *geom)
QList< QgsFeature > QgsFeatureList