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 & )
48 addParameter(
new QgsProcessingParameterBoolean( QStringLiteral(
"NODATA_AS_FALSE" ), QObject::tr(
"Treat NoData values as false" ),
false ) );
52 addParameter( noDataValueParam.release() );
54 std::unique_ptr<QgsProcessingParameterDefinition> typeChoice = QgsRasterAnalysisUtils::createRasterTypeParameter( QStringLiteral(
"DATA_TYPE" ), QObject::tr(
"Output data type" ),
Qgis::DataType::Float32 );
56 addParameter( typeChoice.release() );
60 auto createOptsParam = std::make_unique<QgsProcessingParameterString>( QStringLiteral(
"CREATE_OPTIONS" ), QObject::tr(
"Creation options" ), QVariant(),
false,
true );
61 createOptsParam->setMetadata( QVariantMap( { { QStringLiteral(
"widget_wrapper" ), QVariantMap( { { QStringLiteral(
"widget_type" ), QStringLiteral(
"rasteroptions" ) } } ) } } ) );
63 addParameter( createOptsParam.release() );
65 auto creationOptsParam = std::make_unique<QgsProcessingParameterString>( QStringLiteral(
"CREATION_OPTIONS" ), QObject::tr(
"Creation options" ), QVariant(),
false,
true );
66 creationOptsParam->setMetadata( QVariantMap( { { QStringLiteral(
"widget_wrapper" ), QVariantMap( { { QStringLiteral(
"widget_type" ), QStringLiteral(
"rasteroptions" ) } } ) } } ) );
68 addParameter( creationOptsParam.release() );
77 addOutput(
new QgsProcessingOutputNumber( QStringLiteral(
"NODATA_PIXEL_COUNT" ), QObject::tr(
"NoData pixel count" ) ) );
84 QgsRasterLayer *referenceLayer = parameterAsRasterLayer( parameters, QStringLiteral(
"REF_LAYER" ), context );
85 if ( !referenceLayer )
87 mCrs = referenceLayer->
crs();
90 mLayerWidth = referenceLayer->
width();
91 mLayerHeight = referenceLayer->
height();
92 mExtent = referenceLayer->
extent();
93 mNoDataValue = parameterAsDouble( parameters, QStringLiteral(
"NO_DATA" ), context );
94 mDataType = QgsRasterAnalysisUtils::rasterTypeChoiceToDataType( parameterAsEnum( parameters, QStringLiteral(
"DATA_TYPE" ), context ) );
95 if ( mDataType ==
Qgis::DataType::Int8 && atoi( GDALVersionInfo(
"VERSION_NUM" ) ) < GDAL_COMPUTE_VERSION( 3, 7, 0 ) )
98 mTreatNodataAsFalse = parameterAsBoolean( parameters, QStringLiteral(
"NODATA_AS_FALSE" ), context );
100 const QList<QgsMapLayer *> layers = parameterAsLayerList( parameters, QStringLiteral(
"INPUT" ), context );
101 QList<QgsRasterLayer *> rasterLayers;
102 rasterLayers.reserve( layers.count() );
108 QgsRasterAnalysisUtils::RasterLogicInput input;
112 input.interface = input.sourceDataProvider.get();
114 if ( layer->
crs() != mCrs )
116 input.projector = std::make_unique<QgsRasterProjector>();
117 input.projector->setInput( input.sourceDataProvider.get() );
119 input.interface = input.projector.get();
121 mInputs.emplace_back( std::move( input ) );
130 QString creationOptions = parameterAsString( parameters, QStringLiteral(
"CREATION_OPTIONS" ), context ).trimmed();
132 const QString optionsString = parameterAsString( parameters, QStringLiteral(
"CREATE_OPTIONS" ), context );
133 if ( !optionsString.isEmpty() )
134 creationOptions = optionsString;
136 const QString outputFile = parameterAsOutputLayer( parameters, QStringLiteral(
"OUTPUT" ), context );
137 const QFileInfo fi( outputFile );
140 auto writer = std::make_unique<QgsRasterFileWriter>( outputFile );
141 writer->setOutputProviderKey( QStringLiteral(
"gdal" ) );
142 if ( !creationOptions.isEmpty() )
144 writer->setCreationOptions( creationOptions.split(
'|' ) );
146 writer->setOutputFormat( outputFormat );
147 std::unique_ptr<QgsRasterDataProvider> provider( writer->createOneBandRaster( mDataType, mLayerWidth, mLayerHeight, mExtent, mCrs ) );
150 if ( !provider->isValid() )
153 provider->setNoDataValue( 1, mNoDataValue );
157 const qgssize layerSize =
static_cast<qgssize>( mLayerWidth ) *
static_cast<qgssize>( mLayerHeight );
159 QgsRasterAnalysisUtils::applyRasterLogicOperator( mInputs, provider.get(), mNoDataValue, mTreatNodataAsFalse, mLayerWidth, mLayerHeight, mExtent, feedback, mExtractValFunc, noDataCount, trueCount, falseCount );
162 outputs.insert( QStringLiteral(
"EXTENT" ), mExtent.toString() );
163 outputs.insert( QStringLiteral(
"CRS_AUTHID" ), mCrs.authid() );
164 outputs.insert( QStringLiteral(
"WIDTH_IN_PIXELS" ), mLayerWidth );
165 outputs.insert( QStringLiteral(
"HEIGHT_IN_PIXELS" ), mLayerHeight );
166 outputs.insert( QStringLiteral(
"TOTAL_PIXEL_COUNT" ), layerSize );
167 outputs.insert( QStringLiteral(
"NODATA_PIXEL_COUNT" ), noDataCount );
168 outputs.insert( QStringLiteral(
"TRUE_PIXEL_COUNT" ), trueCount );
169 outputs.insert( QStringLiteral(
"FALSE_PIXEL_COUNT" ), falseCount );
170 outputs.insert( QStringLiteral(
"OUTPUT" ), outputFile );
180QgsRasterLogicalOrAlgorithm::QgsRasterLogicalOrAlgorithm()
182 mExtractValFunc = [=](
const std::vector<std::unique_ptr<QgsRasterBlock>> &inputs,
bool &res,
bool &resIsNoData,
int row,
int column,
bool treatNoDataAsFalse ) {
185 bool isNoData =
false;
186 for (
auto &block : inputs )
189 if ( !block || !block->isValid() )
191 if ( treatNoDataAsFalse )
201 value = block->valueAndNoData( row, column, isNoData );
202 if ( isNoData && !treatNoDataAsFalse )
210 if ( treatNoDataAsFalse )
218QString QgsRasterLogicalOrAlgorithm::name()
const
220 return QStringLiteral(
"rasterlogicalor" );
223QString QgsRasterLogicalOrAlgorithm::displayName()
const
225 return QObject::tr(
"Raster boolean OR" );
229QString QgsRasterLogicalOrAlgorithm::shortDescription()
const
231 return QObject::tr(
"Calculates the boolean OR for a set of input raster layers" );
234QString QgsRasterLogicalOrAlgorithm::shortHelpString()
const
236 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, "
237 "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"
238 "The reference layer parameter specifies an existing raster layer to use as a reference when creating the output raster. The output raster "
239 "will have the same extent, CRS, and pixel dimensions as this layer.\n\n"
240 "By default, a NoData pixel in ANY of the input layers will result in a NoData pixel in the output raster. If the "
241 "'Treat NoData values as false' option is checked, then NoData inputs will be treated the same as a 0 input value." );
244QgsRasterLogicalOrAlgorithm *QgsRasterLogicalOrAlgorithm::createInstance()
const
246 return new QgsRasterLogicalOrAlgorithm();
253QgsRasterLogicalAndAlgorithm::QgsRasterLogicalAndAlgorithm()
255 mExtractValFunc = [=](
const std::vector<std::unique_ptr<QgsRasterBlock>> &inputs,
bool &res,
bool &resIsNoData,
int row,
int column,
bool treatNoDataAsFalse ) {
258 bool isNoData =
false;
259 for (
auto &block : inputs )
262 if ( !block || !block->isValid() )
264 if ( treatNoDataAsFalse )
277 value = block->valueAndNoData( row, column, isNoData );
278 if ( isNoData && !treatNoDataAsFalse )
286 if ( treatNoDataAsFalse )
294QString QgsRasterLogicalAndAlgorithm::name()
const
296 return QStringLiteral(
"rasterbooleanand" );
299QString QgsRasterLogicalAndAlgorithm::displayName()
const
301 return QObject::tr(
"Raster boolean AND" );
305QString QgsRasterLogicalAndAlgorithm::shortDescription()
const
307 return QObject::tr(
"Calculates the boolean AND for a set of input raster layers" );
310QString QgsRasterLogicalAndAlgorithm::shortHelpString()
const
312 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, "
313 "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"
314 "The reference layer parameter specifies an existing raster layer to use as a reference when creating the output raster. The output raster "
315 "will have the same extent, CRS, and pixel dimensions as this layer.\n\n"
316 "By default, a NoData pixel in ANY of the input layers will result in a NoData pixel in the output raster. If the "
317 "'Treat NoData values as false' option is checked, then NoData inputs will be treated the same as a 0 input value." );
320QgsRasterLogicalAndAlgorithm *QgsRasterLogicalAndAlgorithm::createInstance()
const
322 return new QgsRasterLogicalAndAlgorithm();
@ Float32
Thirty two bit floating point (float)
@ Int8
Eight bit signed integer (qint8) (added in QGIS 3.30)
@ Hidden
Parameter is hidden and should not be shown to users.
@ Advanced
Parameter is an advanced parameter which should be hidden from users by default.
@ Double
Double/float values.
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.
A parameter for processing algorithms which accepts multiple map layers.
A raster layer destination parameter, for specifying the destination path for a raster layer created ...
A raster layer parameter for processing algorithms.
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)