29QString QgsRasterFrequencyByComparisonOperatorBase::group()
 const 
   31  return QObject::tr( 
"Raster analysis" );
 
   34QString QgsRasterFrequencyByComparisonOperatorBase::groupId()
 const 
   36  return QStringLiteral( 
"rasteranalysis" );
 
   39void QgsRasterFrequencyByComparisonOperatorBase::initAlgorithm( 
const QVariantMap & )
 
   42  addParameter( 
new QgsProcessingParameterBand( QStringLiteral( 
"INPUT_VALUE_RASTER_BAND" ), QObject::tr( 
"Value raster band" ), 1, QStringLiteral( 
"INPUT_VALUE_RASTER" ) ) );
 
   46  auto output_nodata_parameter = std::make_unique<QgsProcessingParameterNumber>( QStringLiteral( 
"OUTPUT_NODATA_VALUE" ), QObject::tr( 
"Output NoData value" ), 
Qgis::ProcessingNumberParameterType::Double, -9999, 
true );
 
   48  addParameter( output_nodata_parameter.release() );
 
   52  auto createOptsParam = std::make_unique<QgsProcessingParameterString>( QStringLiteral( 
"CREATE_OPTIONS" ), QObject::tr( 
"Creation options" ), QVariant(), 
false, 
true );
 
   53  createOptsParam->setMetadata( QVariantMap( { { QStringLiteral( 
"widget_wrapper" ), QVariantMap( { { QStringLiteral( 
"widget_type" ), QStringLiteral( 
"rasteroptions" ) } } ) } } ) );
 
   55  addParameter( createOptsParam.release() );
 
   57  auto creationOptsParam = std::make_unique<QgsProcessingParameterString>( QStringLiteral( 
"CREATION_OPTIONS" ), QObject::tr( 
"Creation options" ), QVariant(), 
false, 
true );
 
   58  creationOptsParam->setMetadata( QVariantMap( { { QStringLiteral( 
"widget_wrapper" ), QVariantMap( { { QStringLiteral( 
"widget_type" ), QStringLiteral( 
"rasteroptions" ) } } ) } } ) );
 
   60  addParameter( creationOptsParam.release() );
 
   63  addOutput( 
new QgsProcessingOutputNumber( QStringLiteral( 
"OCCURRENCE_COUNT" ), QObject::tr( 
"Count of value occurrences" ) ) );
 
   64  addOutput( 
new QgsProcessingOutputNumber( QStringLiteral( 
"FOUND_LOCATIONS_COUNT" ), QObject::tr( 
"Count of cells with equal value occurrences" ) ) );
 
   65  addOutput( 
new QgsProcessingOutputNumber( QStringLiteral( 
"MEAN_FREQUENCY_PER_LOCATION" ), QObject::tr( 
"Mean frequency at valid cell locations" ) ) );
 
   75  QgsRasterLayer *inputValueRaster = parameterAsRasterLayer( parameters, QStringLiteral( 
"INPUT_VALUE_RASTER" ), context );
 
   76  if ( !inputValueRaster )
 
   79  mInputValueRasterBand = parameterAsInt( parameters, QStringLiteral( 
"INPUT_VALUE_RASTER_BAND" ), context );
 
   80  mIgnoreNoData = parameterAsBool( parameters, QStringLiteral( 
"IGNORE_NODATA" ), context );
 
   83  mNoDataValue = parameterAsDouble( parameters, QStringLiteral( 
"OUTPUT_NODATA_VALUE" ), context );
 
   84  mCrs = inputValueRaster->
crs();
 
   87  mLayerWidth = inputValueRaster->
width();
 
   88  mLayerHeight = inputValueRaster->
height();
 
   89  mExtent = inputValueRaster->
