/
qgsrastercalcnode.h
140 lines (120 loc) · 4.15 KB
/
qgsrastercalcnode.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
/***************************************************************************
qgsrastercalcnode.h
Node for raster calculator tree
--------------------
begin : 2010-10-23
copyright : (C) 20010 by Marco Hugentobler
email : marco dot hugentobler at sourcepole dot ch
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#ifndef QGSRASTERCALCNODE_H
#define QGSRASTERCALCNODE_H
#include <QMap>
#include "qgis_sip.h"
#include "qgis.h"
#include <QString>
#include "qgis_analysis.h"
class QgsRasterBlock;
class QgsRasterMatrix;
/**
* \ingroup analysis
* \class QgsRasterCalcNode
*/
class ANALYSIS_EXPORT QgsRasterCalcNode
{
public:
//! defines possible types of node
enum Type
{
tOperator = 1,
tNumber,
tRasterRef,
tMatrix
};
//! possible operators
enum Operator
{
opPLUS,
opMINUS,
opMUL,
opDIV,
opPOW,
opSQRT,
opSIN,
opCOS,
opTAN,
opASIN,
opACOS,
opATAN,
opEQ, // =
opNE, //!=
opGT, // >
opLT, // <
opGE, // >=
opLE, // <=
opAND,
opOR,
opSIGN, // change sign
opLOG,
opLOG10,
opNONE,
};
/**
* Constructor for QgsRasterCalcNode.
*/
QgsRasterCalcNode() = default;
QgsRasterCalcNode( double number );
QgsRasterCalcNode( QgsRasterMatrix *matrix );
QgsRasterCalcNode( Operator op, QgsRasterCalcNode *left, QgsRasterCalcNode *right );
QgsRasterCalcNode( const QString &rasterName );
~QgsRasterCalcNode();
//! QgsRasterCalcNode cannot be copied
QgsRasterCalcNode( const QgsRasterCalcNode &rh ) = delete;
//! QgsRasterCalcNode cannot be copied
QgsRasterCalcNode &operator=( const QgsRasterCalcNode &rh ) = delete;
Type type() const { return mType; }
//set left node
void setLeft( QgsRasterCalcNode *left ) { delete mLeft; mLeft = left; }
void setRight( QgsRasterCalcNode *right ) { delete mRight; mRight = right; }
/**
* Calculates result of raster calculation (might be real matrix or single number).
* \param rasterData input raster data references, map of raster name to raster data block
* \param result destination raster matrix for calculation results
* \param row optional row number to calculate for calculating result by rows, or -1 to
* calculate entire result
* \note not available in Python bindings
* \since QGIS 2.10
*/
bool calculate( QMap<QString, QgsRasterBlock * > &rasterData, QgsRasterMatrix &result, int row = -1 ) const SIP_SKIP;
/**
* Returns a string representation of the expression
* \param cStyle if true operators will follow C syntax
* \since QGIS 3.4.4
*/
QString toString( bool cStyle = false ) const;
/**
* Returns a list of nodes of a specific \a type
* \since QGIS 3.4.4
*/
QList<const QgsRasterCalcNode *> findNodes( const QgsRasterCalcNode::Type type ) const;
static QgsRasterCalcNode *parseRasterCalcString( const QString &str, QString &parserErrorMsg ) SIP_FACTORY;
private:
#ifdef SIP_RUN
QgsRasterCalcNode( const QgsRasterCalcNode &rh );
#endif
Type mType = tNumber;
QgsRasterCalcNode *mLeft = nullptr;
QgsRasterCalcNode *mRight = nullptr;
double mNumber = 0;
QString mRasterName;
QgsRasterMatrix *mMatrix = nullptr;
Operator mOperator = opNONE;
};
#endif // QGSRASTERCALCNODE_H