25 QString QgsRescaleRasterAlgorithm::name()
 const 
   27   return QStringLiteral( 
"rescaleraster" );
 
   30 QString QgsRescaleRasterAlgorithm::displayName()
 const 
   32   return QObject::tr( 
"Rescale raster" );
 
   35 QStringList QgsRescaleRasterAlgorithm::tags()
 const 
   37   return QObject::tr( 
"raster,rescale,minimum,maximum,range" ).split( 
',' );
 
   40 QString QgsRescaleRasterAlgorithm::group()
 const 
   42   return QObject::tr( 
"Raster analysis" );
 
   45 QString QgsRescaleRasterAlgorithm::groupId()
 const 
   47   return QStringLiteral( 
"rasteranalysis" );
 
   50 QString QgsRescaleRasterAlgorithm::shortHelpString()
 const 
   52   return QObject::tr( 
"Rescales raster layer to a new value range, while preserving the shape " 
   53                       "(distribution) of the raster's histogram (pixel values). Input values " 
   54                       "are mapped using a linear interpolation from the source raster's minimum " 
   55                       "and maximum pixel values to the destination minimum and maximum pixel range.\n\n" 
   56                       "By default the algorithm preserves original the NODATA value, but there is " 
   57                       "an option to override it." );
 
   60 QgsRescaleRasterAlgorithm *QgsRescaleRasterAlgorithm::createInstance()
 const 
   62   return new QgsRescaleRasterAlgorithm();
 
   65 void QgsRescaleRasterAlgorithm::initAlgorithm( 
const QVariantMap & )
 
   68   addParameter( 
new QgsProcessingParameterBand( QStringLiteral( 
"BAND" ), QObject::tr( 
"Band number" ), 1, QStringLiteral( 
"INPUT" ) ) );
 
   79   QgsRasterLayer *layer = parameterAsRasterLayer( parameters, QStringLiteral( 
"INPUT" ), context );
 
   83   mBand = parameterAsInt( parameters, QStringLiteral( 
"BAND" ), context );
 
   84   if ( mBand < 1 || mBand > layer->
bandCount() )
 
   85     throw QgsProcessingException( QObject::tr( 
"Invalid band number for BAND (%1): Valid values for input raster are 1 to %2" )
 
   89   mMinimum = parameterAsDouble( parameters, QStringLiteral( 
"MINIMUM" ), context );
 
   90   mMaximum = parameterAsDouble( parameters, QStringLiteral( 
"MAXIMUM" ), context );
 
   95   mLayerWidth = layer->
width();
 
   96   mLayerHeight = layer->
height();
 
   98   if ( parameters.value( QStringLiteral( 
"NODATA" ) ).isValid() )
 
  100     mNoData = parameterAsDouble( parameters, QStringLiteral( 
"NODATA" ), context );
 
  107   if ( std::isfinite( mNoData ) )
 
  110     if ( mNoData < std::numeric_limits<float>::lowest() )
 
  111       mNoData = std::numeric_limits<float>::lowest();
 
  112     else if ( mNoData > std::numeric_limits<float>::max() )
 
  113       mNoData = std::numeric_limits<float>::max();
 
  116   mXSize = mInterface->xSize();
 
  117   mYSize = mInterface->ySize();
 
  124   feedback->
pushInfo( QObject::tr( 
"Calculating raster minimum and maximum values…" ) );
 
  127   feedback->
pushInfo( QObject::tr( 
"Rescaling values…" ) );
 
  128   const QString outputFile = parameterAsOutputLayer( parameters, QStringLiteral( 
"OUTPUT" ), context );
 
  129   QFileInfo fi( outputFile );
 
  131   std::unique_ptr< QgsRasterFileWriter > writer = std::make_unique< QgsRasterFileWriter >( outputFile );
 
  132   writer->setOutputProviderKey( QStringLiteral( 
"gdal" ) );
 
  133   writer->setOutputFormat( outputFormat );
 
  134   std::unique_ptr<QgsRasterDataProvider > provider( writer->createOneBandRaster( 
Qgis::DataType::Float32, mXSize, mYSize, mExtent, mCrs ) );
 
  137   if ( !provider->isValid() )
 
  146   int numBlocksX = 
static_cast< int >( std::ceil( 1.0 * mLayerWidth / blockWidth ) );
 
  147   int numBlocksY = 
static_cast< int >( std::ceil( 1.0 * mLayerHeight / blockHeight ) );
 
  148   int numBlocks = numBlocksX * numBlocksY;
 
  151   iter.startRasterRead( mBand, mLayerWidth, mLayerHeight, mExtent );
 
  156   std::unique_ptr< QgsRasterBlock > inputBlock;
 
  157   while ( iter.readNextRasterPart( mBand, iterCols, iterRows, inputBlock, iterLeft, iterTop ) )
 
  159     std::unique_ptr< QgsRasterBlock > outputBlock( 
new QgsRasterBlock( destProvider->
dataType( 1 ), iterCols, iterRows ) );
 
  160     feedback->
setProgress( 100 * ( ( iterTop / blockHeight * numBlocksX ) + iterLeft / blockWidth ) / numBlocks );
 
  162     for ( 
int row = 0; row < iterRows; row++ )
 
  167       for ( 
int col = 0; col < iterCols; col++ )
 
  169         bool isNoData = 
false;
 
  170         double val = inputBlock->valueAndNoData( row, col, isNoData );
 
  173           outputBlock->setValue( row, col, mNoData );
 
  178           outputBlock->setValue( row, col, newValue );
 
  182     destProvider->
writeBlock( outputBlock.get(), mBand, iterLeft, iterTop );
 
  187   outputs.insert( QStringLiteral( 
"OUTPUT" ), outputFile );
 
@ Float32
Thirty two bit floating point (float)
bool isCanceled() const SIP_HOLDGIL
Tells whether the operation has been canceled already.
void setProgress(double progress)
Sets the current progress for the feedback object.
virtual QgsRectangle extent() const
Returns the extent of the layer.
QgsCoordinateReferenceSystem crs
Contains information about the context in which a processing algorithm is executed.
Custom exception class for processing related exceptions.
Base class for providing feedback from a processing algorithm.
virtual void pushInfo(const QString &info)
Pushes a general informational message from the algorithm.
A raster band parameter for Processing algorithms.
A numeric parameter for processing algorithms.
@ Double
Double/float values.
A raster layer destination parameter, for specifying the destination path for a raster layer created ...
A raster layer parameter for processing algorithms.
The RasterBandStats struct is a container for statistics about a single raster band.
double minimumValue
The minimum cell value in the raster band.
double maximumValue
The maximum cell value in the raster band.
Base class for raster data providers.
virtual bool setNoDataValue(int bandNo, double noDataValue)
Set no data value on created dataset.
virtual double sourceNoDataValue(int bandNo) const
Value representing no data value.
QgsRasterDataProvider * clone() const override=0
Clone itself, create deep copy.
bool writeBlock(QgsRasterBlock *block, int band, int xOffset=0, int yOffset=0)
Writes pixel data from a raster block into the provider data source.
Qgis::DataType dataType(int bandNo) const override=0
Returns data type for the band specified by number.
virtual bool setEditable(bool enabled)
Turns on/off editing mode of the provider.
static QString driverForExtension(const QString &extension)
Returns the GDAL driver name for a specified file extension.
Iterator for sequentially processing raster cells.
static const int DEFAULT_MAXIMUM_TILE_WIDTH
Default maximum tile width.
static const int DEFAULT_MAXIMUM_TILE_HEIGHT
Default maximum tile height.
Represents a raster layer.
int height() const
Returns the height of the (unclipped) raster.
int bandCount() const
Returns the number of bands in this layer.
QgsRasterDataProvider * dataProvider() override
Returns the source data provider.
int width() const
Returns the width of the (unclipped) raster.
A rectangle specified with double values.