extent();
 
   91  const QList<QgsMapLayer *> layers = parameterAsLayerList( parameters, QStringLiteral( 
"INPUT_RASTERS" ), context );
 
   92  QList<QgsRasterLayer *> rasterLayers;
 
   93  rasterLayers.reserve( layers.count() );
 
  102      QgsRasterAnalysisUtils::RasterLogicInput input;
 
  106      input.interface = input.sourceDataProvider.get();
 
  108      if ( layer->
crs() != mCrs )
 
  110        input.projector = std::make_unique<QgsRasterProjector>();
 
  111        input.projector->setInput( input.sourceDataProvider.get() );
 
  113        input.interface = input.projector.get();
 
  115      mInputs.emplace_back( std::move( input ) );
 
  124  QString creationOptions = parameterAsString( parameters, QStringLiteral( 
"CREATION_OPTIONS" ), context ).trimmed();
 
  126  const QString optionsString = parameterAsString( parameters, QStringLiteral( 
"CREATE_OPTIONS" ), context );
 
  127  if ( !optionsString.isEmpty() )
 
  128    creationOptions = optionsString;
 
  130  const QString outputFile = parameterAsOutputLayer( parameters, QStringLiteral( 
"OUTPUT" ), context );
 
  131  const QFileInfo fi( outputFile );
 
  134  auto writer = std::make_unique<QgsRasterFileWriter>( outputFile );
 
  135  writer->setOutputProviderKey( QStringLiteral( 
"gdal" ) );
 
  136  if ( !creationOptions.isEmpty() )
 
  138    writer->setCreationOptions( creationOptions.split( 
'|' ) );
 
  140  writer->setOutputFormat( outputFormat );
 
  141  std::unique_ptr<QgsRasterDataProvider> provider( writer->createOneBandRaster( 
Qgis::DataType::Int32, mLayerWidth, mLayerHeight, mExtent, mCrs ) );
 
  144  if ( !provider->isValid() )
 
  147  provider->setNoDataValue( 1, mNoDataValue );
 
  148  const qgssize layerSize = 
static_cast<qgssize>( mLayerWidth ) * 
static_cast<qgssize>( mLayerHeight );
 
  152  const int nbBlocksWidth = 
static_cast<int>( std::ceil( 1.0 * mLayerWidth / maxWidth ) );
 
  153  const int nbBlocksHeight = 
static_cast<int>( std::ceil( 1.0 * mLayerHeight / maxHeight ) );
 
  154  const int nbBlocks = nbBlocksWidth * nbBlocksHeight;
 
  155  provider->setEditable( 
true );
 
  158  iter.startRasterRead( mInputValueRasterBand, mLayerWidth, mLayerHeight, mExtent );
 
  165  unsigned long long occurrenceCount = 0;
 
  166  unsigned long long noDataLocationsCount = 0;
 
  167  std::unique_ptr<QgsRasterBlock> inputBlock;
 
  168  while ( iter.readNextRasterPart( 1, iterCols, iterRows, inputBlock, iterLeft, iterTop, &blockExtent ) )
 
  170    std::vector<std::unique_ptr<QgsRasterBlock>> inputBlocks;
 
  171    for ( 
const QgsRasterAnalysisUtils::RasterLogicInput &i : mInputs )
 
  175      for ( 
const int band : i.bands )
 
  179        std::unique_ptr<QgsRasterBlock> b( i.interface->block( band, blockExtent, iterCols, iterRows ) );
 
  180        inputBlocks.emplace_back( std::move( b ) );
 
  185    feedback->
setProgress( 100 * ( ( iterTop / maxHeight * nbBlocksWidth ) + iterLeft / maxWidth ) / nbBlocks );
 
  186    for ( 
int row = 0; row < iterRows; row++ )
 
  191      for ( 
int col = 0; col < iterCols; col++ )
 
  193        bool valueRasterCellIsNoData = 
false;
 
  194        const double value = inputBlock->valueAndNoData( row, col, valueRasterCellIsNoData );
 
  196        if ( valueRasterCellIsNoData && !mIgnoreNoData )
 
  200          outputBlock->setValue( row, col, mNoDataValue );
 
  201          noDataLocationsCount++;
 
  205          bool noDataInStack = 
false;
 
  206          const std::vector<double> cellValues = QgsRasterAnalysisUtils::getCellValuesFromBlockStack( inputBlocks, row, col, noDataInStack );
 
  208          if ( noDataInStack && !mIgnoreNoData )
 
  210            outputBlock->setValue( row, col, mNoDataValue );
 
  211            noDataLocationsCount++;
 
  215            const int frequency = applyComparisonOperator( value, cellValues );
 
  216            outputBlock->setValue( row, col, frequency );
 
  217            occurrenceCount += frequency;
 
  222    if ( !provider->writeBlock( outputBlock.get(), 1, iterLeft, iterTop ) )
 
  224      throw QgsProcessingException( QObject::tr( 
"Could not write raster block: %1" ).arg( provider->error().summary() ) );
 
  227  provider->setEditable( 
false );
 
  229  const unsigned long long foundLocationsCount = layerSize - noDataLocationsCount;
 
  230  const double meanEqualCountPerValidLocation = 
