Quantum GIS API Documentation  1.7.4
src/analysis/raster/qgsrastercalcnode.cpp
Go to the documentation of this file.
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 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines