Merge pull request #31690 from elpaso/bugfix-gh31193-rastercalc-bool-to-float

Fix raster calc OpenCL bool to float
This commit is contained in:
Alessandro Pasotti 2019-09-11 17:25:56 +02:00 committed by GitHub
commit 81b89f89ee
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 58 additions and 21 deletions

View File

@ -236,34 +236,49 @@ QString QgsRasterCalcNode::toString( bool cStyle ) const
break;
case opEQ:
if ( cStyle )
result = QStringLiteral( "%1 == %2" ).arg( left ).arg( right );
result = QStringLiteral( "( float ) ( %1 == %2 )" ).arg( left ).arg( right );
else
result = QStringLiteral( "%1 = %2" ).arg( left ).arg( right );
break;
case opNE:
result = QStringLiteral( "%1 != %2" ).arg( left ).arg( right );
if ( cStyle )
result = QStringLiteral( "( float ) ( %1 != %2 )" ).arg( left ).arg( right );
else
result = QStringLiteral( "%1 != %2" ).arg( left ).arg( right );
break;
case opGT:
result = QStringLiteral( "%1 > %2" ).arg( left ).arg( right );
if ( cStyle )
result = QStringLiteral( "( float ) ( %1 > %2 )" ).arg( left ).arg( right );
else
result = QStringLiteral( "%1 > %2" ).arg( left ).arg( right );
break;
case opLT:
result = QStringLiteral( "%1 < %2" ).arg( left ).arg( right );
if ( cStyle )
result = QStringLiteral( "( float ) ( %1 < %2" ).arg( left ).arg( right );
else
result = QStringLiteral( "%1 < %2" ).arg( left ).arg( right );
break;
case opGE:
result = QStringLiteral( "%1 >= %2" ).arg( left ).arg( right );
if ( cStyle )
result = QStringLiteral( "( float ) ( %1 >= %2 )" ).arg( left ).arg( right );
else
result = QStringLiteral( "%1 >= %2" ).arg( left ).arg( right );
break;
case opLE:
result = QStringLiteral( "%1 <= %2" ).arg( left ).arg( right );
if ( cStyle )
result = QStringLiteral( "( float ) ( %1 <= %2 )" ).arg( left ).arg( right );
else
result = QStringLiteral( "%1 <= %2" ).arg( left ).arg( right );
break;
case opAND:
if ( cStyle )
result = QStringLiteral( "%1 && %2" ).arg( left ).arg( right );
result = QStringLiteral( "( float ) ( %1 && %2 )" ).arg( left ).arg( right );
else
result = QStringLiteral( "%1 AND %2" ).arg( left ).arg( right );
break;
case opOR:
if ( cStyle )
result = QStringLiteral( "%1 || %2" ).arg( left ).arg( right );
result = QStringLiteral( "( float ) ( %1 || %2 )" ).arg( left ).arg( right );
else
result = QStringLiteral( "%1 OR %2" ).arg( left ).arg( right );
break;
@ -305,7 +320,7 @@ QString QgsRasterCalcNode::toString( bool cStyle ) const
result = QString::number( mNumber );
if ( cStyle )
{
result = QStringLiteral( "(float) ( %1 )" ).arg( result );
result = QStringLiteral( "( float ) ( %1 )" ).arg( result );
}
break;
case tMatrix:

View File

