diff --git a/python/core/auto_generated/raster/qgsrasterdataprovider.sip.in b/python/core/auto_generated/raster/qgsrasterdataprovider.sip.in index 2a6c0ded719..35a8d3d8901 100644 --- a/python/core/auto_generated/raster/qgsrasterdataprovider.sip.in +++ b/python/core/auto_generated/raster/qgsrasterdataprovider.sip.in @@ -786,6 +786,8 @@ Data providers that have NativeRasterAttributeTable provider capability will try .. versionadded:: 3.30 %End + virtual QString bandDescription( int bandNumber ); // Note: not const because GDAL init on demand + signals: diff --git a/src/core/providers/gdal/qgsgdalprovider.cpp b/src/core/providers/gdal/qgsgdalprovider.cpp index c06aa000075..67d07dc6ed4 100644 --- a/src/core/providers/gdal/qgsgdalprovider.cpp +++ b/src/core/providers/gdal/qgsgdalprovider.cpp @@ -626,6 +626,39 @@ QString QgsGdalProvider::htmlMetadata() return myMetadata; } +QString QgsGdalProvider::bandDescription( int bandNumber ) +{ + QMutexLocker locker( mpMutex ); + if ( !initIfNeeded() ) + return QString(); + + GDALDriverH hDriver = GDALGetDriverByName( mDriverName.toLocal8Bit().constData() ); + if ( !hDriver ) + return QString(); + + if ( GDALGetRasterCount( mGdalDataset ) > 0 ) + { + GDALRasterBandH gdalBand = GDALGetRasterBand( mGdalDataset, bandNumber ); + if ( gdalBand ) + { + char **GDALmetadata = GDALGetMetadata( gdalBand, nullptr ); + if ( GDALmetadata ) + { + const QStringList metadata = QgsOgrUtils::cStringListToQStringList( GDALmetadata ); + const auto description = std::find_if( metadata.constBegin(), metadata.constEnd(), []( const QString & md ) + { + return md.startsWith( QStringLiteral( "DESCRIPTION=" ) ); + } ); + if ( description != metadata.constEnd() ) + { + return description->mid( 12 ); + } + } + } + } + return QString(); +} + QgsRasterBlock *QgsGdalProvider::block( int bandNo, const QgsRectangle &extent, int width, int height, QgsRasterBlockFeedback *feedback ) { std::unique_ptr< QgsRasterBlock > block = std::make_unique< QgsRasterBlock >( dataType( bandNo ), width, height ); diff --git a/src/core/providers/gdal/qgsgdalprovider.h b/src/core/providers/gdal/qgsgdalprovider.h index 96a9b87fcca..c5d87a58356 100644 --- a/src/core/providers/gdal/qgsgdalprovider.h +++ b/src/core/providers/gdal/qgsgdalprovider.h @@ -160,6 +160,7 @@ class QgsGdalProvider final: public QgsRasterDataProvider, QgsGdalProviderBase double bandOffset( int bandNo ) const override; QList colorTable( int bandNo )const override; QString htmlMetadata() override; + QString bandDescription( int bandNumber ) override; QStringList subLayers() const override; static QList< QgsProviderSublayerDetails > sublayerDetails( GDALDatasetH dataset, const QString &baseUri ); diff --git a/src/core/raster/qgsrasterdataprovider.cpp b/src/core/raster/qgsrasterdataprovider.cpp index 4f3a82ab06b..cc32eaa4c46 100644 --- a/src/core/raster/qgsrasterdataprovider.cpp +++ b/src/core/raster/qgsrasterdataprovider.cpp @@ -763,6 +763,12 @@ bool QgsRasterDataProvider::readNativeAttributeTable( QString *errorMessage ) return false; } +QString QgsRasterDataProvider::bandDescription( int bandNumber ) +{ + Q_UNUSED( bandNumber ) + return QString(); +} + bool QgsRasterDataProvider::readFileBasedAttributeTable( int bandNumber, const QString &path, QString *errorMessage ) { QGIS_PROTECT_QOBJECT_THREAD_ACCESS diff --git a/src/core/raster/qgsrasterdataprovider.h b/src/core/raster/qgsrasterdataprovider.h index 1c9dcbd10e7..fc4619dac8b 100644 --- a/src/core/raster/qgsrasterdataprovider.h +++ b/src/core/raster/qgsrasterdataprovider.h @@ -831,6 +831,13 @@ class CORE_EXPORT QgsRasterDataProvider : public QgsDataProvider, public QgsRast */ virtual bool readNativeAttributeTable( QString *errorMessage SIP_OUT = nullptr ); + /** + * Returns the description for band \a bandNumber, or an empty string if the band is not valid or has not description. + * The default implementation returns an empty string. + * \since QGIS 3.34 + */ + virtual QString bandDescription( int bandNumber ); // Note: not const because GDAL init on demand + signals: diff --git a/src/gui/raster/qgsrasterbandcombobox.cpp b/src/gui/raster/qgsrasterbandcombobox.cpp index ed6161a4302..110542cac5c 100644 --- a/src/gui/raster/qgsrasterbandcombobox.cpp +++ b/src/gui/raster/qgsrasterbandcombobox.cpp @@ -166,5 +166,7 @@ QString QgsRasterBandComboBox::displayBandName( QgsRasterDataProvider *provider, if ( !provider ) return QString(); - return provider->displayBandName( band ); + QString name { provider->displayBandName( band ) }; + const QString description { provider->bandDescription( band ) }; + return description.isEmpty() ? name : QStringLiteral( "%1 - %2" ).arg( name, description ); }