QGIS API Documentation 3.99.0-Master (26c88405ac0)
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
23
24QString QgsZonalMinimumMaximumPointAlgorithm::name() const
25{
26 return QStringLiteral( "zonalminmaxpoint" );
27}
28
29QString QgsZonalMinimumMaximumPointAlgorithm::displayName() const
30{
31 return QObject::tr( "Zonal minimum/maximum point" );
32}
33
34QStringList QgsZonalMinimumMaximumPointAlgorithm::tags() const
35{
36 return QObject::tr( "stats,statistics,zones,maximum,minimum,raster,extrema,extremum" ).split( ',' );
37}
38
39QString QgsZonalMinimumMaximumPointAlgorithm::group() const
40{
41 return QObject::tr( "Raster analysis" );
42}
43
44QString QgsZonalMinimumMaximumPointAlgorithm::groupId() const
45{
46 return QStringLiteral( "rasteranalysis" );
47}
48
49QString QgsZonalMinimumMaximumPointAlgorithm::shortDescription() const
50{
51 return QObject::tr( "Extracts point locations for minimum and maximum raster values within polygon zones." );
52}
53
54QString QgsZonalMinimumMaximumPointAlgorithm::shortHelpString() const
55{
56 return QObject::tr( "This algorithm extracts point features corresponding to the minimum "
57 "and maximum pixel values contained within polygon zones.\n\n"
58 "The output will contain one point feature for the minimum and one "
59 "for the maximum raster value for every individual zonal feature "
60 "from a polygon layer.\n\n"
61 "The created point layer will be in the same spatial reference system as the selected raster layer." );
62}
63
64QList<int> QgsZonalMinimumMaximumPointAlgorithm::inputLayerTypes() const
65{
66 return QList<int>() << static_cast<int>( Qgis::ProcessingSourceType::VectorPolygon );
67}
68
69QgsZonalMinimumMaximumPointAlgorithm *QgsZonalMinimumMaximumPointAlgorithm::createInstance() const
70{
71 return new QgsZonalMinimumMaximumPointAlgorithm();
72}
73
74void QgsZonalMinimumMaximumPointAlgorithm::initParameters( const QVariantMap &configuration )
75{
76 Q_UNUSED( configuration )
77 addParameter( new QgsProcessingParameterRasterLayer( QStringLiteral( "INPUT_RASTER" ), QObject::tr( "Raster layer" ) ) );
78 addParameter( new QgsProcessingParameterBand( QStringLiteral( "RASTER_BAND" ), QObject::tr( "Raster band" ), 1, QStringLiteral( "INPUT_RASTER" ) ) );
79}
80
81QString QgsZonalMinimumMaximumPointAlgorithm::outputName() const
82{
83 return QObject::tr( "Zonal Extrema" );
84}
85
86QgsFields QgsZonalMinimumMaximumPointAlgorithm::outputFields( const QgsFields &inputFields ) const
87{
88 Q_UNUSED( inputFields )
89 return mOutputFields;
90}
91
92Qgis::ProcessingSourceType QgsZonalMinimumMaximumPointAlgorithm::outputLayerType() const
93{
95}
96
97Qgis::WkbType QgsZonalMinimumMaximumPointAlgorithm::outputWkbType( Qgis::WkbType ) const
98{
100}
101
102QgsFeatureSink::SinkFlags QgsZonalMinimumMaximumPointAlgorithm::sinkFlags() const
103{
105}
106
107Qgis::ProcessingAlgorithmDocumentationFlags QgsZonalMinimumMaximumPointAlgorithm::documentationFlags() const
108{
110}
111
112QgsCoordinateReferenceSystem QgsZonalMinimumMaximumPointAlgorithm::outputCrs( const QgsCoordinateReferenceSystem & ) const
113{
114 return mCrs;
115}
116
117bool QgsZonalMinimumMaximumPointAlgorithm::prepareAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback * )
118{
119 QgsRasterLayer *rasterLayer = parameterAsRasterLayer( parameters, QStringLiteral( "INPUT_RASTER" ), context );
120 if ( !rasterLayer )
121 throw QgsProcessingException( invalidRasterError( parameters, QStringLiteral( "INPUT_RASTER" ) ) );
122
123 mBand = parameterAsInt( parameters, QStringLiteral( "RASTER_BAND" ), context );
124 if ( mBand < 1 || mBand > rasterLayer->bandCount() )
125 throw QgsProcessingException( QObject::tr( "Invalid band number for BAND (%1): Valid values for input raster are 1 to %2" ).arg( mBand ).arg( rasterLayer->bandCount() ) );
126
127 if ( !rasterLayer->dataProvider() )
128 throw QgsProcessingException( QObject::tr( "Invalid raster layer. Layer %1 is invalid." ).arg( rasterLayer->id() ) );
129
130 mRaster.reset( rasterLayer->dataProvider()->clone() );
131 mCrs = rasterLayer->crs();
132 mPixelSizeX = rasterLayer->rasterUnitsPerPixelX();
133 mPixelSizeY = rasterLayer->rasterUnitsPerPixelY();
134 std::unique_ptr<QgsFeatureSource> source( parameterAsSource( parameters, inputParameterName(), context ) );
135
136 QgsFields newFields;
137 newFields.append( QgsField( QStringLiteral( "value" ), QMetaType::Type::Double, QString(), 20, 8 ) );
138 newFields.append( QgsField( QStringLiteral( "extremum_type" ), QMetaType::Type::QString ) );
139 mOutputFields = QgsProcessingUtils::combineFields( source->fields(), newFields );
140
141 return true;
142}
143
144QgsFeatureList QgsZonalMinimumMaximumPointAlgorithm::processFeature( const QgsFeature &feature, QgsProcessingContext &context, QgsProcessingFeedback *feedback )
145{
146 if ( !mCreatedTransform )
147 {
148 mCreatedTransform = true;
149 mFeatureToRasterTransform = QgsCoordinateTransform( sourceCrs(), mCrs, context.transformContext() );
150 }
151
152 Q_UNUSED( feedback )
153 QgsAttributes attributes = feature.attributes();
154
155 QgsGeometry geometry = feature.geometry();
156 try
157 {
158 geometry.transform( mFeatureToRasterTransform );
159 }
160 catch ( QgsCsException & )
161 {
162 if ( feedback )
163 feedback->reportError( QObject::tr( "Encountered a transform error when reprojecting feature with id %1." ).arg( feature.id() ) );
164 }
165
166 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 );
167
168 QgsFeature minPointFeature( mOutputFields );
169 QgsAttributes minAttributes = attributes;
170 minAttributes << results.value( Qgis::ZonalStatistic::Min ) << QStringLiteral( "minimum" );
171 minPointFeature.setAttributes( minAttributes );
172 minPointFeature.setGeometry( QgsGeometry::fromPointXY( results.value( Qgis::ZonalStatistic::MinimumPoint ).value<QgsPointXY>() ) );
173
174 QgsFeature maxPointFeature( mOutputFields );
175 QgsAttributes maxAttributes = attributes;
176 maxAttributes << results.value( Qgis::ZonalStatistic::Max ) << QStringLiteral( "maximum" );
177 maxPointFeature.setAttributes( maxAttributes );
178 maxPointFeature.setGeometry( QgsGeometry::fromPointXY( results.value( Qgis::ZonalStatistic::MaximumPoint ).value<QgsPointXY>() ) );
179
180 return QgsFeatureList { minPointFeature, maxPointFeature };
181}
182
183bool QgsZonalMinimumMaximumPointAlgorithm::supportInPlaceEdit( const QgsMapLayer *layer ) const
184{
185 Q_UNUSED( layer )
186 return false;
187}
188
ProcessingSourceType
Processing data source types.
Definition qgis.h:3531
@ VectorPoint
Vector point layers.
Definition qgis.h:3534
@ VectorPolygon
Vector polygon layers.
Definition qgis.h:3536
@ Max
Max of pixel values.
Definition qgis.h:5770
@ MinimumPoint
Pixel centroid for minimum pixel value.
Definition qgis.h:5776
@ Min
Min of pixel values.
Definition qgis.h:5769
@ MaximumPoint
Pixel centroid for maximum pixel value.
Definition qgis.h:5777
@ RegeneratesPrimaryKey
Algorithm always drops any existing primary keys or FID values and regenerates them in outputs.
Definition qgis.h:3619
QFlags< ProcessingAlgorithmDocumentationFlag > ProcessingAlgorithmDocumentationFlags
Flags describing algorithm behavior for documentation purposes.
Definition qgis.h:3630
WkbType
The WKB type describes the number of dimensions a geometry has.
Definition qgis.h:277
@ Point
Point.
Definition qgis.h:279
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:58
QgsAttributes attributes
Definition qgsfeature.h:67
QgsFeatureId id
Definition qgsfeature.h:66
QgsGeometry geometry
Definition qgsfeature.h:69
Encapsulate a field in an attribute table or data source.
Definition qgsfield.h:54
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:73
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:80
QgsCoordinateReferenceSystem crs
Definition qgsmaplayer.h:87
QString id
Definition qgsmaplayer.h:83
Represents a 2D point.
Definition qgspointxy.h:60
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