static_cast<double>( occurrenceCount ) / 
static_cast<double>( foundLocationsCount * mInputs.size() );
 
  233  outputs.insert( QStringLiteral( 
"OCCURRENCE_COUNT" ), occurrenceCount );
 
  234  outputs.insert( QStringLiteral( 
"FOUND_LOCATIONS_COUNT" ), foundLocationsCount );
 
  235  outputs.insert( QStringLiteral( 
"MEAN_FREQUENCY_PER_LOCATION" ), meanEqualCountPerValidLocation );
 
  236  outputs.insert( QStringLiteral( 
"EXTENT" ), mExtent.toString() );
 
  237  outputs.insert( QStringLiteral( 
"CRS_AUTHID" ), mCrs.authid() );
 
  238  outputs.insert( QStringLiteral( 
"WIDTH_IN_PIXELS" ), mLayerWidth );
 
  239  outputs.insert( QStringLiteral( 
"HEIGHT_IN_PIXELS" ), mLayerHeight );
 
  240  outputs.insert( QStringLiteral( 
"TOTAL_PIXEL_COUNT" ), layerSize );
 
  241  outputs.insert( QStringLiteral( 
"OUTPUT" ), outputFile );
 
  250QString QgsRasterFrequencyByEqualOperatorAlgorithm::displayName()
 const 
  252  return QObject::tr( 
"Equal to frequency" );
 
  255QString QgsRasterFrequencyByEqualOperatorAlgorithm::name()
 const 
  257  return QStringLiteral( 
"equaltofrequency" );
 
  260QStringList QgsRasterFrequencyByEqualOperatorAlgorithm::tags()
 const 
  262  return QObject::tr( 
"cell,equal,frequency,pixel,stack" ).split( 
',' );
 
  265QString QgsRasterFrequencyByEqualOperatorAlgorithm::shortHelpString()
 const 
  267  return QObject::tr( 
"This algorithm evaluates on a cell-by-cell basis the frequency " 
  268                      "(number of times) the values of an input stack of rasters are equal " 
  269                      "to the value of a value raster. \n " 
  270                      "If multiband rasters are used in the data raster stack, the algorithm will always " 
  271                      "perform the analysis on the first band of the rasters - use GDAL to use other bands in the analysis. " 
  272                      "The input value layer serves as reference layer for the sample layers. " 
  273                      "Any NoData cells in the value raster or the data layer stack will result in a NoData cell " 
  274                      "in the output raster if the ignore NoData parameter is not checked. " 
  275                      "The output NoData value can be set manually. The output rasters extent and resolution " 
  276                      "is defined by the input raster layer and is always of int32 type." );
 
  279QString QgsRasterFrequencyByEqualOperatorAlgorithm::shortDescription()
 const 
  281  return QObject::tr( 
"Evaluates on a cell-by-cell basis the frequency (number of times) " 
  282                      "the values of an input stack of rasters are equal to the value of a value raster." );
 
  285QgsRasterFrequencyByEqualOperatorAlgorithm *QgsRasterFrequencyByEqualOperatorAlgorithm::createInstance()
 const 
  287  return new QgsRasterFrequencyByEqualOperatorAlgorithm();
 
  290int QgsRasterFrequencyByEqualOperatorAlgorithm::applyComparisonOperator( 
double searchValue, std::vector<double> cellValueStack )
 
  292  return static_cast<int>( std::count( cellValueStack.begin(), cellValueStack.end(), searchValue ) );
 
  299QString QgsRasterFrequencyByGreaterThanOperatorAlgorithm::displayName()
 const 
  301  return QObject::tr( 
"Greater than frequency" );
 
  304QString QgsRasterFrequencyByGreaterThanOperatorAlgorithm::name()
 const 
  306  return QStringLiteral( 
"greaterthanfrequency" );
 
  309QStringList QgsRasterFrequencyByGreaterThanOperatorAlgorithm::tags()
 const 
  311  return QObject::tr( 
"cell,greater,frequency,pixel,stack" ).split( 
',' );
 
  314QString QgsRasterFrequencyByGreaterThanOperatorAlgorithm::shortHelpString()
 const 
  316  return QObject::tr( 
"This algorithm evaluates on a cell-by-cell basis the frequency " 
  317                      "(number of times) the values of an input stack of rasters are greater than " 
  318                      "the value of a value raster. \n " 
  319                      "If multiband rasters are used in the data raster stack, the algorithm will always " 
  320                      "perform the analysis on the first band of the rasters - use GDAL to use other bands in the analysis. " 
  321                      "The input value layer serves as reference layer for the sample layers. " 
  322                      "Any NoData cells in the value raster or the data layer stack will result in a NoData cell " 
  323                      "in the output raster if the ignore NoData parameter is not checked. " 
  324                      "The output NoData value can be set manually. The output rasters extent and resolution " 
  325                      "is defined by the input raster layer and is always of int32 type." );
 
  328QString QgsRasterFrequencyByGreaterThanOperatorAlgorithm::shortDescription()
 const 
  330  return QObject::tr( 
"Evaluates on a cell-by-cell basis the frequency (number of times) " 
  331                      "the values of an input stack of rasters are greater than the value of a value raster." );
 
  334QgsRasterFrequencyByGreaterThanOperatorAlgorithm *QgsRasterFrequencyByGreaterThanOperatorAlgorithm::createInstance()
 const 
  336  return new QgsRasterFrequencyByGreaterThanOperatorAlgorithm();
 
  339int QgsRasterFrequencyByGreaterThanOperatorAlgorithm::applyComparisonOperator( 
double searchValue, std::vector<double> cellValueStack )
 
  341  return static_cast<int>( std::count_if( cellValueStack.begin(), cellValueStack.end(), [&]( 
double const &stackValue ) { return stackValue > searchValue; } ) );
 
  348QString QgsRasterFrequencyByLessThanOperatorAlgorithm::displayName()
 const 
  350  return QObject::tr( 
"Less than frequency" );
 
  353QString QgsRasterFrequencyByLessThanOperatorAlgorithm::name()
 const 
  355  return QStringLiteral( 
"lessthanfrequency" );
 
  358QStringList QgsRasterFrequencyByLessThanOperatorAlgorithm::tags()
 const 
  360  return QObject::tr( 
"cell,less,lower,frequency,pixel,stack" ).split( 
',' );
 
  363QString QgsRasterFrequencyByLessThanOperatorAlgorithm::shortHelpString()
 const 
  365  return QObject::tr( 
"This algorithm evaluates on a cell-by-cell basis the frequency " 
  366                      "(number of times) the values of an input stack of rasters are less than " 
  367                      "the value of a value raster. \n " 
  368                      "If multiband rasters are used in the data raster stack, the algorithm will always " 
  369                      "perform the analysis on the first band of the rasters - use GDAL to use other bands in the analysis. " 
  370                      "The input value layer serves as reference layer for the sample layers. " 
  371                      "Any NoData cells in the value raster or the data layer stack will result in a NoData cell " 
  372                      "in the output raster if the ignore NoData parameter is not checked. " 
  373                      "The output NoData value can be set manually. The output rasters extent and resolution " 
  374                      "is defined by the input raster layer and is always of int32 type." );
 
  377QString QgsRasterFrequencyByLessThanOperatorAlgorithm::shortDescription()
 const 
  379  return QObject::tr( 
"Evaluates on a cell-by-cell basis the frequency (number of times) " 
  380                      "the values of an input stack of rasters are less than the value of a value raster." );
 
  383QgsRasterFrequencyByLessThanOperatorAlgorithm *QgsRasterFrequencyByLessThanOperatorAlgorithm::createInstance()
 const 
  385  return new QgsRasterFrequencyByLessThanOperatorAlgorithm();
 
  388int QgsRasterFrequencyByLessThanOperatorAlgorithm::applyComparisonOperator( 
double searchValue, std::vector<double> cellValueStack )
 
  390  return static_cast<int>( std::count_if( cellValueStack.begin(), cellValueStack.end(), [&]( 
double const &stackValue ) { return stackValue < searchValue; } ) );
 
@ Int32
Thirty two bit signed integer (qint32)
 
@ 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.
 
bool isCanceled() const
Tells whether the operation has been canceled already.
 
void setProgress(double progress)
Sets the current progress for the feedback object.
 
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 raster band parameter 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.
 
Iterator for sequentially processing raster cells.
 
static const int DEFAULT_MAXIMUM_TILE_WIDTH
Default maximum tile width.
 
static const int DEFAULT_MAXIMUM_TILE_HEIGHT
Default maximum tile height.
 
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.
 
A rectangle specified with double values.
 
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...