Branch data Line data Source code
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 : :
18 : : #include "qgsalgorithmzonalstatistics.h"
19 : :
20 : : ///@cond PRIVATE
21 : :
22 : 2 : const std::vector< QgsZonalStatistics::Statistic > STATS
23 : 2 : {
24 : : QgsZonalStatistics::Count,
25 : : QgsZonalStatistics::Sum,
26 : : QgsZonalStatistics::Mean,
27 : : QgsZonalStatistics::Median,
28 : : QgsZonalStatistics::StDev,
29 : : QgsZonalStatistics::Min,
30 : : QgsZonalStatistics::Max,
31 : : QgsZonalStatistics::Range,
32 : : QgsZonalStatistics::Minority,
33 : : QgsZonalStatistics::Majority,
34 : : QgsZonalStatistics::Variety,
35 : : QgsZonalStatistics::Variance,
36 : : };
37 : :
38 : 0 : QString QgsZonalStatisticsAlgorithm::name() const
39 : : {
40 : 0 : return QStringLiteral( "zonalstatistics" );
41 : : }
42 : :
43 : 0 : QString QgsZonalStatisticsAlgorithm::displayName() const
44 : : {
45 : 0 : return QObject::tr( "Zonal statistics (in place)" );
46 : : }
47 : :
48 : 0 : QStringList QgsZonalStatisticsAlgorithm::tags() const
49 : : {
50 : 0 : return QObject::tr( "stats,statistics,zones,layer,sum,maximum,minimum,mean,count,standard,deviation,"
51 : 0 : "median,range,majority,minority,variety,variance,summary,raster" ).split( ',' );
52 : 0 : }
53 : :
54 : 0 : QString QgsZonalStatisticsAlgorithm::group() const
55 : : {
56 : 0 : return QObject::tr( "Raster analysis" );
57 : : }
58 : :
59 : 0 : QString QgsZonalStatisticsAlgorithm::groupId() const
60 : : {
61 : 0 : return QStringLiteral( "rasteranalysis" );
62 : : }
63 : :
64 : 0 : QString QgsZonalStatisticsAlgorithm::shortHelpString() const
65 : : {
66 : 0 : return QObject::tr( "This algorithm calculates statistics of a raster layer for each feature "
67 : : "of an overlapping polygon vector layer. The results will be written in place." );
68 : : }
69 : :
70 : 0 : QgsProcessingAlgorithm::Flags QgsZonalStatisticsAlgorithm::flags() const
71 : : {
72 : 0 : return QgsProcessingAlgorithm::flags() | QgsProcessingAlgorithm::FlagNoThreading | QgsProcessingAlgorithm::FlagDeprecated;
73 : : }
74 : :
75 : 0 : QgsZonalStatisticsAlgorithm *QgsZonalStatisticsAlgorithm::createInstance() const
76 : : {
77 : 0 : return new QgsZonalStatisticsAlgorithm();
78 : 0 : }
79 : :
80 : 0 : void QgsZonalStatisticsAlgorithm::initAlgorithm( const QVariantMap & )
81 : : {
82 : 0 : QStringList statChoices;
83 : 0 : statChoices.reserve( STATS.size() );
84 : 0 : for ( QgsZonalStatistics::Statistic stat : STATS )
85 : : {
86 : 0 : statChoices << QgsZonalStatistics::displayName( stat );
87 : : }
88 : :
89 : 0 : addParameter( new QgsProcessingParameterRasterLayer( QStringLiteral( "INPUT_RASTER" ), QObject::tr( "Raster layer" ) ) );
90 : 0 : addParameter( new QgsProcessingParameterBand( QStringLiteral( "RASTER_BAND" ),
91 : 0 : QObject::tr( "Raster band" ), 1, QStringLiteral( "INPUT_RASTER" ) ) );
92 : 0 : addParameter( new QgsProcessingParameterVectorLayer( QStringLiteral( "INPUT_VECTOR" ), QObject::tr( "Vector layer containing zones" ),
93 : 0 : QList< int >() << QgsProcessing::TypeVectorPolygon ) );
94 : 0 : addParameter( new QgsProcessingParameterString( QStringLiteral( "COLUMN_PREFIX" ), QObject::tr( "Output column prefix" ), QStringLiteral( "_" ) ) );
95 : :
96 : 0 : addParameter( new QgsProcessingParameterEnum( QStringLiteral( "STATISTICS" ), QObject::tr( "Statistics to calculate" ),
97 : 0 : statChoices, true, QVariantList() << 0 << 1 << 2 ) );
98 : :
99 : 0 : addOutput( new QgsProcessingOutputVectorLayer( QStringLiteral( "INPUT_VECTOR" ), QObject::tr( "Zonal statistics" ), QgsProcessing::TypeVectorPolygon ) );
100 : 0 : }
101 : :
102 : 0 : bool QgsZonalStatisticsAlgorithm::prepareAlgorithm( const QVariantMap ¶meters, QgsProcessingContext &context, QgsProcessingFeedback * )
103 : : {
104 : 0 : QgsRasterLayer *rasterLayer = parameterAsRasterLayer( parameters, QStringLiteral( "INPUT_RASTER" ), context );
105 : 0 : if ( !rasterLayer )
106 : 0 : throw QgsProcessingException( invalidRasterError( parameters, QStringLiteral( "INPUT_RASTER" ) ) );
107 : :
108 : 0 : mBand = parameterAsInt( parameters, QStringLiteral( "RASTER_BAND" ), context );
109 : 0 : if ( mBand < 1 || mBand > rasterLayer->bandCount() )
110 : 0 : throw QgsProcessingException( QObject::tr( "Invalid band number for BAND (%1): Valid values for input raster are 1 to %2" ).arg( mBand )
111 : 0 : .arg( rasterLayer->bandCount() ) );
112 : :
113 : 0 : mInterface.reset( rasterLayer->dataProvider()->clone() );
114 : 0 : mCrs = rasterLayer->crs();
115 : 0 : mPixelSizeX = rasterLayer->rasterUnitsPerPixelX();
116 : 0 : mPixelSizeY = rasterLayer->rasterUnitsPerPixelY();
117 : :
118 : 0 : mPrefix = parameterAsString( parameters, QStringLiteral( "COLUMN_PREFIX" ), context );
119 : :
120 : 0 : const QList< int > stats = parameterAsEnums( parameters, QStringLiteral( "STATISTICS" ), context );
121 : 0 : mStats = QgsZonalStatistics::Statistics();
122 : 0 : for ( int s : stats )
123 : : {
124 : 0 : mStats |= STATS.at( s );
125 : : }
126 : :
127 : : return true;
128 : 0 : }
129 : :
130 : 0 : QVariantMap QgsZonalStatisticsAlgorithm::processAlgorithm( const QVariantMap ¶meters, QgsProcessingContext &context, QgsProcessingFeedback *feedback )
131 : : {
132 : 0 : QgsVectorLayer *layer = parameterAsVectorLayer( parameters, QStringLiteral( "INPUT_VECTOR" ), context );
133 : 0 : if ( !layer )
134 : 0 : throw QgsProcessingException( QObject::tr( "Invalid zones layer" ) );
135 : :
136 : 0 : QgsZonalStatistics zs( layer,
137 : 0 : mInterface.get(),
138 : 0 : mCrs,
139 : 0 : mPixelSizeX,
140 : 0 : mPixelSizeY,
141 : 0 : mPrefix,
142 : 0 : mBand,
143 : 0 : QgsZonalStatistics::Statistics( mStats )
144 : : );
145 : :
146 : 0 : zs.calculateStatistics( feedback );
147 : :
148 : 0 : QVariantMap outputs;
149 : 0 : outputs.insert( QStringLiteral( "INPUT_VECTOR" ), layer->id() );
150 : 0 : return outputs;
151 : 0 : }
152 : :
153 : : ///@endcond
|