Merge pull request #63335 from qgis/backport-63321-to-release-3_44

[Backport release-3_44] [pg][raster] Fix nodata identify
This commit is contained in:
Alexander Bruy 2025-09-26 05:18:47 +01:00 committed by GitHub
commit c324704f91
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 28 additions and 3 deletions

View File

@ -325,7 +325,16 @@ QgsRasterIdentifyResult QgsRasterDataProvider::identify( const QgsPointXY &point
if ( bandBlock )
{
const double value = bandBlock->value( 0 );
results.insert( bandNumber, value );
if ( ( sourceHasNoDataValue( bandNumber ) && useSourceNoDataValue( bandNumber ) &&
( std::isnan( value ) || qgsDoubleNear( value, sourceNoDataValue( bandNumber ) ) ) ) ||
( QgsRasterRange::contains( value, userNoDataValues( bandNumber ) ) ) )
{
results.insert( bandNumber, QVariant() ); // null QVariant represents no data
}
else
{
results.insert( bandNumber, value );
}
}
else
{

View File

@ -80,6 +80,11 @@ class TestPyQgsPostgresRasterProvider(QgisTestCase):
if "QGIS_PGTEST_DB" in os.environ:
cls.dbconn = os.environ["QGIS_PGTEST_DB"]
# Clean all styles
md = QgsProviderRegistry.instance().providerMetadata("postgres")
conn = md.createConnection(cls.dbconn + " sslmode=disable ", {})
conn.executeSql("DROP TABLE IF EXISTS layer_styles")
cls._load_test_table("public", "raster_tiled_3035")
cls._load_test_table("public", "raster_3035_no_constraints")
cls._load_test_table("public", "raster_3035_tiled_no_overviews")
@ -170,7 +175,8 @@ class TestPyQgsPostgresRasterProvider(QgisTestCase):
identify = rl.dataProvider().identify(
QgsPointXY(4080320, 2430854), QgsRaster.IdentifyFormat.IdentifyFormatValue
)
self.assertEqual(identify.results()[1], -9999)
self.assertEqual(identify.results()[1], None)
postgis_warning_logs = list(
filter(
@ -944,11 +950,21 @@ class TestPyQgsPostgresRasterProvider(QgisTestCase):
self.assertTrue(rl.isValid())
dp = rl.dataProvider()
self.assertEqual(dp.sourceNoDataValue(1), -9999.0)
r = dp.identify(
QgsPointXY(4080317.72, 2430635.68), Qgis.RasterIdentifyFormat.Value
).results()
self.assertEqual(r[1], -9999.0)
# Nodata value
self.assertEqual(r[1], None)
r = dp.identify(
QgsPointXY(4080106.29, 2430678.29), Qgis.RasterIdentifyFormat.Value
).results()
# Valid value
self.assertAlmostEqual(r[1], 184.16825, 4)
# tile request returned no tiles, check nodata
ext = QgsRectangle.fromCenterAndSize(QgsPointXY(4080317.72, 2430635.68), 1, 1)