1 /***************************************************************************
2                          qgsalgorithmcellstatistics.h
3                          ---------------------
4     begin                : May 2020
5     copyright            : (C) 2020 by Clemens Raffler
6     email                : clemens dot raffler 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 #ifndef QGSALGORITHMCELLSTATISTICS_H
19 #define QGSALGORITHMCELLSTATISTICS_H
20 
21 #define SIP_NO_FILE
22 
23 #include "qgis_sip.h"
24 #include "qgsapplication.h"
25 #include "qgsprocessingalgorithm.h"
26 #include "qgsrasterprojector.h"
27 #include "qgsrasteranalysisutils.h"
28 
29 ///@cond PRIVATE
30 
31 class QgsCellStatisticsAlgorithmBase : public QgsProcessingAlgorithm
32 {
33 
34   public:
35     QString group() const final;
36     QString groupId() const final;
37     void initAlgorithm( const QVariantMap &configuration = QVariantMap() ) final;
38 
39 
40   protected:
41     virtual void addSpecificAlgorithmParams() = 0;
42     virtual bool prepareSpecificAlgorithmParameters( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) = 0;
43     bool prepareAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) final;
44     QVariantMap processAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) final;
45     virtual void processRasterStack( QgsProcessingFeedback *feedback ) = 0;
46 
47     std::vector< QgsRasterAnalysisUtils::RasterLogicInput > mInputs;
48     bool mIgnoreNoData;
49     Qgis::DataType mDataType;
50     double mNoDataValue = -9999;
51     int mLayerWidth;
52     int mLayerHeight;
53     QgsRectangle mExtent;
54     QgsCoordinateReferenceSystem mCrs;
55     double mRasterUnitsPerPixelX;
56     double mRasterUnitsPerPixelY;
57     QgsRasterDataProvider *mOutputRasterDataProvider;
58 };
59 
60 class QgsCellStatisticsAlgorithm : public QgsCellStatisticsAlgorithmBase
61 {
62   public:
63     QgsCellStatisticsAlgorithm() = default;
icon()64     QIcon icon() const override { return QgsApplication::getThemeIcon( QStringLiteral( "/algorithms/mAlgorithmCellStatistics.svg" ) ); }
svgIconPath()65     QString svgIconPath() const override { return QgsApplication::iconPath( QStringLiteral( "/algorithms/mAlgorithmCellStatistics.svg" ) ); }
66     QString name() const override;
67     QString displayName() const override;
68     QStringList tags() const override;
69     QString shortHelpString() const override;
70     QgsCellStatisticsAlgorithm *createInstance() const override SIP_FACTORY;
71 
72   protected:
73     void addSpecificAlgorithmParams() override;
74     bool prepareSpecificAlgorithmParameters( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override;
75     void processRasterStack( QgsProcessingFeedback *feedback ) override;
76 
77   private:
78     QgsRasterAnalysisUtils::CellValueStatisticMethods mMethod;
79 
80 };
81 
82 
83 class QgsCellStatisticsPercentileAlgorithm : public QgsCellStatisticsAlgorithmBase
84 {
85   public:
86     QgsCellStatisticsPercentileAlgorithm() = default;
icon()87     QIcon icon() const override { return QgsApplication::getThemeIcon( QStringLiteral( "/algorithms/mAlgorithmCellStatisticsPercentile.svg" ) ); }
svgIconPath()88     QString svgIconPath() const override { return QgsApplication::iconPath( QStringLiteral( "/algorithms/mAlgorithmCellStatisticsPercentile.svg" ) ); }
89     QString name() const override;
90     QString displayName() const override;
91     QStringList tags() const override;
92     QString shortHelpString() const override;
93     QgsCellStatisticsPercentileAlgorithm *createInstance() const override SIP_FACTORY;
94 
95   protected:
96     void addSpecificAlgorithmParams() override;
97     bool prepareSpecificAlgorithmParameters( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override;
98     void processRasterStack( QgsProcessingFeedback *feedback ) override;
99 
100   private:
101     QgsRasterAnalysisUtils::CellValuePercentileMethods mMethod;
102     double mPercentile = 0.0;
103 };
104 
105 
106 class QgsCellStatisticsPercentRankFromValueAlgorithm : public QgsCellStatisticsAlgorithmBase
107 {
108   public:
109     QgsCellStatisticsPercentRankFromValueAlgorithm() = default;
icon()110     QIcon icon() const override { return QgsApplication::getThemeIcon( QStringLiteral( "/algorithms/mAlgorithmCellStatisticsPercentRank.svg" ) ); }
svgIconPath()111     QString svgIconPath() const override { return QgsApplication::iconPath( QStringLiteral( "/algorithms/mAlgorithmCellStatisticsPercentRank.svg" ) ); }
112     QString name() const override;
113     QString displayName() const override;
114     QStringList tags() const override;
115     QString shortHelpString() const override;
116     QgsCellStatisticsPercentRankFromValueAlgorithm *createInstance() const override SIP_FACTORY;
117 
118   protected:
119     void addSpecificAlgorithmParams() override;
120     bool prepareSpecificAlgorithmParameters( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override;
121     void processRasterStack( QgsProcessingFeedback *feedback ) override;
122 
123   private:
124     QgsRasterAnalysisUtils::CellValuePercentRankMethods mMethod;
125     double mValue = 0.0;
126 
127 };
128 
129 
130 class QgsCellStatisticsPercentRankFromRasterAlgorithm : public QgsCellStatisticsAlgorithmBase
131 {
132   public:
133     QgsCellStatisticsPercentRankFromRasterAlgorithm() = default;
icon()134     QIcon icon() const override { return QgsApplication::getThemeIcon( QStringLiteral( "/algorithms/mAlgorithmCellStatisticsPercentRank.svg" ) ); }
svgIconPath()135     QString svgIconPath() const override { return QgsApplication::iconPath( QStringLiteral( "/algorithms/mAlgorithmCellStatisticsPercentRank.svg" ) ); }
136     QString name() const override;
137     QString displayName() const override;
138     QStringList tags() const override;
139     QString shortHelpString() const override;
140     QgsCellStatisticsPercentRankFromRasterAlgorithm *createInstance() const override SIP_FACTORY;
141 
142   protected:
143     void addSpecificAlgorithmParams() override;
144     bool prepareSpecificAlgorithmParameters( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override;
145     void processRasterStack( QgsProcessingFeedback *feedback ) override;
146 
147   private:
148     QgsRasterAnalysisUtils::CellValuePercentRankMethods mMethod;
149     std::unique_ptr< QgsRasterInterface > mValueRasterInterface;
150     int mValueRasterBand;
151 
152 };
153 
154 
155 ///@endcond PRIVATE
156 
157 #endif // QGSALGORITHMCELLSTATISTICS_H
158 
159