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 = std::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::DataType::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 = std::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 const QFileInfo fi( outputFile );
122 std::unique_ptr< QgsRasterFileWriter > writer = std::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 const 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();