23QString QgsFillNoDataAlgorithm::name()
const
25 return QStringLiteral(
"fillnodata" );
28QString QgsFillNoDataAlgorithm::displayName()
const
30 return QObject::tr(
"Fill NoData cells" );
33QStringList QgsFillNoDataAlgorithm::tags()
const
35 return QObject::tr(
"data,cells,fill,set" ).split(
',' );
38QString QgsFillNoDataAlgorithm::group()
const
40 return QObject::tr(
"Raster tools" );
43QString QgsFillNoDataAlgorithm::groupId()
const
45 return QStringLiteral(
"rastertools" );
48void QgsFillNoDataAlgorithm::initAlgorithm(
const QVariantMap & )
51 addParameter(
new QgsProcessingParameterBand( QStringLiteral(
"BAND" ), QObject::tr(
"Band Number" ), 1, QStringLiteral(
"INPUT" ) ) );
54 std::unique_ptr< QgsProcessingParameterString > createOptsParam = std::make_unique< QgsProcessingParameterString >( QStringLiteral(
"CREATE_OPTIONS" ), QObject::tr(
"Creation options" ), QVariant(),
false,
true );
55 createOptsParam->setMetadata( QVariantMap( {{QStringLiteral(
"widget_wrapper" ), QVariantMap( {{QStringLiteral(
"widget_type" ), QStringLiteral(
"rasteroptions" ) }} ) }} ) );
57 addParameter( createOptsParam.release() );
62QString QgsFillNoDataAlgorithm::shortHelpString()
const
64 return QObject::tr(
"This algorithm resets the NoData values in the input raster "
65 "to a chosen value, resulting in a raster dataset with no NoData pixels. "
66 "This value can be set by the user using the Fill value parameter. "
67 "The algorithm respects the input raster data type (eg. a floating point fill value will be truncated "
68 "when applied to an integer raster)." );
71QgsFillNoDataAlgorithm *QgsFillNoDataAlgorithm::createInstance()
const
73 return new QgsFillNoDataAlgorithm();
79 mInputRaster = parameterAsRasterLayer( parameters, QStringLiteral(
"INPUT" ), context );
80 mFillValue = parameterAsDouble( parameters, QStringLiteral(
"FILL_VALUE" ), context );
85 mBand = parameterAsInt( parameters, QStringLiteral(
"BAND" ), context );
86 if ( mBand < 1 || mBand > mInputRaster->bandCount() )
87 throw QgsProcessingException( QObject::tr(
"Invalid band number for BAND (%1): Valid values for input raster are 1 to %2" ).arg( mBand ).arg( mInputRaster->bandCount() ) );
89 mInterface.reset( mInputRaster->dataProvider()->clone() );
90 mInputNoDataValue = mInputRaster->dataProvider()->sourceNoDataValue( mBand );
91 mExtent = mInputRaster->extent();
92 mLayerWidth = mInputRaster->width();
93 mLayerHeight = mInputRaster->height();
94 mCrs = mInputRaster->crs();
95 mNbCellsXProvider = mInterface->xSize();
96 mNbCellsYProvider = mInterface->ySize();
103 if ( !mInputRaster->dataProvider()->sourceHasNoDataValue( mBand ) )
104 feedback->
reportError( QObject::tr(
"Input raster has no NoData values. There exist no NoData cells to fill." ),
false );
107 const QString createOptions = parameterAsString( parameters, QStringLiteral(
"CREATE_OPTIONS" ), context ).trimmed();
108 const QString outputFile = parameterAsOutputLayer( parameters, QStringLiteral(
"OUTPUT" ), context );
109 const QFileInfo fi( outputFile );
111 std::unique_ptr< QgsRasterFileWriter > writer = std::make_unique< QgsRasterFileWriter >( outputFile );
112 writer->setOutputProviderKey( QStringLiteral(
"gdal" ) );
113 if ( !createOptions.isEmpty() )
115 writer->setCreateOptions( createOptions.split(
'|' ) );
117 writer->setOutputFormat( outputFormat );
118 std::unique_ptr<QgsRasterDataProvider > provider( writer->createOneBandRaster( mInterface->dataType( mBand ), mNbCellsXProvider, mNbCellsYProvider, mExtent, mCrs ) );
121 if ( !provider->isValid() )
126 destinationRasterProvider = provider.get();
131 const int nbBlocksWidth =
static_cast< int >( std::ceil( 1.0 * mLayerWidth / maxWidth ) );
132 const int nbBlocksHeight =
static_cast< int >( std::ceil( 1.0 * mLayerHeight / maxHeight ) );
133 const int nbBlocks = nbBlocksWidth * nbBlocksHeight;
136 iter.startRasterRead( mBand, mLayerWidth, mLayerHeight, mExtent );
141 std::unique_ptr< QgsRasterBlock > filledRasterBlock;
142 while ( iter.readNextRasterPart( mBand, iterCols, iterRows, filledRasterBlock, iterLeft, iterTop ) )
145 feedback->
setProgress( 100 * ( ( iterTop / maxHeight * nbBlocksWidth ) + iterLeft / maxWidth ) / nbBlocks );
150 if ( !filledRasterBlock->hasNoDataValue() )
152 destinationRasterProvider->
writeBlock( filledRasterBlock.get(), mBand, iterLeft, iterTop );
156 for (
int row = 0; row < iterRows; row++ )
160 for (
int column = 0; column < iterCols; column++ )
162 if ( filledRasterBlock->isNoData( row, column ) )
163 filledRasterBlock->setValue( row, column, mFillValue );
166 destinationRasterProvider->
writeBlock( filledRasterBlock.get(), mBand, iterLeft, iterTop );
171 outputs.insert( QStringLiteral(
"OUTPUT" ), outputFile );
@ Advanced
Parameter is an advanced parameter which should be hidden from users by default.
@ Double
Double/float values.
bool isCanceled() const
Tells whether the operation has been canceled already.
void setProgress(double progress)
Sets the current progress for the feedback object.
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 reportError(const QString &error, bool fatalError=false)
Reports that the algorithm encountered an error while executing.
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.
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.
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.