29void QgsReclassifyUtils::reportClasses(
const QVector<QgsReclassifyUtils::RasterClass> &classes,
QgsProcessingFeedback *feedback )
32 feedback->
pushInfo( QObject::tr(
"Using classes:" ) );
33 for (
const RasterClass &
c : classes )
35 feedback->
pushInfo( QStringLiteral(
" %1) %2 %3 %4" ).arg( i ).arg(
c.asText() ).arg( QChar( 0x2192 ) ).arg(
c.value ) );
40void QgsReclassifyUtils::checkForOverlaps(
const QVector<QgsReclassifyUtils::RasterClass> &classes,
QgsProcessingFeedback *feedback )
43 for (
int i = 0; i < classes.count() - 1; i++ )
45 for (
int j = i + 1; j < classes.count(); j++ )
47 const QgsReclassifyUtils::RasterClass &class1 = classes.at( i );
48 const QgsReclassifyUtils::RasterClass &class2 = classes.at( j );
49 if ( class1.overlaps( class2 ) )
51 feedback->
reportError( QObject::tr(
"Warning: Class %1 (%2) overlaps with class %3 (%4)" ).arg( i + 1 ).arg( class1.asText() ).arg( j + 1 ).arg( class2.asText() ) );
63 iter.startRasterRead( band, sourceWidthPixels, sourceHeightPixels, extent );
65 const int nbBlocksWidth =
static_cast<int>( std::ceil( 1.0 * sourceWidthPixels / maxWidth ) );
66 const int nbBlocksHeight =
static_cast<int>( std::ceil( 1.0 * sourceHeightPixels / maxHeight ) );
67 const int nbBlocks = nbBlocksWidth * nbBlocksHeight;
74 std::unique_ptr<QgsRasterBlock> rasterBlock;
75 bool reclassed =
false;
76 bool isNoData =
false;
77 while ( iter.readNextRasterPart( band, iterCols, iterRows, rasterBlock, iterLeft, iterTop ) )
80 feedback->
setProgress( 100 * ( ( iterTop / maxHeight * nbBlocksWidth ) + iterLeft / maxWidth ) / nbBlocks );
83 auto reclassifiedBlock = std::make_unique<QgsRasterBlock>( destinationRaster->
dataType( 1 ), iterCols, iterRows );
85 for (
int row = 0; row < iterRows; row++ )
89 for (
int column = 0; column < iterCols; column++ )
91 const double value = rasterBlock->valueAndNoData( row, column, isNoData );
93 reclassifiedBlock->setValue( row, column, destNoDataValue );
96 const double newValue = reclassifyValue( classes, value, reclassed );
98 reclassifiedBlock->setValue( row, column, newValue );
100 reclassifiedBlock->setValue( row, column, useNoDataForMissingValues ? destNoDataValue : value );
104 if ( !destinationRaster->
writeBlock( reclassifiedBlock.get(), 1, iterLeft, iterTop ) )
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.
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.
virtual void reportError(const QString &error, bool fatalError=false)
Reports that the algorithm encountered an error while executing.
Base class for raster data providers.
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.
Base class for processing filters like renderers, reprojector, resampler etc.
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.
A rectangle specified with double values.
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into c