mirror of
https://github.com/qgis/QGIS.git
synced 2025-10-06 00:07:29 -04:00
Merge pull request #31690 from elpaso/bugfix-gh31193-rastercalc-bool-to-float
Fix raster calc OpenCL bool to float
This commit is contained in:
commit
81b89f89ee
@ -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:
|
||||
|
@ -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
BIN
tests/testdata/analysis/dem_int16.tif
vendored
Normal file
Binary file not shown.
17
tests/testdata/analysis/dem_int16.tif.aux.xml
vendored
Normal file
17
tests/testdata/analysis/dem_int16.tif.aux.xml
vendored
Normal 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>
|
Loading…
x
Reference in New Issue
Block a user