29 void 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 )
37 .arg( QChar( 0x2192 ) )
43 void QgsReclassifyUtils::checkForOverlaps(
const QVector<QgsReclassifyUtils::RasterClass> &classes,
QgsProcessingFeedback *feedback )
46 for (
int i = 0; i < classes.count() - 1; i++ )
48 for (
int j = i + 1; j < classes.count(); j++ )
50 const QgsReclassifyUtils::RasterClass &class1 = classes.at( i );
51 const QgsReclassifyUtils::RasterClass &class2 = classes.at( j );
52 if ( class1.overlaps( class2 ) )
54 feedback->
reportError( QObject::tr(
"Warning: Class %1 (%2) overlaps with class %3 (%4)" ).arg( i + 1 )
55 .arg( class1.asText() )
57 .arg( class2.asText() ) );
63 void QgsReclassifyUtils::reclassify(
const QVector<QgsReclassifyUtils::RasterClass> &classes,
QgsRasterInterface *sourceRaster,
int band,
64 const QgsRectangle &extent,
int sourceWidthPixels,
int sourceHeightPixels,
72 iter.startRasterRead( band, sourceWidthPixels, sourceHeightPixels, extent );
74 int nbBlocksWidth =
static_cast< int >( std::ceil( 1.0 * sourceWidthPixels / maxWidth ) );
75 int nbBlocksHeight =
static_cast< int >( std::ceil( 1.0 * sourceHeightPixels / maxHeight ) );
76 int nbBlocks = nbBlocksWidth * nbBlocksHeight;
83 std::unique_ptr< QgsRasterBlock > rasterBlock;
84 bool reclassed =
false;
85 while ( iter.readNextRasterPart( band, iterCols, iterRows, rasterBlock, iterLeft, iterTop ) )
88 feedback->
setProgress( 100 * ( ( iterTop / maxHeight * nbBlocksWidth ) + iterLeft / maxWidth ) / nbBlocks );
91 std::unique_ptr< QgsRasterBlock > reclassifiedBlock = qgis::make_unique< QgsRasterBlock >( destinationRaster->
dataType( 1 ), iterCols, iterRows );
93 for (
int row = 0; row < iterRows; row++ )
97 for (
int column = 0; column < iterCols; column++ )
99 if ( rasterBlock->isNoData( row, column ) )
100 reclassifiedBlock->setValue( row, column, destNoDataValue );
103 double value = rasterBlock->value( row, column );
104 double newValue = reclassifyValue( classes, value, reclassed );
106 reclassifiedBlock->setValue( row, column, newValue );
108 reclassifiedBlock->setValue( row, column, useNoDataForMissingValues ? destNoDataValue : value );
112 destinationRaster->
writeBlock( reclassifiedBlock.get(), 1, iterLeft, iterTop );
bool isCanceled() const
Tells whether the operation has been canceled already.
A rectangle specified with double values.
Base class for providing feedback from a processing algorithm.
Iterator for sequentially processing raster cells.
void setProgress(double progress)
Sets the current progress for the feedback object.
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
virtual bool setEditable(bool enabled)
Turns on/off editing mode of the provider.
static const int DEFAULT_MAXIMUM_TILE_HEIGHT
Default maximum tile height.
Base class for processing filters like renderers, reprojector, resampler etc.
bool writeBlock(QgsRasterBlock *block, int band, int xOffset=0, int yOffset=0)
Writes pixel data from a raster block into the provider data source.
static const int DEFAULT_MAXIMUM_TILE_WIDTH
Default maximum tile width.
virtual void reportError(const QString &error, bool fatalError=false)
Reports that the algorithm encountered an error while executing.
virtual void pushInfo(const QString &info)
Pushes a general informational message from the algorithm.
Qgis::DataType dataType(int bandNo) const override=0
Returns data type for the band specified by number.
Base class for raster data providers.