QGIS API Documentation 3.99.0-Master (09f76ad7019)
Loading...
Searching...
No Matches
qgsalgorithmzonalminmaxpoint.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsalgorithmzonalminmaxpoint.cpp
3 ------------------------------
4 begin : November 2024
5 copyright : (C) 2024 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 "qgszonalstatistics.h"
21
22#include <QString>
23
24using namespace Qt::StringLiterals;
25
27
28QString QgsZonalMinimumMaximumPointAlgorithm::name() const
29{
30 return u"zonalminmaxpoint"_s;
31}
32
33QString QgsZonalMinimumMaximumPointAlgorithm::displayName() const
34{
35 return QObject::tr( "Zonal minimum/maximum point" );
36}
37
38QStringList QgsZonalMinimumMaximumPointAlgorithm::tags() const
39{
40 return QObject::tr( "stats,statistics,zones,maximum,minimum,raster,extrema,extremum" ).split( ',' );
41}
42
43QString QgsZonalMinimumMaximumPointAlgorithm::group() const
44{
45 return QObject::tr( "Raster analysis" );
46}
47
48QString QgsZonalMinimumMaximumPointAlgorithm::groupId() const
49{
50 return u"rasteranalysis"_s;
51}
52
53QString QgsZonalMinimumMaximumPointAlgorithm::shortDescription() const
54{
55 return QObject::tr( "Extracts point locations for minimum and maximum raster values within polygon zones." );
56}
57
58QString QgsZonalMinimumMaximumPointAlgorithm::shortHelpString() const
59{
60 return QObject::tr( "This algorithm extracts point features corresponding to the minimum "
61 "and maximum pixel values contained within polygon zones.\n\n"
62 "The output will contain one point feature for the minimum and one "
63 "for the maximum raster value for every individual zonal feature "
64 "from a polygon layer.\n\n"
65 "The created point layer will be in the same spatial reference system as the selected raster layer." );
66}
67
68QList<int> QgsZonalMinimumMaximumPointAlgorithm::inputLayerTypes() const
69{
70 return QList<int>() << static_cast<int>( Qgis::ProcessingSourceType::VectorPolygon );
71}
72
73QgsZonalMinimumMaximumPointAlgorithm *QgsZonalMinimumMaximumPointAlgorithm::createInstance() const
74{
75 return new QgsZonalMinimumMaximumPointAlgorithm();
76}
77
78void QgsZonalMinimumMaximumPointAlgorithm::initParameters( const QVariantMap &configuration )
79{
80 Q_UNUSED( configuration )
81 addParameter( new QgsProcessingParameterRasterLayer( u"INPUT_RASTER"_s, QObject::tr( "Raster layer" ) ) );
82 addParameter( new QgsProcessingParameterBand( u"RASTER_BAND"_s, QObject::tr( "Raster band" ), 1, u"INPUT_RASTER"_s ) );
83}
84
85QString QgsZonalMinimumMaximumPointAlgorithm::outputName() const
86{
87 return QObject::tr( "Zonal Extrema" );
88}
89
90QgsFields QgsZonalMinimumMaximumPointAlgorithm::outputFields( const QgsFields &inputFields ) const
91{
92 Q_UNUSED( inputFields )
93 return mOutputFields;
94}
95
96Qgis::ProcessingSourceType QgsZonalMinimumMaximumPointAlgorithm::outputLayerType() const
97{
99}
100
101Qgis::WkbType QgsZonalMinimumMaximumPointAlgorithm::outputWkbType( Qgis::WkbType ) const
102{
104}
105
106QgsFeatureSink::SinkFlags QgsZonalMinimumMaximumPointAlgorithm::sinkFlags() const
107{
109}
110
111Qgis::ProcessingAlgorithmDocumentationFlags QgsZonalMinimumMaximumPointAlgorithm::documentationFlags() const
112{
114}
115
116QgsCoordinateReferenceSystem QgsZonalMinimumMaximumPointAlgorithm::outputCrs( const QgsCoordinateReferenceSystem & ) const
117{
118 return mCrs;
119}
120
121bool QgsZonalMinimumMaximumPointAlgorithm::prepareAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback * )
122{
123 QgsRasterLayer *rasterLayer = parameterAsRasterLayer( parameters, u"INPUT_RASTER"_s, context );
124 if ( !rasterLayer )
125 throw QgsProcessingException( invalidRasterError( parameters, u"INPUT_RASTER"_s ) );
126
127 mBand = parameterAsInt( parameters, u"RASTER_BAND"_s, context );
128 if ( mBand < 1 || mBand > rasterLayer->bandCount() )
129 throw QgsProcessingException( QObject::tr( "Invalid band number for BAND (%1): Valid values for input raster are 1 to %2" ).arg( mBand ).arg( rasterLayer->bandCount() ) );
130
131 if ( !rasterLayer->dataProvider() )
132 throw QgsProcessingException( QObject::tr( "Invalid raster layer. Layer %1 is invalid." ).arg( rasterLayer->id() ) );
133
134 mRaster.reset( rasterLayer->dataProvider()->clone() );
135 mCrs = rasterLayer->crs();
136 mPixelSizeX = rasterLayer->rasterUnitsPerPixelX();
137 mPixelSizeY = rasterLayer->rasterUnitsPerPixelY();
138 std::unique_ptr<QgsFeatureSource> source( parameterAsSource( parameters, inputParameterName(), context ) );
139
140 QgsFields newFields;
141 newFields.append( QgsField( u"value"_s, QMetaType::Type::Double, QString(), 20, 8 ) );
142 newFields.append( QgsField( u"extremum_type"_s, QMetaType::Type::QString ) );
143 mOutputFields = QgsProcessingUtils::combineFields( source->fields(), newFields );
144
145 return true;
146}
147
148QgsFeatureList QgsZonalMinimumMaximumPointAlgorithm::processFeature( const QgsFeature &feature, QgsProcessingContext &context, QgsProcessingFeedback *feedback )
149{
150 if ( !mCreatedTransform )
151 {
152 mCreatedTransform = true;
153 mFeatureToRasterTransform = QgsCoordinateTransform( sourceCrs(), mCrs, context.transformContext() );
154 }
155
156 Q_UNUSED( feedback )
157 QgsAttributes attributes = feature.attributes();
158
159 QgsGeometry geometry = feature.geometry();
160 try
161 {
162 geometry.transform( mFeatureToRasterTransform );
163 }
164 catch ( QgsCsException & )
165 {
166 if ( feedback )
167 feedback->reportError( QObject::tr( "Encountered a transform error when reprojecting feature with id %1." ).arg( feature.id() ) );
168 }
169
170 const QMap<Qgis::ZonalStatistic, QVariant> results = QgsZonalStatistics::calculateStatistics( mRaster.get(), geometry, mPixelSizeX, mPixelSizeY, mBand, Qgis::ZonalStatistic::Min | Qgis::ZonalStatistic::MinimumPoint | Qgis::ZonalStatistic::Max | Qgis::ZonalStatistic::MaximumPoint );
171
172 QgsFeature minPointFeature( mOutputFields );
173 QgsAttributes minAttributes = attributes;
174 minAttributes << results.value( Qgis::ZonalStatistic::Min ) << u"minimum"_s;
175 minPointFeature.setAttributes( minAttributes );
176 minPointFeature.setGeometry( QgsGeometry::fromPointXY( results.value( Qgis::ZonalStatistic::MinimumPoint ).value<QgsPointXY>() ) );
177
178 QgsFeature maxPointFeature( mOutputFields );
179 QgsAttributes maxAttributes = attributes;
180 maxAttributes << results.value( Qgis::ZonalStatistic::Max ) << u"maximum"_s;
181 maxPointFeature.setAttributes( maxAttributes );
182 maxPointFeature.setGeometry( QgsGeometry::fromPointXY( results.value( Qgis::ZonalStatistic::MaximumPoint ).value<QgsPointXY>() ) );
183
184 return QgsFeatureList { minPointFeature, maxPointFeature };
185}
186
187bool QgsZonalMinimumMaximumPointAlgorithm::supportInPlaceEdit( const QgsMapLayer *layer ) const
188{
189 Q_UNUSED( layer )
190 return false;
191}
192
ProcessingSourceType
Processing data source types.
Definition qgis.h:3602
@ VectorPoint
Vector point layers.
Definition qgis.h:3605
@ VectorPolygon
Vector polygon layers.
Definition qgis.h:3607
@ Max
Max of pixel values.
Definition qgis.h:6071
@ MinimumPoint
Pixel centroid for minimum pixel value.
Definition qgis.h:6077
@ Min
Min of pixel values.
Definition qgis.h:6070
@ MaximumPoint
Pixel centroid for maximum pixel value.
Definition qgis.h:6078
@ RegeneratesPrimaryKey
Algorithm always drops any existing primary keys or FID values and regenerates them in outputs.
Definition qgis.h:3690
QFlags< ProcessingAlgorithmDocumentationFlag > ProcessingAlgorithmDocumentationFlags
Flags describing algorithm behavior for documentation purposes.
Definition qgis.h:3701
WkbType
The WKB type describes the number of dimensions a geometry has.
Definition qgis.h:280
@ Point
Point.
Definition qgis.h:282
A vector of attributes.
Represents a coordinate reference system (CRS).
Handles coordinate transforms between two coordinate systems.
Custom exception class for Coordinate Reference System related exceptions.
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
QgsAttributes attributes
Definition qgsfeature.h:69
QgsFeatureId id
Definition qgsfeature.h:68
QgsGeometry geometry
Definition qgsfeature.h:71
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:76
A geometry is the spatial representation of a feature.
Qgis::GeometryOperationResult transform(const QgsCoordinateTransform &ct, Qgis::TransformDirection direction=Qgis::TransformDirection::Forward, bool transformZ=false)
Transforms this geometry as described by the coordinate transform ct.
static QgsGeometry fromPointXY(const QgsPointXY &point)
Creates a new geometry from a QgsPointXY object.
Base class for all map layer types.
Definition qgsmaplayer.h:83
QgsCoordinateReferenceSystem crs
Definition qgsmaplayer.h:90
QString id
Definition qgsmaplayer.h:86
Represents a 2D point.
Definition qgspointxy.h:62
Contains information about the context in which a processing algorithm is executed.
QgsCoordinateTransformContext transformContext() const
Returns the coordinate transform context.
Custom exception class for processing related exceptions.
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.
A raster band parameter for Processing algorithms.
A raster layer 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).
QgsRasterDataProvider * clone() const override=0
Clone itself, create deep copy.
Represents a raster layer.
int bandCount() const
Returns the number of bands in this layer.
double rasterUnitsPerPixelX() const
Returns the number of raster units per each raster pixel in X axis.
QgsRasterDataProvider * dataProvider() override
Returns the source data provider.
double rasterUnitsPerPixelY() const
Returns the number of raster units per each raster pixel in Y axis.
Qgis::ZonalStatisticResult calculateStatistics(QgsFeedback *feedback)
Runs the calculation.
QList< QgsFeature > QgsFeatureList