16 changes: 8 additions & 8 deletions src/core/raster/qgsrasterlayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ email : tim at linfiniti.com
#include "qgsprojectfiletransform.h"
#include "qgsproviderregistry.h"
#include "qgsrasterlayer.h"
#include "qgsrasterrange.h"
#include "qgsrasterrendererregistry.h"
#include "qgsrectangle.h"
#include "qgsrendercontext.h"
Expand Down Expand Up @@ -2471,17 +2472,16 @@ bool QgsRasterLayer::readXml( const QDomNode& layer_node )
if ( ok && ( bandNo > 0 ) && ( bandNo <= mDataProvider->bandCount() ) )
{
mDataProvider->setUseSrcNoDataValue( bandNo, bandElement.attribute( "useSrcNoData" ).toInt() );
QList<QgsRasterBlock::Range> myNoDataRangeList;
QgsRasterRangeList myNoDataRangeList;

QDomNodeList rangeList = bandElement.elementsByTagName( "noDataRange" );

for ( int j = 0; j < rangeList.size(); ++j )
{
QDomElement rangeElement = rangeList.at( j ).toElement();
QgsRasterBlock::Range myNoDataRange;
myNoDataRange.min = rangeElement.attribute( "min" ).toDouble();
myNoDataRange.max = rangeElement.attribute( "max" ).toDouble();
QgsDebugMsg( QString( "min = %1 %2" ).arg( rangeElement.attribute( "min" ) ).arg( myNoDataRange.min ) );
QgsRasterRange myNoDataRange( rangeElement.attribute( "min" ).toDouble(),
rangeElement.attribute( "max" ).toDouble() );
QgsDebugMsg( QString( "min = %1 %2" ).arg( rangeElement.attribute( "min" ) ).arg( myNoDataRange.min() ) );
myNoDataRangeList << myNoDataRange;
}
mDataProvider->setUserNoDataValue( bandNo, myNoDataRangeList );
Expand Down Expand Up @@ -2575,12 +2575,12 @@ bool QgsRasterLayer::writeXml( QDomNode & layer_node,
noDataRangeList.setAttribute( "bandNo", bandNo );
noDataRangeList.setAttribute( "useSrcNoData", mDataProvider->useSrcNoDataValue( bandNo ) );

foreach ( QgsRasterBlock::Range range, mDataProvider->userNoDataValue( bandNo ) )
foreach ( QgsRasterRange range, mDataProvider->userNoDataValue( bandNo ) )
{
QDomElement noDataRange = document.createElement( "noDataRange" );

noDataRange.setAttribute( "min", range.min );
noDataRange.setAttribute( "max", range.max );
noDataRange.setAttribute( "min", range.min() );
noDataRange.setAttribute( "max", range.max() );
noDataRangeList.appendChild( noDataRange );
}

Expand Down
51 changes: 51 additions & 0 deletions src/core/raster/qgsrasterrange.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
/***************************************************************************
qgsrasterrange.h
--------------------------------------
Date : Oct 9, 2012
Copyright : (C) 2012 by Radim Blazek
email : radim dot blazek at gmail dot com
***************************************************************************/

/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/

#include <limits>
#include "qgis.h"
#include "qgsrasterrange.h"

QgsRasterRange::QgsRasterRange()
: mMin ( std::numeric_limits<double>::quiet_NaN() )
, mMax ( std::numeric_limits<double>::quiet_NaN() )
{
}

QgsRasterRange::QgsRasterRange( double theMin, double theMax )
: mMin ( theMin )
, mMax ( theMax )
{
}

QgsRasterRange::~QgsRasterRange()
{
}

bool QgsRasterRange::contains( double value, const QgsRasterRangeList &rangeList )
{
foreach ( QgsRasterRange::QgsRasterRange range, rangeList )
{
if (( value >= range.mMin && value <= range.mMax ) ||
doubleNear( value, range.mMin ) ||
doubleNear( value, range.mMax ) )
{
return true;
}
}
return false;
}

72 changes: 72 additions & 0 deletions src/core/raster/qgsrasterrange.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
/***************************************************************************
qgsrasterrange.h
--------------------------------------
Date : Oct 9, 2012
Copyright : (C) 2012 by Radim Blazek
email : radim dot blazek at gmail dot com
***************************************************************************/

/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/

#ifndef QGSRASTERRANGE_H
#define QGSRASTERRANGE_H

#include <QList>

class QgsRasterRange;

typedef QList<QgsRasterRange> QgsRasterRangeList;

/** \ingroup core
* Raster values range container. Represents range of values between min and max
* including min and max value.
*/
class CORE_EXPORT QgsRasterRange
{
public:
/** \brief Constructor.
*/
QgsRasterRange();

/** \brief Constructor
* @param theMin minimum value
* @param theMax max value
*/
QgsRasterRange( double theMin, double theMax );

~QgsRasterRange();

double min() const { return mMin; }
double max() const { return mMax; }

double setMin( double theMin ) { return mMin = theMin; }
double setMax( double theMax ) { return mMax = theMax; }

inline bool operator==( const QgsRasterRange &o ) const
{
return mMin == o.mMin && mMax == o.mMax;
}

/** \brief Test if value is within the list of ranges
* @param value value
* @param rangeList list of ranges
* @return true if value is in at least one of ranges
* @note not available in python bindings
*/
static bool contains( double value, const QgsRasterRangeList &rangeList );

private:
double mMin;
double mMax;
};

#endif


4 changes: 2 additions & 2 deletions src/providers/grass/qgsgrassrasterprovider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -468,8 +468,8 @@ QgsRasterIdentifyResult QgsGrassRasterProvider::identify( const QgsPoint & thePo
if ( qIsNaN( value ) ) value = noDataValue( 1 );

// Apply user no data
QList<QgsRasterBlock::Range> myNoDataRangeList = userNoDataValue( 1 );
if ( QgsRasterBlock::valueInRange( value, myNoDataRangeList ) )
QgsRasterRangeList myNoDataRangeList = userNoDataValue( 1 );
if ( QgsRasterRange::contains( value, myNoDataRangeList ) )
{
value = noDataValue( 1 );
}
Expand Down
4 changes: 2 additions & 2 deletions src/providers/wcs/qgswcsprovider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1695,8 +1695,8 @@ QgsRasterIdentifyResult QgsWcsProvider::identify( const QgsPoint & thePoint, Ide
}

// Apply user no data
QList<QgsRasterBlock::Range> myNoDataRangeList = userNoDataValue( i );
if ( QgsRasterBlock::valueInRange( value, myNoDataRangeList ) )
QgsRasterRangeList myNoDataRangeList = userNoDataValue( i );
if ( QgsRasterRange::contains( value, myNoDataRangeList ) )
{
value = noDataValue( i );
}
Expand Down