1 /***************************************************************************
2                          qgsalgorithmrasterstackposition.h
3                          ---------------------
4     begin                : July 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 QGSALGORITHMRASTERSTACKPOSITION_H
19 #define QGSALGORITHMRASTERSTACKPOSITION_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 QgsRasterStackPositionAlgorithmBase : public QgsProcessingAlgorithm
32 {
33   public:
34     QgsRasterStackPositionAlgorithmBase() = default;
35     void initAlgorithm( const QVariantMap &configuration = QVariantMap() ) override;
36     QString group() const override;
37     QString groupId() const override;
38 
39   protected:
40     bool prepareAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override;
41     QVariantMap processAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override;
42     virtual int findPosition( std::vector< std::unique_ptr< QgsRasterBlock > > &rasterBlockStack, int &row, int &col, bool &noDataInRasterBlockStack ) = 0;
43     double mNoDataValue = -9999;
44 
45   private:
46     std::vector< QgsRasterAnalysisUtils::RasterLogicInput > mInputs;
47     bool mIgnoreNoData;
48     int mLayerWidth;
49     int mLayerHeight;
50     QgsRectangle mExtent;
51     QgsCoordinateReferenceSystem mCrs;
52     double mRasterUnitsPerPixelX;
53     double mRasterUnitsPerPixelY;
54 };
55 
56 class QgsRasterStackLowestPositionAlgorithm : public QgsRasterStackPositionAlgorithmBase
57 {
58   public:
59     QgsRasterStackLowestPositionAlgorithm() = default;
60     QString name() const override;
61     QString displayName() const override;
62     QStringList tags() const override;
63     QString shortHelpString() const override;
64     QgsRasterStackLowestPositionAlgorithm *createInstance() const override SIP_FACTORY;
65 
66   protected:
67     int findPosition( std::vector< std::unique_ptr< QgsRasterBlock > > &rasterBlockStack, int &row, int &col, bool &noDataInRasterBlockStack ) override;
68 };
69 
70 class QgsRasterStackHighestPositionAlgorithm : public QgsRasterStackPositionAlgorithmBase
71 {
72   public:
73     QgsRasterStackHighestPositionAlgorithm() = default;
74     QString name() const override;
75     QString displayName() const override;
76     QStringList tags() const override;
77     QString shortHelpString() const override;
78     QgsRasterStackHighestPositionAlgorithm *createInstance() const override SIP_FACTORY;
79 
80   protected:
81     int findPosition( std::vector< std::unique_ptr< QgsRasterBlock > > &rasterBlockStack, int &row, int &col, bool &noDataInRasterBlockStack ) override;
82 };
83 
84 ///@endcond PRIVATE
85 
86 #endif // QGSALGORITHMRASTERSTACKPOSITION_H
87