Show raster band description

Fix #53831
This commit is contained in:
Alessandro Pasotti 2023-07-14 17:41:26 +02:00
parent 159f7c4018
commit 96e7f9eb5a
6 changed files with 52 additions and 1 deletions

View File

@ -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:

View File

@ -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 );

View File

@ -160,6 +160,7 @@ class QgsGdalProvider final: public QgsRasterDataProvider, QgsGdalProviderBase
double bandOffset( int bandNo ) const override;
QList<QgsColorRampShader::ColorRampItem> 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 );

View File

@ -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

View File

@ -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:

View File

@ -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 );
}