Skip to content

Commit b86f84e

Browse files
AndrewAnnexnyalldawson
authored andcommittedOct 9, 2018
Use raster band names in QGIS [FEATURE] [needs-docs]
* fixes #16047 * extracts band name info using gdalapi in QgsGdalProvider * added configuration option to allowing user to select band name behavior * currently 5 ways including current default behavior: #, name, name (#), # (name), _DIM_EXTRA metadata
1 parent b6e6b90 commit b86f84e

File tree

3 files changed

+124
-60
lines changed

3 files changed

+124
-60
lines changed
 

‎src/app/qgsoptions.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -418,6 +418,20 @@ QgsOptions::QgsOptions( QWidget *parent, Qt::WindowFlags fl, const QList<QgsOpti
418418
cmbPromptRasterSublayers->addItem( tr( "Load all" ) );
419419
cmbPromptRasterSublayers->setCurrentIndex( mSettings->value( QStringLiteral( "/qgis/promptForRasterSublayers" ), 0 ).toInt() );
420420

421+
// decide how qgis should use band names (if present) in raster sources
422+
// 0 = Band Number -> Default behavior is to just use band numbers
423+
// 1 = Band Name -> Uses available band name
424+
// 2 = Band Name & Number -> Uses available band name with a band number-> "name (band #)"
425+
// 3 = Band Name & Number -> Uses band number with available band name-> "band # (name)"
426+
// 4 = Use _DIM_EXTRA -> Uses "_DIM_EXTRA" metadata attribute in netCDF and geotiff
427+
cmbUseOfRasterBandNames->clear();
428+
cmbUseOfRasterBandNames->addItem( tr( "Band Number" ) );
429+
cmbUseOfRasterBandNames->addItem( tr( "Band Name" ) );
430+
cmbUseOfRasterBandNames->addItem( tr( "Band Name & Number" ) );
431+
cmbUseOfRasterBandNames->addItem( tr( "Band Number & Name" ) );
432+
cmbUseOfRasterBandNames->addItem( tr( "Use _DIM_EXTRA" ) );
433+
cmbUseOfRasterBandNames->setCurrentIndex( mSettings->value( QStringLiteral( "/qgis/useOfRasterBandNames" ), 0 ).toInt() );
434+
421435
// Scan for valid items in the browser dock
422436
cmbScanItemsInBrowser->clear();
423437
cmbScanItemsInBrowser->addItem( tr( "Check file contents" ), "contents" ); // 0
@@ -1389,6 +1403,7 @@ void QgsOptions::saveOptions()
13891403
mSettings->setValue( QStringLiteral( "/qgis/attributeTableView" ), mAttrTableViewComboBox->currentData() );
13901404
mSettings->setValue( QStringLiteral( "/qgis/attributeTableRowCache" ), spinBoxAttrTableRowCache->value() );
13911405
mSettings->setValue( QStringLiteral( "/qgis/promptForRasterSublayers" ), cmbPromptRasterSublayers->currentIndex() );
1406+
mSettings->setValue( QStringLiteral( "/qgis/useOfRasterBandNames" ), cmbUseOfRasterBandNames->currentIndex() );
13921407
mSettings->setValue( QStringLiteral( "/qgis/scanItemsInBrowser2" ),
13931408
cmbScanItemsInBrowser->currentData().toString() );
13941409
mSettings->setValue( QStringLiteral( "/qgis/scanZipInBrowser2" ),

‎src/providers/gdal/qgsgdalprovider.cpp

Lines changed: 69 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
#include <QDebug>
5959

6060
#include <gdalwarper.h>
61+
#include <gdal.h>
6162
#include <ogr_srs_api.h>
6263
#include <cpl_conv.h>
6364
#include <cpl_string.h>
@@ -932,70 +933,78 @@ QString QgsGdalProvider::generateBandName( int bandNumber ) const
932933
if ( !const_cast<QgsGdalProvider *>( this )->initIfNeeded() )
933934
return QString();
934935

935-
if ( strcmp( GDALGetDriverShortName( GDALGetDatasetDriver( mGdalDataset ) ), "netCDF" ) == 0 || strcmp( GDALGetDriverShortName( GDALGetDatasetDriver( mGdalDataset ) ), "GTiff" ) == 0 )
936-
{
937-
char **GDALmetadata = GDALGetMetadata( mGdalDataset, nullptr );
938-
939-
if ( GDALmetadata )
940-
{
941-
QStringList metadata = QgsOgrUtils::cStringListToQStringList( GDALmetadata );
942-
QStringList dimExtraValues;
943-
QMap< QString, QString > unitsMap;
944-
for ( QStringList::const_iterator i = metadata.constBegin();
945-
i != metadata.constEnd(); ++i )
946-
{
947-
QString val( *i );
948-
if ( !val.startsWith( QLatin1String( "NETCDF_DIM_EXTRA" ) ) && !val.startsWith( QLatin1String( "GTIFF_DIM_EXTRA" ) ) && !val.contains( QLatin1String( "#units=" ) ) )
949-
continue;
950-
QStringList values = val.split( '=' );
951-
val = values.at( 1 );
952-
if ( values.at( 0 ) == QLatin1String( "NETCDF_DIM_EXTRA" ) || values.at( 0 ) == QLatin1String( "GTIFF_DIM_EXTRA" ) )
953-
{
954-
dimExtraValues = val.replace( '{', QString() ).replace( '}', QString() ).split( ',' );
955-
//http://qt-project.org/doc/qt-4.8/qregexp.html#capturedTexts
956-
}
957-
else
958-
{
959-
unitsMap[ values.at( 0 ).split( '#' ).at( 0 )] = val;
960-
}
961-
}
962-
if ( !dimExtraValues.isEmpty() )
963-
{
964-
QStringList bandNameValues;
965-
GDALRasterBandH gdalBand = GDALGetRasterBand( mGdalDataset, bandNumber );
966-
GDALmetadata = GDALGetMetadata( gdalBand, nullptr );
936+
QString generatedBandName = QgsRasterDataProvider::generateBandName( bandNumber );
937+
GDALRasterBandH myGdalBand = getBand( bandNumber );
938+
QString gdalBandName(GDALGetDescription(myGdalBand));
967939

968-
if ( GDALmetadata )
969-
{
970-
metadata = QgsOgrUtils::cStringListToQStringList( GDALmetadata );
971-
for ( QStringList::const_iterator i = metadata.constBegin();
972-
i != metadata.constEnd(); ++i )
973-
{
974-
QString val( *i );
975-
if ( !val.startsWith( QLatin1String( "NETCDF_DIM_" ) ) && !val.startsWith( QLatin1String( "GTIFF_DIM_" ) ) )
976-
continue;
977-
QStringList values = val.split( '=' );
978-
for ( QStringList::const_iterator j = dimExtraValues.constBegin();
979-
j != dimExtraValues.constEnd(); ++j )
980-
{
981-
QString dim = ( *j );
982-
if ( values.at( 0 ) != "NETCDF_DIM_" + dim && values.at( 0 ) != "GTIFF_DIM_" + dim )
983-
continue;
984-
if ( unitsMap.contains( dim ) && !unitsMap[ dim ].isEmpty() && unitsMap[ dim ] != QLatin1String( "none" ) )
985-
bandNameValues.append( dim + '=' + values.at( 1 ) + " (" + unitsMap[ dim ] + ')' );
986-
else
987-
bandNameValues.append( dim + '=' + values.at( 1 ) );
988-
}
940+
QgsSettings settings;
941+
switch(settings.value(QStringLiteral( "/qgis/useOfRasterBandNames" )).toInt()) {
942+
case 0 :
943+
return generatedBandName;
944+
case 1 :
945+
if ( !gdalBandName.isEmpty() ) {
946+
return gdalBandName;
989947
}
990-
}
991-
992-
if ( !bandNameValues.isEmpty() )
993-
return tr( "Band" ) + QStringLiteral( " %1 / %2" ) .arg( bandNumber, 1 + ( int ) std::log10( ( float ) bandCount() ), 10, QChar( '0' ) ).arg( bandNameValues.join( QStringLiteral( " / " ) ) );
994-
}
995-
}
948+
// if we didn't find a band name use the generated one
949+
break;
950+
case 2 :
951+
return gdalBandName + QStringLiteral(" (") + generatedBandName + QStringLiteral(")");
952+
case 3 :
953+
return generatedBandName + QStringLiteral(" (") + gdalBandName + QStringLiteral(")");
954+
case 4 :
955+
if ( strcmp( GDALGetDriverShortName( GDALGetDatasetDriver( mGdalDataset ) ), "netCDF" ) == 0 || strcmp( GDALGetDriverShortName( GDALGetDatasetDriver( mGdalDataset ) ), "GTiff" ) == 0 ) {
956+
char **GDALmetadata = GDALGetMetadata(mGdalDataset, nullptr);
957+
958+
if (GDALmetadata) {
959+
QStringList metadata = QgsOgrUtils::cStringListToQStringList(GDALmetadata);
960+
QStringList dimExtraValues;
961+
QMap<QString, QString> unitsMap;
962+
for (QStringList::const_iterator i = metadata.constBegin(); i != metadata.constEnd(); ++i) {
963+
QString val(*i);
964+
if (!val.startsWith(QLatin1String("NETCDF_DIM_EXTRA")) && !val.startsWith(QLatin1String("GTIFF_DIM_EXTRA")) && !val.contains(QLatin1String("#units=")))
965+
continue;
966+
QStringList values = val.split('=');
967+
val = values.at(1);
968+
if (values.at(0) == QLatin1String("NETCDF_DIM_EXTRA") || values.at(0) == QLatin1String("GTIFF_DIM_EXTRA")) {
969+
dimExtraValues = val.replace('{', QString()).replace('}', QString()).split(',');
970+
//http://qt-project.org/doc/qt-4.8/qregexp.html#capturedTexts
971+
} else {
972+
unitsMap[values.at(0).split('#').at(0)] = val;
973+
}
974+
}
975+
if (!dimExtraValues.isEmpty()) {
976+
QStringList bandNameValues;
977+
GDALRasterBandH gdalBand = GDALGetRasterBand(mGdalDataset, bandNumber);
978+
GDALmetadata = GDALGetMetadata(gdalBand, nullptr);
979+
980+
if (GDALmetadata) {
981+
metadata = QgsOgrUtils::cStringListToQStringList(GDALmetadata);
982+
for (QStringList::const_iterator i = metadata.constBegin(); i != metadata.constEnd(); ++i) {
983+
QString val(*i);
984+
if (!val.startsWith(QLatin1String("NETCDF_DIM_")) && !val.startsWith(QLatin1String("GTIFF_DIM_")))
985+
continue;
986+
QStringList values = val.split('=');
987+
for (QStringList::const_iterator j = dimExtraValues.constBegin(); j != dimExtraValues.constEnd(); ++j) {
988+
QString dim = (*j);
989+
if (values.at(0) != "NETCDF_DIM_" + dim && values.at(0) != "GTIFF_DIM_" + dim)
990+
continue;
991+
if (unitsMap.contains(dim) && !unitsMap[dim].isEmpty() && unitsMap[dim] != QLatin1String("none"))
992+
bandNameValues.append(dim + '=' + values.at(1) + " (" + unitsMap[dim] + ')');
993+
else
994+
bandNameValues.append(dim + '=' + values.at(1));
995+
}
996+
}
997+
}
998+
999+
if (!bandNameValues.isEmpty())
1000+
return tr("Band") + QStringLiteral(" %1 / %2").arg(bandNumber, 1 + (int) std::log10((float) bandCount()), 10, QChar('0')).arg(bandNameValues.join(QStringLiteral(" / ")));
1001+
}
1002+
}
1003+
}
1004+
break;
9961005
}
9971006

998-
return QgsRasterDataProvider::generateBandName( bandNumber );
1007+
return generatedBandName;
9991008
}
10001009

10011010
QgsRasterIdentifyResult QgsGdalProvider::identify( const QgsPointXY &point, QgsRaster::IdentifyFormat format, const QgsRectangle &boundingBox, int width, int height, int /*dpi*/ )

‎src/ui/qgsoptionsbase.ui

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2007,6 +2007,45 @@
20072007
</item>
20082008
</layout>
20092009
</item>
2010+
<item>
2011+
<layout class="QHBoxLayout" name="horizontalLayout_38">
2012+
<item>
2013+
<widget class="QLabel" name="textLabel1_15">
2014+
<property name="sizePolicy">
2015+
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
2016+
<horstretch>0</horstretch>
2017+
<verstretch>0</verstretch>
2018+
</sizepolicy>
2019+
</property>
2020+
<property name="text">
2021+
<string>Change raster band name behavior</string>
2022+
</property>
2023+
</widget>
2024+
</item>
2025+
<item>
2026+
<spacer name="horizontalSpacer_38">
2027+
<property name="orientation">
2028+
<enum>Qt::Horizontal</enum>
2029+
</property>
2030+
<property name="sizeHint" stdset="0">
2031+
<size>
2032+
<width>40</width>
2033+
<height>20</height>
2034+
</size>
2035+
</property>
2036+
</spacer>
2037+
</item>
2038+
<item>
2039+
<widget class="QComboBox" name="cmbUseOfRasterBandNames">
2040+
<item>
2041+
<property name="text">
2042+
<string/>
2043+
</property>
2044+
</item>
2045+
</widget>
2046+
</item>
2047+
</layout>
2048+
</item>
20102049
<item>
20112050
<widget class="QCheckBox" name="cbxIgnoreShapeEncoding">
20122051
<property name="toolTip">
@@ -5606,6 +5645,7 @@ p, li { white-space: pre-wrap; }
56065645
<tabstop>cmbScanItemsInBrowser</tabstop>
56075646
<tabstop>cmbScanZipInBrowser</tabstop>
56085647
<tabstop>cmbPromptRasterSublayers</tabstop>
5648+
<tabstop>cmbUseOfRasterBandNames</tabstop>
56095649
<tabstop>cbxIgnoreShapeEncoding</tabstop>
56105650
<tabstop>cbxAddPostgisDC</tabstop>
56115651
<tabstop>cbxAddOracleDC</tabstop>

0 commit comments

Comments
 (0)
Please sign in to comment.