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)