QGIS API Documentation 3.41.0-Master (af5edcb665c)
Loading...
Searching...
No Matches
qgsalgorithmzonalstatistics.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsalgorithmzonalstatistics.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 "qgszonalstatistics.h"
20#include "qgsvectorlayer.h"
22
24
25QString QgsZonalStatisticsAlgorithm::name() const
26{
27 return QStringLiteral( "zonalstatistics" );
28}
29
30QString QgsZonalStatisticsAlgorithm::displayName() const
31{
32 return QObject::tr( "Zonal statistics (in place)" );
33}
34
35QStringList QgsZonalStatisticsAlgorithm::tags() const
36{
37 return QObject::tr( "stats,statistics,zones,layer,sum,maximum,minimum,mean,count,standard,deviation,"
38 "median,range,majority,minority,variety,variance,summary,raster" )
39 .split( ',' );
40}
41
42QString QgsZonalStatisticsAlgorithm::group() const
43{
44 return QObject::tr( "Raster analysis" );
45}
46
47QString QgsZonalStatisticsAlgorithm::groupId() const
48{
49 return QStringLiteral( "rasteranalysis" );
50}
51
52QString QgsZonalStatisticsAlgorithm::shortDescription() const
53{
54 return QObject::tr( "Calculates statistics for a raster layer's values for each feature of an overlapping polygon vector layer." );
55}
56
57QString QgsZonalStatisticsAlgorithm::shortHelpString() const
58{
59 return QObject::tr( "This algorithm calculates statistics of a raster layer for each feature "
60 "of an overlapping polygon vector layer. The results will be written in place." );
61}
62
63Qgis::ProcessingAlgorithmFlags QgsZonalStatisticsAlgorithm::flags() const
64{
66}
67
68QgsZonalStatisticsAlgorithm *QgsZonalStatisticsAlgorithm::createInstance() const
69{
70 return new QgsZonalStatisticsAlgorithm();
71}
72
73void QgsZonalStatisticsAlgorithm::initAlgorithm( const QVariantMap & )
74{
75 QStringList statChoices;
76 statChoices.reserve( STATS.size() );
77 for ( const Qgis::ZonalStatistic stat : STATS )
78 {
79 statChoices << QgsZonalStatistics::displayName( stat );
80 }
81
82 addParameter( new QgsProcessingParameterRasterLayer( QStringLiteral( "INPUT_RASTER" ), QObject::tr( "Raster layer" ) ) );
83 addParameter( new QgsProcessingParameterBand( QStringLiteral( "RASTER_BAND" ), QObject::tr( "Raster band" ), 1, QStringLiteral( "INPUT_RASTER" ) ) );
84 addParameter( new QgsProcessingParameterVectorLayer( QStringLiteral( "INPUT_VECTOR" ), QObject::tr( "Vector layer containing zones" ), QList<int>() << static_cast<int>( Qgis::ProcessingSourceType::VectorPolygon ) ) );
85 addParameter( new QgsProcessingParameterString( QStringLiteral( "COLUMN_PREFIX" ), QObject::tr( "Output column prefix" ), QStringLiteral( "_" ) ) );
86
87 addParameter( new QgsProcessingParameterEnum( QStringLiteral( "STATISTICS" ), QObject::tr( "Statistics to calculate" ), statChoices, true, QVariantList() << 0 << 1 << 2 ) );
88
89 addOutput( new QgsProcessingOutputVectorLayer( QStringLiteral( "INPUT_VECTOR" ), QObject::tr( "Zonal statistics" ), Qgis::ProcessingSourceType::VectorPolygon ) );
90}
91
92bool QgsZonalStatisticsAlgorithm::prepareAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback * )
93{
94 QgsRasterLayer *rasterLayer = parameterAsRasterLayer( parameters, QStringLiteral( "INPUT_RASTER" ), context );
95 if ( !rasterLayer )
96 throw QgsProcessingException( invalidRasterError( parameters, QStringLiteral( "INPUT_RASTER" ) ) );
97
98 mBand = parameterAsInt( parameters, QStringLiteral( "RASTER_BAND" ), context );
99 if ( mBand < 1 || mBand > rasterLayer->bandCount() )
100 throw QgsProcessingException( QObject::tr( "Invalid band number for BAND (%1): Valid values for input raster are 1 to %2" ).arg( mBand ).arg( rasterLayer->bandCount() ) );
101
102 mInterface.reset( rasterLayer->dataProvider()->clone() );
103 mCrs = rasterLayer->crs();
104 mPixelSizeX = rasterLayer->rasterUnitsPerPixelX();
105 mPixelSizeY = rasterLayer->rasterUnitsPerPixelY();
106
107 mPrefix = parameterAsString( parameters, QStringLiteral( "COLUMN_PREFIX" ), context );
108
109 const QList<int> stats = parameterAsEnums( parameters, QStringLiteral( "STATISTICS" ), context );
110 mStats = Qgis::ZonalStatistics();
111 for ( const int s : stats )
112 {
113 mStats |= STATS.at( s );
114 }
115
116 return true;
117}
118
119QVariantMap QgsZonalStatisticsAlgorithm::processAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback )
120{
121 QgsVectorLayer *layer = parameterAsVectorLayer( parameters, QStringLiteral( "INPUT_VECTOR" ), context );
122 if ( !layer )
123 throw QgsProcessingException( QObject::tr( "Invalid zones layer" ) );
124
125 QgsZonalStatistics zs( layer, mInterface.get(), mCrs, mPixelSizeX, mPixelSizeY, mPrefix, mBand, Qgis::ZonalStatistics( mStats ) );
126
127 zs.calculateStatistics( feedback );
128
129 QVariantMap outputs;
130 outputs.insert( QStringLiteral( "INPUT_VECTOR" ), layer->id() );
131 return outputs;
132}
133
@ VectorPolygon
Vector polygon layers.
ZonalStatistic
Statistics to be calculated during a zonal statistics operation.
Definition qgis.h:5424
QFlags< ProcessingAlgorithmFlag > ProcessingAlgorithmFlags
Flags indicating how and when an algorithm operates and should be exposed to users.
Definition qgis.h:3410
QFlags< ZonalStatistic > ZonalStatistics
Statistics to be calculated during a zonal statistics operation.
Definition qgis.h:5450
@ Deprecated
Algorithm is deprecated.
@ NoThreading
Algorithm is not thread safe and cannot be run in a background thread, e.g. for algorithms which mani...
QgsCoordinateReferenceSystem crs
Definition qgsmaplayer.h:83
QString id
Definition qgsmaplayer.h:79
virtual Qgis::ProcessingAlgorithmFlags flags() const
Returns the flags indicating how and when the algorithm operates and should be exposed to users.
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.
A vector layer output for processing algorithms.
A raster band parameter for Processing algorithms.
An enum based parameter for processing algorithms, allowing for selection from predefined values.
A raster layer parameter for processing algorithms.
A string parameter for processing algorithms.
A vector layer (with or without geometry) parameter for processing algorithms.
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.
Represents a vector layer which manages a vector based data sets.
A class that calculates raster statistics (count, sum, mean) for a polygon or multipolygon layer and ...
static QString displayName(Qgis::ZonalStatistic statistic)
Returns the friendly display name for a statistic.