@ -719,13 +719,15 @@ void TestQgsRasterCalculator::toString()
return calcNode->toString( cStyle );
};
QCOMPARE( _test( QStringLiteral( "\"raster@1\" + 2" ), false ), QString( "( \"raster@1\" + 2 )" ) );
QCOMPARE( _test( QStringLiteral( "\"raster@1\" + 2" ), true ), QString( "( \"raster@1\" + (float) ( 2 ) )" ) );
QCOMPARE( _test( QStringLiteral( "\"raster@1\" + 2" ), true ), QString( "( \"raster@1\" + ( float ) ( 2 ) )" ) );
QCOMPARE( _test( QStringLiteral( "\"raster@1\" ^ 3 + 2" ), false ), QString( "( \"raster@1\"^3 + 2 )" ) );
QCOMPARE( _test( QStringLiteral( "\"raster@1\" ^ 3 + 2" ), true ), QString( "( pow( \"raster@1\", (float) ( 3 ) ) + (float) ( 2 ) )" ) );
QCOMPARE( _test( QStringLiteral( "\"raster@1\" ^ 3 + 2" ), true ), QString( "( pow( \"raster@1\", ( float ) ( 3 ) ) + ( float ) ( 2 ) )" ) );
QCOMPARE( _test( QStringLiteral( "atan(\"raster@1\") * cos( 3 + 2 )" ), false ), QString( "atan( \"raster@1\" ) * cos( ( 3 + 2 ) )" ) );
QCOMPARE( _test( QStringLiteral( "atan(\"raster@1\") * cos( 3 + 2 )" ), true ), QString( "atan( \"raster@1\" ) * cos( ( (float) ( 3 ) + (float) ( 2 ) ) )" ) );
QCOMPARE( _test( QStringLiteral( "atan(\"raster@1\") * cos( 3 + 2 )" ), true ), QString( "atan( \"raster@1\" ) * cos( ( ( float ) ( 3 ) + ( float ) ( 2 ) ) )" ) );
QCOMPARE( _test( QStringLiteral( "0.5 * ( 1.4 * (\"raster@1\" + 2) )" ), false ), QString( "0.5 * 1.4 * ( \"raster@1\" + 2 )" ) );
QCOMPARE( _test( QStringLiteral( "0.5 * ( 1.4 * (\"raster@1\" + 2) )" ), true ), QString( "(float) ( 0.5 ) * (float) ( 1.4 ) * ( \"raster@1\" + (float) ( 2 ) )" ) );
QCOMPARE( _test( QStringLiteral( "0.5 * ( 1.4 * (\"raster@1\" + 2) )" ), true ), QString( "( float ) ( 0.5 ) * ( float ) ( 1.4 ) * ( \"raster@1\" + ( float ) ( 2 ) )" ) );
QCOMPARE( _test( QStringLiteral( "0.5 * ( 1 > 0 )" ), false ), QString( "0.5 * 1 > 0" ) );
QCOMPARE( _test( QStringLiteral( "0.5 * ( 1 > 0 )" ), true ), QString( "( float ) ( 0.5 ) * ( float ) ( ( float ) ( 1 ) > ( float ) ( 0 ) )" ) );
}
void TestQgsRasterCalculator::calcFormulasWithReprojectedLayers()
@ -774,14 +776,15 @@ void TestQgsRasterCalculator::calcFormulasWithReprojectedLayers()
QCOMPARE( result->width(), 2 );
QCOMPARE( result->height(), 3 );
QgsRasterBlock *block = result->dataProvider()->block( 1, extent, 2, 3 );
qDebug() << block->value( 0, 0 ) << block->value( 0, 1 ) << block->value( 1, 0 ) << block->value( 1, 1 ) << block->value( 2, 0 ) << block->value( 2, 1 );
const float epsilon { 0.0001f };
QVERIFY( std::abs( ( static_cast<float>( block->value( 0, 0 ) ) - values[0] ) / values[0] ) < epsilon );
QVERIFY( std::abs( ( static_cast<float>( block->value( 0, 1 ) ) - values[1] ) / values[1] ) < epsilon );
QVERIFY( std::abs( ( static_cast<float>( block->value( 1, 0 ) ) - values[2] ) / values[2] ) < epsilon );
QVERIFY( std::abs( ( static_cast<float>( block->value( 1, 1 ) ) - values[3] ) / values[3] ) < epsilon );
QVERIFY( std::abs( ( static_cast<float>( block->value( 2, 0 ) ) - values[4] ) / values[4] ) < epsilon );
QVERIFY( std::abs( ( static_cast<float>( block->value( 2, 1 ) ) - values[5] ) / values[5] ) < epsilon );
qDebug() << "Actual:" << block->value( 0, 0 ) << block->value( 0, 1 ) << block->value( 1, 0 ) << block->value( 1, 1 ) << block->value( 2, 0 ) << block->value( 2, 1 );
qDebug() << "Expected:" << values[0] << values[1] << values[2] << values[3] << values[4] << values[5];
const double epsilon { 0.0001 };
QVERIFY( qgsDoubleNear( block->value( 0, 0 ), static_cast<double>( values[0] ), epsilon ) );
QVERIFY( qgsDoubleNear( block->value( 0, 1 ), static_cast<double>( values[1] ), epsilon ) );
QVERIFY( qgsDoubleNear( block->value( 1, 0 ), static_cast<double>( values[2] ), epsilon ) );
QVERIFY( qgsDoubleNear( block->value( 1, 1 ), static_cast<double>( values[3] ), epsilon ) );
QVERIFY( qgsDoubleNear( block->value( 2, 0 ), static_cast<double>( values[4] ), epsilon ) );
QVERIFY( qgsDoubleNear( block->value( 2, 1 ), static_cast<double>( values[5] ), epsilon ) );
delete result;
delete block;
};
@ -792,6 +795,8 @@ void TestQgsRasterCalculator::calcFormulasWithReprojectedLayers()
_chk( QStringLiteral( "\"landsat@1\"^2 + 3 + \"landsat_4326@2\"" ), {15767, 15766, 15519, 15767, 15769, 15516}, true );
_chk( QStringLiteral( "0.5*((2*\"landsat@1\"+1)-sqrt((2*\"landsat@1\"+1)^2-8*(\"landsat@1\"-\"landsat_4326@2\")))" ), {-0.111504f, -0.103543f, -0.128448f, -0.111504f, -0.127425f, -0.104374f}, false );
_chk( QStringLiteral( "0.5*((2*\"landsat@1\"+1)-sqrt((2*\"landsat@1\"+1)^2-8*(\"landsat@1\"-\"landsat_4326@2\")))" ), {-0.111504f, -0.103543f, -0.128448f, -0.111504f, -0.127425f, -0.104374f}, true );
_chk( QStringLiteral( "\"landsat@1\" * ( \"landsat@1\" > 124 )" ), {125.0, 125.0, 0.0, 125.0, 125.0, 0.0}, false );
_chk( QStringLiteral( "\"landsat@1\" * ( \"landsat@1\" > 124 )" ), {125.0, 125.0, 0.0, 125.0, 125.0, 0.0}, true );
}

BIN
tests/testdata/analysis/dem_int16.tif vendored Normal file

Binary file not shown.

View File

@ -0,0 +1,17 @@
<PAMDataset>
<Metadata>
<MDI key="DataType">Elevation</MDI>
</Metadata>
<PAMRasterBand band="1">
<Description>Band_1</Description>
<Metadata>
<MDI key="BandName">Band_1</MDI>
<MDI key="RepresentationType">ATHEMATIC</MDI>
<MDI key="STATISTICS_MAXIMUM">3214</MDI>
<MDI key="STATISTICS_MEAN">2335.8982044956</MDI>
<MDI key="STATISTICS_MINIMUM">1586</MDI>
<MDI key="STATISTICS_STDDEV">323.62275180326</MDI>
<MDI key="STATISTICS_VALID_PERCENT">100</MDI>
</Metadata>
</PAMRasterBand>
</PAMDataset>