28QStringList QgsRasterBooleanLogicAlgorithmBase::tags()
const
30 return QObject::tr(
"logical,boolean" ).split(
',' );
33QString QgsRasterBooleanLogicAlgorithmBase::group()
const
35 return QObject::tr(
"Raster analysis" );
38QString QgsRasterBooleanLogicAlgorithmBase::groupId()
const
40 return QStringLiteral(
"rasteranalysis" );
43void QgsRasterBooleanLogicAlgorithmBase::initAlgorithm(
const QVariantMap & )
49 addParameter(
new QgsProcessingParameterBoolean( QStringLiteral(
"NODATA_AS_FALSE" ), QObject::tr(
"Treat nodata values as false" ),
false ) );
51 std::unique_ptr< QgsProcessingParameterNumber > noDataValueParam = std::make_unique< QgsProcessingParameterNumber >( QStringLiteral(
"NO_DATA" ),
54 addParameter( noDataValueParam.release() );
56 std::unique_ptr< QgsProcessingParameterDefinition > typeChoice = QgsRasterAnalysisUtils::createRasterTypeParameter( QStringLiteral(
"DATA_TYPE" ), QObject::tr(
"Output data type" ),
Qgis::DataType::Float32 );
58 addParameter( typeChoice.release() );
61 QObject::tr(
"Output layer" ) ) );
68 addOutput(
new QgsProcessingOutputNumber( QStringLiteral(
"NODATA_PIXEL_COUNT" ), QObject::tr(
"NODATA pixel count" ) ) );
75 QgsRasterLayer *referenceLayer = parameterAsRasterLayer( parameters, QStringLiteral(
"REF_LAYER" ), context );
76 if ( !referenceLayer )
78 mCrs = referenceLayer->
crs();
81 mLayerWidth = referenceLayer->
width();
82 mLayerHeight = referenceLayer->
height();
83 mExtent = referenceLayer->
extent();
84 mNoDataValue = parameterAsDouble( parameters, QStringLiteral(
"NO_DATA" ), context );
85 mDataType = QgsRasterAnalysisUtils::rasterTypeChoiceToDataType( parameterAsEnum( parameters, QStringLiteral(
"DATA_TYPE" ), context ) );
86 if ( mDataType ==
Qgis::DataType::Int8 && atoi( GDALVersionInfo(
"VERSION_NUM" ) ) < GDAL_COMPUTE_VERSION( 3, 7, 0 ) )
89 mTreatNodataAsFalse = parameterAsBoolean( parameters, QStringLiteral(
"NODATA_AS_FALSE" ), context );
91 const QList< QgsMapLayer * > layers = parameterAsLayerList( parameters, QStringLiteral(
"INPUT" ), context );
92 QList< QgsRasterLayer * > rasterLayers;
93 rasterLayers.reserve( layers.count() );
99 QgsRasterAnalysisUtils::RasterLogicInput input;
103 input.interface = input.sourceDataProvider.get();
105 if ( layer->
crs() != mCrs )
107 input.projector = std::make_unique< QgsRasterProjector >();
108 input.projector->setInput( input.sourceDataProvider.get() );
110 input.interface = input.projector.get();
112 mInputs.emplace_back( std::move( input ) );
121 const QString outputFile = parameterAsOutputLayer( parameters, QStringLiteral(
"OUTPUT" ), context );
122 const QFileInfo fi( outputFile );
125 std::unique_ptr< QgsRasterFileWriter > writer = std::make_unique< QgsRasterFileWriter >( outputFile );
126 writer->setOutputProviderKey( QStringLiteral(
"gdal" ) );
127 writer->setOutputFormat( outputFormat );
128 std::unique_ptr<QgsRasterDataProvider > provider( writer->createOneBandRaster( mDataType, mLayerWidth, mLayerHeight, mExtent, mCrs ) );
131 if ( !provider->isValid() )
134 provider->setNoDataValue( 1, mNoDataValue );
138 const qgssize layerSize =
static_cast< qgssize >( mLayerWidth ) *
static_cast< qgssize >( mLayerHeight );
140 QgsRasterAnalysisUtils::applyRasterLogicOperator( mInputs, provider.get(), mNoDataValue, mTreatNodataAsFalse, mLayerWidth, mLayerHeight,
141 mExtent, feedback, mExtractValFunc, noDataCount, trueCount, falseCount );
144 outputs.insert( QStringLiteral(
"EXTENT" ), mExtent.toString() );
145 outputs.insert( QStringLiteral(
"CRS_AUTHID" ), mCrs.authid() );
146 outputs.insert( QStringLiteral(
"WIDTH_IN_PIXELS" ), mLayerWidth );
147 outputs.insert( QStringLiteral(
"HEIGHT_IN_PIXELS" ), mLayerHeight );
148 outputs.insert( QStringLiteral(
"TOTAL_PIXEL_COUNT" ), layerSize );
149 outputs.insert( QStringLiteral(
"NODATA_PIXEL_COUNT" ), noDataCount );
150 outputs.insert( QStringLiteral(
"TRUE_PIXEL_COUNT" ), trueCount );
151 outputs.insert( QStringLiteral(
"FALSE_PIXEL_COUNT" ), falseCount );
152 outputs.insert( QStringLiteral(
"OUTPUT" ), outputFile );
162QgsRasterLogicalOrAlgorithm::QgsRasterLogicalOrAlgorithm()
164 mExtractValFunc = [ = ](
const std::vector< std::unique_ptr< QgsRasterBlock > > &inputs,
bool & res,
bool & resIsNoData,
int row,
int column,
bool treatNoDataAsFalse )
168 bool isNoData =
false;
169 for (
auto &block : inputs )
172 if ( !block || !block->isValid() )
174 if ( treatNoDataAsFalse )
184 value = block->valueAndNoData( row, column, isNoData );
185 if ( isNoData && !treatNoDataAsFalse )
193 if ( treatNoDataAsFalse )
201QString QgsRasterLogicalOrAlgorithm::name()
const
203 return QStringLiteral(
"rasterlogicalor" );
206QString QgsRasterLogicalOrAlgorithm::displayName()
const
208 return QObject::tr(
"Raster boolean OR" );
212QString QgsRasterLogicalOrAlgorithm::shortDescription()
const
214 return QObject::tr(
"Calculates the boolean OR for a set of input raster layers" );
217QString QgsRasterLogicalOrAlgorithm::shortHelpString()
const
219 return QObject::tr(
"This algorithm calculates the boolean OR for a set of input rasters. If any of the input rasters have a non-zero value for a pixel, "
220 "that pixel will be set to 1 in the output raster. If all the input rasters have 0 values for the pixel it will be set to 0 in the output raster.\n\n"
221 "The reference layer parameter specifies an existing raster layer to use as a reference when creating the output raster. The output raster "
222 "will have the same extent, CRS, and pixel dimensions as this layer.\n\n"
223 "By default, a nodata pixel in ANY of the input layers will result in a nodata pixel in the output raster. If the "
224 "'Treat nodata values as false' option is checked, then nodata inputs will be treated the same as a 0 input value." );
227QgsRasterLogicalOrAlgorithm *QgsRasterLogicalOrAlgorithm::createInstance()
const
229 return new QgsRasterLogicalOrAlgorithm();
236QgsRasterLogicalAndAlgorithm::QgsRasterLogicalAndAlgorithm()
238 mExtractValFunc = [ = ](
const std::vector< std::unique_ptr< QgsRasterBlock > > &inputs,
bool & res,
bool & resIsNoData,
int row,
int column,
bool treatNoDataAsFalse )
242 bool isNoData =
false;
243 for (
auto &block : inputs )
246 if ( !block || !block->isValid() )
248 if ( treatNoDataAsFalse )
261 value = block->valueAndNoData( row, column, isNoData );
262 if ( isNoData && !treatNoDataAsFalse )
270 if ( treatNoDataAsFalse )
278QString QgsRasterLogicalAndAlgorithm::name()
const
280 return QStringLiteral(
"rasterbooleanand" );
283QString QgsRasterLogicalAndAlgorithm::displayName()
const
285 return QObject::tr(
"Raster boolean AND" );
289QString QgsRasterLogicalAndAlgorithm::shortDescription()
const
291 return QObject::tr(
"Calculates the boolean AND for a set of input raster layers" );
294QString QgsRasterLogicalAndAlgorithm::shortHelpString()
const
296 return QObject::tr(
"This algorithm calculates the boolean AND for a set of input rasters. If all of the input rasters have a non-zero value for a pixel, "
297 "that pixel will be set to 1 in the output raster. If any of the input rasters have 0 values for the pixel it will be set to 0 in the output raster.\n\n"
298 "The reference layer parameter specifies an existing raster layer to use as a reference when creating the output raster. The output raster "
299 "will have the same extent, CRS, and pixel dimensions as this layer.\n\n"
300 "By default, a nodata pixel in ANY of the input layers will result in a nodata pixel in the output raster. If the "
301 "'Treat nodata values as false' option is checked, then nodata inputs will be treated the same as a 0 input value." );
304QgsRasterLogicalAndAlgorithm *QgsRasterLogicalAndAlgorithm::createInstance()
const
306 return new QgsRasterLogicalAndAlgorithm();
@ Float32
Thirty two bit floating point (float)
@ Int8
Eight bit signed integer (qint8) (added in QGIS 3.30)
Base class for all map layer types.
virtual QgsRectangle extent() const
Returns the extent of the layer.
QgsCoordinateReferenceSystem crs
Contains information about the context in which a processing algorithm is executed.
QgsCoordinateTransformContext transformContext() const
Returns the coordinate transform context.
Custom exception class for processing related exceptions.
Base class for providing feedback from a processing algorithm.
A numeric output for processing algorithms.
A string output for processing algorithms.
A boolean parameter for processing algorithms.
@ FlagAdvanced
Parameter is an advanced parameter which should be hidden from users by default.
A parameter for processing algorithms which accepts multiple map layers.
@ 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.
@ TypeRaster
Raster layers.
QgsRasterDataProvider * clone() const override=0
Clone itself, create deep copy.
virtual bool sourceHasNoDataValue(int bandNo) const
Returns true if source band has no data value.
static QString driverForExtension(const QString &extension)
Returns the GDAL driver name for a specified file extension.
Represents a raster layer.
int height() const
Returns the height of the (unclipped) raster.
double rasterUnitsPerPixelX() const
Returns the number of raster units per each raster pixel in X axis.
QgsRasterDataProvider * dataProvider() override
Returns the source data provider.
double rasterUnitsPerPixelY() const
Returns the number of raster units per each raster pixel in Y axis.
int width() const
Returns the width of the (unclipped) raster.
unsigned long long qgssize
Qgssize is used instead of size_t, because size_t is stdlib type, unknown by SIP, and it would be har...
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)