Quantum GIS API Documentation
1.7.4
|
00001 #include "qgsrastercalcnode.h" 00002 #include <cfloat> 00003 00004 QgsRasterCalcNode::QgsRasterCalcNode(): mLeft( 0 ), mRight( 0 ), mRasterMatrix( 0 ), mNumber( 0 ) 00005 { 00006 } 00007 00008 QgsRasterCalcNode::QgsRasterCalcNode( double number ): mType( tNumber ), mLeft( 0 ), mRight( 0 ), mRasterMatrix( 0 ), mNumber( number ) 00009 { 00010 } 00011 00012 QgsRasterCalcNode::QgsRasterCalcNode( Operator op, QgsRasterCalcNode* left, QgsRasterCalcNode* right ): mType( tOperator ), mLeft( left ), mRight( right ), mRasterMatrix( 0 ), mNumber( 0 ), mOperator( op ) 00013 { 00014 } 00015 00016 QgsRasterCalcNode::QgsRasterCalcNode( const QString& rasterName ): mType( tRasterRef ), mLeft( 0 ), mRight( 0 ), mRasterMatrix( 0 ), mNumber( 0 ), mRasterName( rasterName ) 00017 { 00018 } 00019 00020 QgsRasterCalcNode::~QgsRasterCalcNode() 00021 { 00022 if ( mLeft ) 00023 { 00024 delete mLeft; 00025 } 00026 if ( mRight ) 00027 { 00028 delete mRight; 00029 } 00030 } 00031 00032 bool QgsRasterCalcNode::calculate( QMap<QString, QgsRasterMatrix*>& rasterData, QgsRasterMatrix& result ) const 00033 { 00034 //if type is raster ref: return a copy of the corresponding matrix 00035 00036 //if type is operator, call the proper matrix operations 00037 if ( mType == tRasterRef ) 00038 { 00039 QMap<QString, QgsRasterMatrix*>::iterator it = rasterData.find( mRasterName ); 00040 if ( it == rasterData.end() ) 00041 { 00042 return false; 00043 } 00044 00045 int nEntries = ( *it )->nColumns() * ( *it )->nRows(); 00046 float* data = new float[nEntries]; 00047 memcpy( data, ( *it )->data(), nEntries * sizeof( float ) ); 00048 result.setData(( *it )->nColumns(), ( *it )->nRows(), data, ( *it )->nodataValue() ); 00049 return true; 00050 } 00051 else if ( mType == tOperator ) 00052 { 00053 QgsRasterMatrix leftMatrix, rightMatrix; 00054 QgsRasterMatrix resultMatrix; 00055 if ( !mLeft || !mLeft->calculate( rasterData, leftMatrix ) ) 00056 { 00057 return false; 00058 } 00059 if ( mRight && !mRight->calculate( rasterData, rightMatrix ) ) 00060 { 00061 return false; 00062 } 00063 00064 switch ( mOperator ) 00065 { 00066 case opPLUS: 00067 leftMatrix.add( rightMatrix ); 00068 break; 00069 case opMINUS: 00070 leftMatrix.subtract( rightMatrix ); 00071 break; 00072 case opMUL: 00073 leftMatrix.multiply( rightMatrix ); 00074 break; 00075 case opDIV: 00076 leftMatrix.divide( rightMatrix ); 00077 break; 00078 case opPOW: 00079 leftMatrix.power( rightMatrix ); 00080 break; 00081 case opEQ: 00082 leftMatrix.equal( rightMatrix ); 00083 break; 00084 case opNE: 00085 leftMatrix.notEqual( rightMatrix ); 00086 break; 00087 case opGT: 00088 leftMatrix.greaterThan( rightMatrix ); 00089 break; 00090 case opLT: 00091 leftMatrix.lesserThan( rightMatrix ); 00092 break; 00093 case opGE: 00094 leftMatrix.greaterEqual( rightMatrix ); 00095 break; 00096 case opLE: 00097 leftMatrix.lesserEqual( rightMatrix ); 00098 break; 00099 case opAND: 00100 leftMatrix.logicalAnd( rightMatrix ); 00101 break; 00102 case opOR: 00103 leftMatrix.logicalOr( rightMatrix ); 00104 break; 00105 case opSQRT: 00106 leftMatrix.squareRoot(); 00107 break; 00108 case opSIN: 00109 leftMatrix.sinus(); 00110 break; 00111 case opCOS: 00112 leftMatrix.cosinus(); 00113 break; 00114 case opTAN: 00115 leftMatrix.tangens(); 00116 break; 00117 case opASIN: 00118 leftMatrix.asinus(); 00119 break; 00120 case opACOS: 00121 leftMatrix.acosinus(); 00122 break; 00123 case opATAN: 00124 leftMatrix.atangens(); 00125 case opSIGN: 00126 leftMatrix.changeSign(); 00127 break; 00128 default: 00129 return false; 00130 } 00131 int newNColumns = leftMatrix.nColumns(); 00132 int newNRows = leftMatrix.nRows(); 00133 result.setData( newNColumns, newNRows, leftMatrix.takeData(), leftMatrix.nodataValue() ); 00134 return true; 00135 } 00136 else if ( mType == tNumber ) 00137 { 00138 float* data = new float[1]; 00139 data[0] = mNumber; 00140 result.setData( 1, 1, data, -FLT_MAX ); 00141 return true; 00142 } 00143 return false; 00144 } 00145 00146 QgsRasterCalcNode* QgsRasterCalcNode::parseRasterCalcString( const QString& str, QString& parserErrorMsg ) 00147 { 00148 extern QgsRasterCalcNode* localParseRasterCalcString( const QString & str, QString & parserErrorMsg ); 00149 return localParseRasterCalcString( str, parserErrorMsg ); 00150 } 00151