1
0
mirror of https://github.com/qgis/QGIS.git synced 2025-03-12 00:02:25 -04:00

[rastercalc] Consolidate duplicate code

This commit is contained in:
Nyall Dawson 2015-06-04 20:28:22 +10:00
parent f42f640d30
commit 1219a0fbd2
2 changed files with 57 additions and 225 deletions

@ -264,71 +264,66 @@ bool QgsRasterMatrix::oneArgumentOperation( OneArgOperator op )
return true;
}
double QgsRasterMatrix::calculateTwoArgumentOp( TwoArgOperator op, double arg1, double arg2 ) const
{
switch ( op )
{
case opPLUS:
return arg1 + arg2;
case opMINUS:
return arg1 - arg2;
case opMUL:
return arg1 * arg2;
case opDIV:
if ( arg2 == 0 )
{
return mNodataValue;
}
else
{
return arg1 / arg2;
}
case opPOW:
if ( !testPowerValidity( arg1, arg2 ) )
{
return mNodataValue;
}
else
{
return qPow( arg1, arg2 );
}
case opEQ:
return ( arg1 == arg2 ? 1.0 : 0.0 );
case opNE:
return ( arg1 == arg2 ? 0.0 : 1.0 );
case opGT:
return ( arg1 > arg2 ? 1.0 : 0.0 );
case opLT:
return ( arg1 < arg2 ? 1.0 : 0.0 );
case opGE:
return ( arg1 >= arg2 ? 1.0 : 0.0 );
case opLE:
return ( arg1 <= arg2 ? 1.0 : 0.0 );
case opAND:
return ( arg1 && arg2 ? 1.0 : 0.0 );
case opOR:
return ( arg1 || arg2 ? 1.0 : 0.0 );
}
return mNodataValue;
}
bool QgsRasterMatrix::twoArgumentOperation( TwoArgOperator op, const QgsRasterMatrix& other )
{
if ( isNumber() && other.isNumber() ) //operation on two 1x1 matrices
{
//operations with nodata values always generate nodata
if ( mData[0] == mNodataValue || other.number() == other.nodataValue() )
{
mData[0] = mNodataValue;
return true;
}
switch ( op )
{
case opPLUS:
mData[0] = number() + other.number();
break;
case opMINUS:
mData[0] = number() - other.number();
break;
case opMUL:
mData[0] = number() * other.number();
break;
case opDIV:
if ( other.number() == 0 )
{
mData[0] = mNodataValue;
}
else
{
mData[0] = number() / other.number();
}
break;
case opPOW:
if ( !testPowerValidity( mData[0], other.number() ) )
{
mData[0] = mNodataValue;
}
else
{
mData[0] = qPow( mData[0], other.number() );
}
break;
case opEQ:
mData[0] = mData[0] == other.number() ? 1.0 : 0.0;
break;
case opNE:
mData[0] = mData[0] == other.number() ? 0.0 : 1.0;
break;
case opGT:
mData[0] = mData[0] > other.number() ? 1.0 : 0.0;
break;
case opLT:
mData[0] = mData[0] < other.number() ? 1.0 : 0.0;
break;
case opGE:
mData[0] = mData[0] >= other.number() ? 1.0 : 0.0;
break;
case opLE:
mData[0] = mData[0] <= other.number() ? 1.0 : 0.0;
break;
case opAND:
mData[0] = mData[0] && other.number() ? 1.0 : 0.0;
break;
case opOR:
mData[0] = mData[0] || other.number() ? 1.0 : 0.0;
break;
mData[0] = calculateTwoArgumentOp( op, mData[0], other.number() );
}
return true;
}
@ -349,62 +344,7 @@ bool QgsRasterMatrix::twoArgumentOperation( TwoArgOperator op, const QgsRasterMa
}
else
{
switch ( op )
{
case opPLUS:
mData[i] = value1 + value2;
break;
case opMINUS:
mData[i] = value1 - value2;
break;
case opMUL:
mData[i] = value1 * value2;
break;
case opDIV:
if ( value2 == 0 )
{
mData[i] = mNodataValue;
}
else
{
mData[i] = value1 / value2;
}
break;
case opPOW:
if ( !testPowerValidity( value1, value2 ) )
{
mData[i] = mNodataValue;
}
else
{
mData[i] = pow( value1, value2 );
}
break;
case opEQ:
mData[i] = value1 == value2 ? 1.0 : 0.0;
break;
case opNE:
mData[i] = value1 == value2 ? 0.0 : 1.0;
break;
case opGT:
mData[i] = value1 > value2 ? 1.0 : 0.0;
break;
case opLT:
mData[i] = value1 < value2 ? 1.0 : 0.0;
break;
case opGE:
mData[i] = value1 >= value2 ? 1.0 : 0.0;
break;
case opLE:
mData[i] = value1 <= value2 ? 1.0 : 0.0;
break;
case opAND:
mData[i] = value1 && value2 ? 1.0 : 0.0;
break;
case opOR:
mData[i] = value1 || value2 ? 1.0 : 0.0;
break;
}
mData[i] = calculateTwoArgumentOp( op, value1, value2 );
}
}
return true;
@ -437,62 +377,7 @@ bool QgsRasterMatrix::twoArgumentOperation( TwoArgOperator op, const QgsRasterMa
continue;
}
switch ( op )
{
case opPLUS:
mData[i] = value + matrix[i];
break;
case opMINUS:
mData[i] = value - matrix[i];
break;
case opMUL:
mData[i] = value * matrix[i];
break;
case opDIV:
if ( matrix[i] == 0 )
{
mData[i] = mNodataValue;
}
else
{
mData[i] = value / matrix[i] ;
}
break;
case opPOW:
if ( !testPowerValidity( value, matrix[i] ) )
{
mData[i] = mNodataValue;
}
else
{
mData[i] = qPow( value, matrix[i] );
}
break;
case opEQ:
mData[i] = value == matrix[i] ? 1.0 : 0.0;
break;
case opNE:
mData[i] = value == matrix[i] ? 0.0 : 1.0;
break;
case opGT:
mData[i] = value > matrix[i] ? 1.0 : 0.0;
break;
case opLT:
mData[i] = value < matrix[i] ? 1.0 : 0.0;
break;
case opGE:
mData[i] = value >= matrix[i] ? 1.0 : 0.0;
break;
case opLE:
mData[i] = value <= matrix[i] ? 1.0 : 0.0;
break;
case opAND:
mData[i] = value && matrix[i] ? 1.0 : 0.0;
break;
case opOR:
mData[i] = value || matrix[i] ? 1.0 : 0.0;
break;
}
mData[i] = calculateTwoArgumentOp( op, value, matrix[i] );
}
return true;
}
@ -517,68 +402,13 @@ bool QgsRasterMatrix::twoArgumentOperation( TwoArgOperator op, const QgsRasterMa
continue;
}
switch ( op )
{
case opPLUS:
mData[i] = mData[i] + value;
break;
case opMINUS:
mData[i] = mData[i] - value;
break;
case opMUL:
mData[i] = mData[i] * value;
break;
case opDIV:
if ( value == 0 )
{
mData[i] = mNodataValue;
}
else
{
mData[i] = mData[i] / value;
}
break;
case opPOW:
if ( !testPowerValidity( mData[i], value ) )
{
mData[i] = mNodataValue;
}
else
{
mData[i] = qPow( mData[i], value );
}
break;
case opEQ:
mData[i] = mData[i] == value ? 1.0 : 0.0;
break;
case opNE:
mData[i] = mData[i] == value ? 0.0 : 1.0;
break;
case opGT:
mData[i] = mData[i] > value ? 1.0 : 0.0;
break;
case opLT:
mData[i] = mData[i] < value ? 1.0 : 0.0;
break;
case opGE:
mData[i] = mData[i] >= value ? 1.0 : 0.0;
break;
case opLE:
mData[i] = mData[i] <= value ? 1.0 : 0.0;
break;
case opAND:
mData[i] = mData[i] && value ? 1.0 : 0.0;
break;
case opOR:
mData[i] = mData[i] || value ? 1.0 : 0.0;
break;
}
mData[i] = calculateTwoArgumentOp( op, mData[i], value );
}
return true;
}
}
bool QgsRasterMatrix::testPowerValidity( double base, double power )
bool QgsRasterMatrix::testPowerValidity( double base, double power ) const
{
if (( base == 0 && power < 0 ) || ( base < 0 && ( power - floor( power ) ) > 0 ) )
{

@ -115,9 +115,11 @@ class ANALYSIS_EXPORT QgsRasterMatrix
/**+,-,*,/,^,<,>,<=,>=,=,!=, and, or*/
bool twoArgumentOperation( TwoArgOperator op, const QgsRasterMatrix& other );
double calculateTwoArgumentOp( TwoArgOperator op, double arg1, double arg2 ) const;
/*sqrt, sin, cos, tan, asin, acos, atan*/
bool oneArgumentOperation( OneArgOperator op );
bool testPowerValidity( double base, double power );
bool testPowerValidity( double base, double power ) const;
};
#endif // QGSRASTERMATRIX_H