Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
convert GDAL no data value to a value representable by data type, fixes
  • Loading branch information
blazek committed Dec 14, 2013
1 parent 402b397 commit c4b2480
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 1 deletion.
22 changes: 21 additions & 1 deletion src/core/raster/qgsraster.cpp
Expand Up @@ -53,4 +53,24 @@ QgsRaster::ContrastEnhancementLimits QgsRaster::contrastEnhancementLimitsFromStr
return ContrastEnhancementNone;
}


double QgsRaster::representableValue( double value, QGis::DataType dataType )
{
switch ( dataType )
{
case QGis::Byte:
return static_cast<quint8>( value );
case QGis::UInt16:
return static_cast<quint16>( value );
case QGis::Int16:
return static_cast<qint16>( value );
case QGis::UInt32:
return static_cast<quint32>( value );
case QGis::Int32:
return static_cast<qint32>( value );
case QGis::Float32:
return static_cast<float>( value );
default:
break;
}
return value;
}
8 changes: 8 additions & 0 deletions src/core/raster/qgsraster.h
Expand Up @@ -20,6 +20,8 @@

#include <QString>

#include "qgis.h"

/** \ingroup core
* Raster namespace.
*/
Expand Down Expand Up @@ -108,6 +110,12 @@ class CORE_EXPORT QgsRaster
static QString contrastEnhancementLimitsAsString( QgsRaster::ContrastEnhancementLimits theLimits );
static ContrastEnhancementLimits contrastEnhancementLimitsFromString( QString theLimits );

/** Get value representable by given data type.
* Supported are numerical types Byte, UInt16, Int16, UInt32, Int32, Float32, Float64.
* @param value
* @param dataType
* @note added in version 2.1 */
static double representableValue( double value, QGis::DataType dataType );
};

#endif
Expand Down
4 changes: 4 additions & 0 deletions src/providers/gdal/qgsgdalprovider.cpp
Expand Up @@ -2411,6 +2411,10 @@ void QgsGdalProvider::initBaseDataset()
if ( isValid )
{
QgsDebugMsg( QString( "GDALGetRasterNoDataValue = %1" ).arg( myNoDataValue ) ) ;
// The no data value double may be non representable by data type, it can result
// in problems if that value is used to represent additional user defined no data
// see #3840
myNoDataValue = QgsRaster::representableValue( myNoDataValue, dataTypeFromGdal( myGdalDataType ) );
mSrcNoDataValue.append( myNoDataValue );
mSrcHasNoDataValue.append( true );
mUseSrcNoDataValue.append( true );
Expand Down
1 change: 1 addition & 0 deletions src/providers/wcs/qgswcsprovider.cpp
Expand Up @@ -303,6 +303,7 @@ QgsWcsProvider::QgsWcsProvider( QString const &uri )
if ( isValid )
{
QgsDebugMsg( QString( "GDALGetRasterNoDataValue = %1" ).arg( myNoDataValue ) ) ;
myNoDataValue = QgsRaster::representableValue( myNoDataValue, dataTypeFromGdal( myGdalDataType ) );
mSrcNoDataValue.append( myNoDataValue );
mSrcHasNoDataValue.append( true );
mUseSrcNoDataValue.append( true );
Expand Down

0 comments on commit c4b2480

Please sign in to comment.