27 QStringList QgsRasterBooleanLogicAlgorithmBase::tags()
const 29 return QObject::tr(
"logical,boolean" ).split(
',' );
32 QString QgsRasterBooleanLogicAlgorithmBase::group()
const 34 return QObject::tr(
"Raster analysis" );
37 QString QgsRasterBooleanLogicAlgorithmBase::groupId()
const 39 return QStringLiteral(
"rasteranalysis" );
42 void QgsRasterBooleanLogicAlgorithmBase::initAlgorithm(
const QVariantMap & )
48 addParameter(
new QgsProcessingParameterBoolean( QStringLiteral(
"NODATA_AS_FALSE" ), QObject::tr(
"Treat nodata values as false" ),
false ) );
50 std::unique_ptr< QgsProcessingParameterNumber > noDataValueParam = qgis::make_unique< QgsProcessingParameterNumber >( QStringLiteral(
"NO_DATA" ),
53 addParameter( noDataValueParam.release() );
55 std::unique_ptr< QgsProcessingParameterDefinition > typeChoice = QgsRasterAnalysisUtils::createRasterTypeParameter( QStringLiteral(
"DATA_TYPE" ), QObject::tr(
"Output data type" ),
Qgis::Float32 );
57 addParameter( typeChoice.release() );
60 QObject::tr(
"Output layer" ) ) );
67 addOutput(
new QgsProcessingOutputNumber( QStringLiteral(
"NODATA_PIXEL_COUNT" ), QObject::tr(
"NODATA pixel count" ) ) );
74 QgsRasterLayer *referenceLayer = parameterAsRasterLayer( parameters, QStringLiteral(
"REF_LAYER" ), context );
75 if ( !referenceLayer )
77 mCrs = referenceLayer->
crs();
80 mLayerWidth = referenceLayer->
width();
81 mLayerHeight = referenceLayer->
height();
82 mExtent = referenceLayer->
extent();
83 mNoDataValue = parameterAsDouble( parameters, QStringLiteral(
"NO_DATA" ), context );
84 mDataType = QgsRasterAnalysisUtils::rasterTypeChoiceToDataType( parameterAsEnum( parameters, QStringLiteral(
"DATA_TYPE" ), context ) );
86 mTreatNodataAsFalse = parameterAsBoolean( parameters, QStringLiteral(
"NODATA_AS_FALSE" ), context );
88 const QList< QgsMapLayer * > layers = parameterAsLayerList( parameters, QStringLiteral(
"INPUT" ), context );
89 QList< QgsRasterLayer * > rasterLayers;
90 rasterLayers.reserve( layers.count() );
96 QgsRasterAnalysisUtils::RasterLogicInput input;
100 input.interface = input.sourceDataProvider.get();
102 if ( layer->
crs() != mCrs )
104 input.projector = qgis::make_unique< QgsRasterProjector >();
105 input.projector->setInput( input.sourceDataProvider.get() );
107 input.interface = input.projector.get();
109 mInputs.emplace_back( std::move( input ) );
118 const QString outputFile = parameterAsOutputLayer( parameters, QStringLiteral(
"OUTPUT" ), context );
119 QFileInfo fi( outputFile );
122 std::unique_ptr< QgsRasterFileWriter > writer = qgis::make_unique< QgsRasterFileWriter >( outputFile );
123 writer->setOutputProviderKey( QStringLiteral(
"gdal" ) );
124 writer->setOutputFormat( outputFormat );
125 std::unique_ptr<QgsRasterDataProvider > provider( writer->createOneBandRaster( mDataType, mLayerWidth, mLayerHeight, mExtent, mCrs ) );
128 if ( !provider->isValid() )
131 provider->setNoDataValue( 1, mNoDataValue );
135 qgssize layerSize =
static_cast< qgssize >( mLayerWidth ) * static_cast< qgssize >( mLayerHeight );
137 QgsRasterAnalysisUtils::applyRasterLogicOperator( mInputs, provider.get(), mNoDataValue, mTreatNodataAsFalse, mLayerWidth, mLayerHeight,
138 mExtent, feedback, mExtractValFunc, noDataCount, trueCount, falseCount );
141 outputs.insert( QStringLiteral(
"EXTENT" ), mExtent.toString() );
142 outputs.insert( QStringLiteral(
"CRS_AUTHID" ), mCrs.authid() );
143 outputs.insert( QStringLiteral(
"WIDTH_IN_PIXELS" ), mLayerWidth );
144 outputs.insert( QStringLiteral(
"HEIGHT_IN_PIXELS" ), mLayerHeight );
145 outputs.insert( QStringLiteral(
"TOTAL_PIXEL_COUNT" ), layerSize );
146 outputs.insert( QStringLiteral(
"NODATA_PIXEL_COUNT" ), noDataCount );
147 outputs.insert( QStringLiteral(
"TRUE_PIXEL_COUNT" ), trueCount );
148 outputs.insert( QStringLiteral(
"FALSE_PIXEL_COUNT" ), falseCount );
149 outputs.insert( QStringLiteral(
"OUTPUT" ), outputFile );
159 QgsRasterLogicalOrAlgorithm::QgsRasterLogicalOrAlgorithm()
161 mExtractValFunc = [ = ](
const std::vector< std::unique_ptr< QgsRasterBlock > > &inputs,
bool & res,
bool & resIsNoData,
int row,
int column,
bool treatNoDataAsFalse )
165 bool isNoData =
false;
166 for (
auto &block : inputs )
169 if ( !block || !block->isValid() )
171 if ( treatNoDataAsFalse )
181 value = block->valueAndNoData( row, column, isNoData );
182 if ( isNoData && !treatNoDataAsFalse )
190 if ( treatNoDataAsFalse )
198 QString QgsRasterLogicalOrAlgorithm::name()
const 200 return QStringLiteral(
"rasterlogicalor" );
203 QString QgsRasterLogicalOrAlgorithm::displayName()
const 205 return QObject::tr(
"Raster boolean OR" );
209 QString QgsRasterLogicalOrAlgorithm::shortDescription()
const 211 return QObject::tr(
"Calculates the boolean OR for a set of input raster layers" );
214 QString QgsRasterLogicalOrAlgorithm::shortHelpString()
const 216 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, " 217 "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" 218 "The reference layer parameter specifies an existing raster layer to use as a reference when creating the output raster. The output raster " 219 "will have the same extent, CRS, and pixel dimensions as this layer.\n\n" 220 "By default, a nodata pixel in ANY of the input layers will result in a nodata pixel in the output raster. If the " 221 "'Treat nodata values as false' option is checked, then nodata inputs will be treated the same as a 0 input value." );
224 QgsRasterLogicalOrAlgorithm *QgsRasterLogicalOrAlgorithm::createInstance()
const 226 return new QgsRasterLogicalOrAlgorithm();
233 QgsRasterLogicalAndAlgorithm::QgsRasterLogicalAndAlgorithm()
235 mExtractValFunc = [ = ](
const std::vector< std::unique_ptr< QgsRasterBlock > > &inputs,
bool & res,
bool & resIsNoData,
int row,
int column,
bool treatNoDataAsFalse )
239 bool isNoData =
false;
240 for (
auto &block : inputs )
243 if ( !block || !block->isValid() )
245 if ( treatNoDataAsFalse )
258 value = block->valueAndNoData( row, column, isNoData );
259 if ( isNoData && !treatNoDataAsFalse )
267 if ( treatNoDataAsFalse )
275 QString QgsRasterLogicalAndAlgorithm::name()
const 277 return QStringLiteral(
"rasterbooleanand" );
280 QString QgsRasterLogicalAndAlgorithm::displayName()
const 282 return QObject::tr(
"Raster boolean AND" );
286 QString QgsRasterLogicalAndAlgorithm::shortDescription()
const 288 return QObject::tr(
"Calculates the boolean AND for a set of input raster layers" );
291 QString QgsRasterLogicalAndAlgorithm::shortHelpString()
const 293 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, " 294 "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" 295 "The reference layer parameter specifies an existing raster layer to use as a reference when creating the output raster. The output raster " 296 "will have the same extent, CRS, and pixel dimensions as this layer.\n\n" 297 "By default, a nodata pixel in ANY of the input layers will result in a nodata pixel in the output raster. If the " 298 "'Treat nodata values as false' option is checked, then nodata inputs will be treated the same as a 0 input value." );
301 QgsRasterLogicalAndAlgorithm *QgsRasterLogicalAndAlgorithm::createInstance()
const 303 return new QgsRasterLogicalAndAlgorithm();
A boolean parameter for processing algorithms.
int width() const
Returns the width of the (unclipped) raster.
A parameter for processing algorithms which accepts multiple map layers.
Base class for all map layer types.
Base class for providing feedback from a processing algorithm.
Parameter is an advanced parameter which should be hidden from users by default.
This class provides qgis with the ability to render raster datasets onto the mapcanvas.
double rasterUnitsPerPixelX() const
Returns the number of raster units per each raster pixel in X axis.
QgsRasterInterface * clone() const override=0
Clone itself, create deep copy.
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
double rasterUnitsPerPixelY() const
Returns the number of raster units per each raster pixel in Y axis.
A numeric output for processing algorithms.
int height() const
Returns the height of the (unclipped) raster.
Thirty two bit floating point (float)
virtual QgsRectangle extent() const
Returns the extent of the layer.
A raster layer destination parameter, for specifying the destination path for a raster layer created ...
static QString driverForExtension(const QString &extension)
Returns the GDAL driver name for a specified file extension.
A string output for processing algorithms.
QgsRasterDataProvider * dataProvider() override
Returns the layer's data provider, it may be nullptr.
A raster layer parameter for processing algorithms.
Custom exception class for processing related exceptions.
QgsCoordinateTransformContext transformContext() const
Returns the coordinate transform context.
virtual bool sourceHasNoDataValue(int bandNo) const
Returns true if source band has no data value.
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...
Contains information about the context in which a processing algorithm is executed.
QgsCoordinateReferenceSystem crs