Quantum GIS API Documentation  1.7.5-Wroclaw
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
qgsrastercalcnode.cpp
Go to the documentation of this file.
1 #include "qgsrastercalcnode.h"
2 #include <cfloat>
3 
4 QgsRasterCalcNode::QgsRasterCalcNode(): mLeft( 0 ), mRight( 0 ), mRasterMatrix( 0 ), mNumber( 0 )
5 {
6 }
7 
8 QgsRasterCalcNode::QgsRasterCalcNode( double number ): mType( tNumber ), mLeft( 0 ), mRight( 0 ), mRasterMatrix( 0 ), mNumber( number )
9 {
10 }
11 
12 QgsRasterCalcNode::QgsRasterCalcNode( Operator op, QgsRasterCalcNode* left, QgsRasterCalcNode* right ): mType( tOperator ), mLeft( left ), mRight( right ), mRasterMatrix( 0 ), mNumber( 0 ), mOperator( op )
13 {
14 }
15 
16 QgsRasterCalcNode::QgsRasterCalcNode( const QString& rasterName ): mType( tRasterRef ), mLeft( 0 ), mRight( 0 ), mRasterMatrix( 0 ), mNumber( 0 ), mRasterName( rasterName )
17 {
18 }
19 
21 {
22  if ( mLeft )
23  {
24  delete mLeft;
25  }
26  if ( mRight )
27  {
28  delete mRight;
29  }
30 }
31 
32 bool QgsRasterCalcNode::calculate( QMap<QString, QgsRasterMatrix*>& rasterData, QgsRasterMatrix& result ) const
33 {
34  //if type is raster ref: return a copy of the corresponding matrix
35 
36  //if type is operator, call the proper matrix operations
37  if ( mType == tRasterRef )
38  {
39  QMap<QString, QgsRasterMatrix*>::iterator it = rasterData.find( mRasterName );
40  if ( it == rasterData.end() )
41  {
42  return false;
43  }
44 
45  int nEntries = ( *it )->nColumns() * ( *it )->nRows();
46  float* data = new float[nEntries];
47  memcpy( data, ( *it )->data(), nEntries * sizeof( float ) );
48  result.setData(( *it )->nColumns(), ( *it )->nRows(), data, ( *it )->nodataValue() );
49  return true;
50  }
51  else if ( mType == tOperator )
52  {
53  QgsRasterMatrix leftMatrix, rightMatrix;
54  QgsRasterMatrix resultMatrix;
55  if ( !mLeft || !mLeft->calculate( rasterData, leftMatrix ) )
56  {
57  return false;
58  }
59  if ( mRight && !mRight->calculate( rasterData, rightMatrix ) )
60  {
61  return false;
62  }
63 
64  switch ( mOperator )
65  {
66  case opPLUS:
67  leftMatrix.add( rightMatrix );
68  break;
69  case opMINUS:
70  leftMatrix.subtract( rightMatrix );
71  break;
72  case opMUL:
73  leftMatrix.multiply( rightMatrix );
74  break;
75  case opDIV:
76  leftMatrix.divide( rightMatrix );
77  break;
78  case opPOW:
79  leftMatrix.power( rightMatrix );
80  break;
81  case opEQ:
82  leftMatrix.equal( rightMatrix );
83  break;
84  case opNE:
85  leftMatrix.notEqual( rightMatrix );
86  break;
87  case opGT:
88  leftMatrix.greaterThan( rightMatrix );
89  break;
90  case opLT:
91  leftMatrix.lesserThan( rightMatrix );
92  break;
93  case opGE:
94  leftMatrix.greaterEqual( rightMatrix );
95  break;
96  case opLE:
97  leftMatrix.lesserEqual( rightMatrix );
98  break;
99  case opAND:
100  leftMatrix.logicalAnd( rightMatrix );
101  break;
102  case opOR:
103  leftMatrix.logicalOr( rightMatrix );
104  break;
105  case opSQRT:
106  leftMatrix.squareRoot();
107  break;
108  case opSIN:
109  leftMatrix.sinus();
110  break;
111  case opCOS:
112  leftMatrix.cosinus();
113  break;
114  case opTAN:
115  leftMatrix.tangens();
116  break;
117  case opASIN:
118  leftMatrix.asinus();
119  break;
120  case opACOS:
121  leftMatrix.acosinus();
122  break;
123  case opATAN:
124  leftMatrix.atangens();
125  case opSIGN:
126  leftMatrix.changeSign();
127  break;
128  default:
129  return false;
130  }
131  int newNColumns = leftMatrix.nColumns();
132  int newNRows = leftMatrix.nRows();
133  result.setData( newNColumns, newNRows, leftMatrix.takeData(), leftMatrix.nodataValue() );
134  return true;
135  }
136  else if ( mType == tNumber )
137  {
138  float* data = new float[1];
139  data[0] = mNumber;
140  result.setData( 1, 1, data, -FLT_MAX );
141  return true;
142  }
143  return false;
144 }
145 
146 QgsRasterCalcNode* QgsRasterCalcNode::parseRasterCalcString( const QString& str, QString& parserErrorMsg )
147 {
148  extern QgsRasterCalcNode* localParseRasterCalcString( const QString & str, QString & parserErrorMsg );
149  return localParseRasterCalcString( str, parserErrorMsg );
150 }
151