25QString QgsRescaleRasterAlgorithm::name()
 const 
   27  return QStringLiteral( 
"rescaleraster" );
 
   30QString QgsRescaleRasterAlgorithm::displayName()
 const 
   32  return QObject::tr( 
"Rescale raster" );
 
   35QStringList QgsRescaleRasterAlgorithm::tags()
 const 
   37  return QObject::tr( 
"raster,rescale,minimum,maximum,range" ).split( 
',' );
 
   40QString QgsRescaleRasterAlgorithm::group()
 const 
   42  return QObject::tr( 
"Raster analysis" );
 
   45QString QgsRescaleRasterAlgorithm::groupId()
 const 
   47  return QStringLiteral( 
"rasteranalysis" );
 
   50QString QgsRescaleRasterAlgorithm::shortHelpString()
 const 
   52  return QObject::tr( 
"This algorithm rescales a 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 the original NoData value, but there is " 
   57                      "an option to override it." );
 
   60QString QgsRescaleRasterAlgorithm::shortDescription()
 const 
   62  return QObject::tr( 
"Rescales a raster layer to a new value range, while preserving the shape " 
   63                      "(distribution) of the raster's histogram (pixel values)." );
 
   66QgsRescaleRasterAlgorithm *QgsRescaleRasterAlgorithm::createInstance()
 const 
   68  return new QgsRescaleRasterAlgorithm();
 
   71void QgsRescaleRasterAlgorithm::initAlgorithm( 
const QVariantMap & )
 
   74  addParameter( 
new QgsProcessingParameterBand( QStringLiteral( 
"BAND" ), QObject::tr( 
"Band number" ), 1, QStringLiteral( 
"INPUT" ) ) );
 
   81  auto createOptsParam = std::make_unique<QgsProcessingParameterString>( QStringLiteral( 
"CREATE_OPTIONS" ), QObject::tr( 
"Creation options" ), QVariant(), 
false, 
true );
 
   82  createOptsParam->setMetadata( QVariantMap( { { QStringLiteral( 
"widget_wrapper" ), QVariantMap( { { QStringLiteral( 
"widget_type" ), QStringLiteral( 
"rasteroptions" ) } } ) } } ) );
 
   84  addParameter( createOptsParam.release() );
 
   86  auto creationOptsParam = std::make_unique<QgsProcessingParameterString>( QStringLiteral( 
"CREATION_OPTIONS" ), QObject::tr( 
"Creation options" ), QVariant(), 
false, 
true );
 
   87  creationOptsParam->setMetadata( QVariantMap( { { QStringLiteral( 
"widget_wrapper" ), QVariantMap( { { QStringLiteral( 
"widget_type" ), QStringLiteral( 
"rasteroptions" ) } } ) } } ) );
 
   89  addParameter( creationOptsParam.release() );
 
   98  QgsRasterLayer *layer = parameterAsRasterLayer( parameters, QStringLiteral( 
"INPUT" ), context );
 
  102  mBand = parameterAsInt( parameters, QStringLiteral( 
"BAND" ), context );
 
  103  if ( mBand < 1 || mBand > layer->
bandCount() )
 
  104    throw QgsProcessingException( QObject::tr( 
"Invalid band number for BAND (%1): Valid values for input raster are 1 to %2" )
 
  108  mMinimum = parameterAsDouble( parameters, QStringLiteral( 
"MINIMUM" ), context );
 
  109  mMaximum = parameterAsDouble( parameters, QStringLiteral( 
"MAXIMUM" ), context );
 
  114  mLayerWidth = layer->
width();
 
  115  mLayerHeight = layer->
height();
 
  116  mExtent = layer->
extent();
 
  117  if ( parameters.value( QStringLiteral( 
"NODATA" ) ).isValid() )
 
  119    mNoData = parameterAsDouble( parameters, QStringLiteral( 
"NODATA" ), context );
 
  126  if ( std::isfinite( mNoData ) )
 
  129    if ( mNoData < std::numeric_limits<float>::lowest() )
 
  130      mNoData = std::numeric_limits<float>::lowest();
 
  131    else if ( mNoData > std::numeric_limits<float>::max() )
 
  132      mNoData = std::numeric_limits<float>::max();
 
  135  mXSize = mInterface->xSize();
 
  136  mYSize = mInterface->ySize();
 
  143  feedback->
pushInfo( QObject::tr( 
"Calculating raster minimum and maximum values…" ) );
 
  146  feedback->
pushInfo( QObject::tr( 
"Rescaling values…" ) );
 
  148  QString creationOptions = parameterAsString( parameters, QStringLiteral( 
"CREATION_OPTIONS" ), context ).trimmed();
 
  150  const QString optionsString = parameterAsString( parameters, QStringLiteral( 
"CREATE_OPTIONS" ), context );
 
  151  if ( !optionsString.isEmpty() )
 
  152    creationOptions = optionsString;
 
  154  const QString outputFile = parameterAsOutputLayer( parameters, QStringLiteral( 
"OUTPUT" ), context );
 
  155  const QFileInfo fi( outputFile );
 
  157  auto writer = std::make_unique<QgsRasterFileWriter>( outputFile );
 
  158  writer->setOutputProviderKey( QStringLiteral( 
"gdal" ) );
 
  159  if ( !creationOptions.isEmpty() )
 
  161    writer->setCreationOptions( creationOptions.split( 
'|' ) );
 
  164  writer->setOutputFormat( outputFormat );
 
  165  std::unique_ptr<QgsRasterDataProvider> provider( writer->createOneBandRaster( 
Qgis::DataType::Float32, mXSize, mYSize, mExtent, mCrs ) );
 
  168  if ( !provider->isValid() )
 
  177  const int numBlocksX = 
static_cast<int>( std::ceil( 1.0 * mLayerWidth / blockWidth ) );
 
  178  const int numBlocksY = 
static_cast<int>( std::ceil( 1.0 * mLayerHeight / blockHeight ) );
 
  179  const int numBlocks = numBlocksX * numBlocksY;
 
  182  iter.startRasterRead( mBand, mLayerWidth, mLayerHeight, mExtent );
 
  187  std::unique_ptr<QgsRasterBlock> inputBlock;
 
  188  while ( iter.readNextRasterPart( mBand, iterCols, iterRows, inputBlock, iterLeft, iterTop ) )
 
  190    auto outputBlock = std::make_unique<QgsRasterBlock>( destProvider->
dataType( 1 ), iterCols, iterRows );
 
  191    feedback->
setProgress( 100 * ( ( iterTop / blockHeight * numBlocksX ) + iterLeft / blockWidth ) / numBlocks );
 
  193    for ( 
int row = 0; row < iterRows; row++ )
 
  198      for ( 
int col = 0; col < iterCols; col++ )
 
  200        bool isNoData = 
false;
 
  201        const double val = inputBlock->valueAndNoData( row, col, isNoData );
 
  204          outputBlock->setValue( row, col, mNoData );
 
  209          outputBlock->setValue( row, col, newValue );
 
  213    if ( !destProvider->
writeBlock( outputBlock.get(), mBand, iterLeft, iterTop ) )
 
  221  outputs.insert( QStringLiteral( 
"OUTPUT" ), outputFile );
 
@ Float32
Thirty two bit floating point (float)
 
@ Hidden
Parameter is hidden and should not be shown to users.
 
@ Advanced
Parameter is an advanced parameter which should be hidden from users by default.
 
@ Double
Double/float values.
 
virtual QgsError error() const
Gets current status error.
 
QString summary() const
Short error description, usually the first error in chain, the real error.
 
bool isCanceled() const
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.
 
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.
 
QgsRasterDataProvider * clone() const override=0
Clone itself, create deep copy.
 
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.
 
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.