33QString QgsReclassifyAlgorithmBase::group()
const
35 return QObject::tr(
"Raster analysis" );
38QString QgsReclassifyAlgorithmBase::groupId()
const
40 return QStringLiteral(
"rasteranalysis" );
43void QgsReclassifyAlgorithmBase::initAlgorithm(
const QVariantMap & )
46 QObject::tr(
"Raster layer" ) ) );
48 QObject::tr(
"Band number" ), 1, QStringLiteral(
"INPUT_RASTER" ) ) );
52 std::unique_ptr< QgsProcessingParameterNumber > noDataValueParam = std::make_unique< QgsProcessingParameterNumber >( QStringLiteral(
"NO_DATA" ),
55 addParameter( noDataValueParam.release() );
57 std::unique_ptr< QgsProcessingParameterEnum > boundsHandling = std::make_unique< QgsProcessingParameterEnum >( QStringLiteral(
"RANGE_BOUNDARIES" ),
58 QObject::tr(
"Range boundaries" ), QStringList() << QObject::tr(
"min < value <= max" )
59 << QObject::tr(
"min <= value < max" )
60 << QObject::tr(
"min <= value <= max" )
61 << QObject::tr(
"min < value < max" ),
64 addParameter( boundsHandling.release() );
66 std::unique_ptr< QgsProcessingParameterBoolean > missingValuesParam = std::make_unique< QgsProcessingParameterBoolean >( QStringLiteral(
"NODATA_FOR_MISSING" ),
67 QObject::tr(
"Use NoData when no range matches value" ),
false,
false );
69 addParameter( missingValuesParam.release() );
71 std::unique_ptr< QgsProcessingParameterDefinition > typeChoice = QgsRasterAnalysisUtils::createRasterTypeParameter( QStringLiteral(
"DATA_TYPE" ), QObject::tr(
"Output data type" ),
Qgis::DataType::Float32 );
73 addParameter( typeChoice.release() );
75 std::unique_ptr< QgsProcessingParameterString > createOptsParam = std::make_unique< QgsProcessingParameterString >( QStringLiteral(
"CREATE_OPTIONS" ), QObject::tr(
"Creation options" ), QVariant(),
false,
true );
76 createOptsParam->setMetadata( QVariantMap( {{QStringLiteral(
"widget_wrapper" ), QVariantMap( {{QStringLiteral(
"widget_type" ), QStringLiteral(
"rasteroptions" ) }} ) }} ) );
78 addParameter( createOptsParam.release() );
85 mDataType = QgsRasterAnalysisUtils::rasterTypeChoiceToDataType( parameterAsEnum( parameters, QStringLiteral(
"DATA_TYPE" ), context ) );
86 if ( mDataType ==
Qgis::DataType::Int8 && atoi( GDALVersionInfo(
"VERSION_NUM" ) ) < GDAL_COMPUTE_VERSION( 3, 7, 0 ) )
89 QgsRasterLayer *layer = parameterAsRasterLayer( parameters, QStringLiteral(
"INPUT_RASTER" ), context );
94 mBand = parameterAsInt( parameters, QStringLiteral(
"RASTER_BAND" ), context );
95 if ( mBand < 1 || mBand > layer->
bandCount() )
96 throw QgsProcessingException( QObject::tr(
"Invalid band number for RASTER_BAND (%1): Valid values for input raster are 1 to %2" ).arg( mBand )
100 mExtent = layer->
extent();
104 mNbCellsXProvider = mInterface->xSize();
105 mNbCellsYProvider = mInterface->ySize();
107 mNoDataValue = parameterAsDouble( parameters, QStringLiteral(
"NO_DATA" ), context );
108 mUseNoDataForMissingValues = parameterAsBoolean( parameters, QStringLiteral(
"NODATA_FOR_MISSING" ), context );
110 const int boundsType = parameterAsEnum( parameters, QStringLiteral(
"RANGE_BOUNDARIES" ), context );
111 switch ( boundsType )
114 mBoundsType = QgsReclassifyUtils::RasterClass::IncludeMax;
118 mBoundsType = QgsReclassifyUtils::RasterClass::IncludeMin;
122 mBoundsType = QgsReclassifyUtils::RasterClass::IncludeMinAndMax;
126 mBoundsType = QgsReclassifyUtils::RasterClass::Exclusive;
130 return _prepareAlgorithm( parameters, context, feedback );
135 const QVector< QgsReclassifyUtils::RasterClass > classes = createClasses( mBoundsType, parameters, context, feedback );
137 QgsReclassifyUtils::reportClasses( classes, feedback );
138 QgsReclassifyUtils::checkForOverlaps( classes, feedback );
140 const QString createOptions = parameterAsString( parameters, QStringLiteral(
"CREATE_OPTIONS" ), context ).trimmed();
141 const QString outputFile = parameterAsOutputLayer( parameters, QStringLiteral(
"OUTPUT" ), context );
142 const QFileInfo fi( outputFile );
145 std::unique_ptr< QgsRasterFileWriter > writer = std::make_unique< QgsRasterFileWriter >( outputFile );
146 writer->setOutputProviderKey( QStringLiteral(
"gdal" ) );
147 if ( !createOptions.isEmpty() )
149 writer->setCreateOptions( createOptions.split(
'|' ) );
152 writer->setOutputFormat( outputFormat );
153 std::unique_ptr<QgsRasterDataProvider > provider( writer->createOneBandRaster( mDataType, mNbCellsXProvider, mNbCellsYProvider, mExtent, mCrs ) );
156 if ( !provider->isValid() )
159 provider->setNoDataValue( 1, mNoDataValue );
161 QgsReclassifyUtils::reclassify( classes, mInterface.get(), mBand, mExtent, mNbCellsXProvider, mNbCellsYProvider, provider.get(), mNoDataValue, mUseNoDataForMissingValues,
165 outputs.insert( QStringLiteral(
"OUTPUT" ), outputFile );
174QString QgsReclassifyByLayerAlgorithm::name()
const
176 return QStringLiteral(
"reclassifybylayer" );
179QString QgsReclassifyByLayerAlgorithm::displayName()
const
181 return QObject::tr(
"Reclassify by layer" );
184QStringList QgsReclassifyByLayerAlgorithm::tags()
const
186 return QObject::tr(
"raster,reclassify,classes,calculator" ).split(
',' );
189QString QgsReclassifyByLayerAlgorithm::shortHelpString()
const
191 return QObject::tr(
"This algorithm reclassifies a raster band by assigning new class values based on the ranges specified in a vector table." );
194QgsReclassifyByLayerAlgorithm *QgsReclassifyByLayerAlgorithm::createInstance()
const
196 return new QgsReclassifyByLayerAlgorithm();
199void QgsReclassifyByLayerAlgorithm::addAlgorithmParams()
213 std::unique_ptr< QgsFeatureSource >tableSource( parameterAsSource( parameters, QStringLiteral(
"INPUT_TABLE" ), context ) );
217 const QString fieldMin = parameterAsString( parameters, QStringLiteral(
"MIN_FIELD" ), context );
218 mMinFieldIdx = tableSource->fields().lookupField( fieldMin );
219 if ( mMinFieldIdx < 0 )
220 throw QgsProcessingException( QObject::tr(
"Invalid field specified for MIN_FIELD: %1" ).arg( fieldMin ) );
221 const QString fieldMax = parameterAsString( parameters, QStringLiteral(
"MAX_FIELD" ), context );
222 mMaxFieldIdx = tableSource->fields().lookupField( fieldMax );
223 if ( mMaxFieldIdx < 0 )
224 throw QgsProcessingException( QObject::tr(
"Invalid field specified for MAX_FIELD: %1" ).arg( fieldMax ) );
225 const QString fieldValue = parameterAsString( parameters, QStringLiteral(
"VALUE_FIELD" ), context );
226 mValueFieldIdx = tableSource->fields().lookupField( fieldValue );
227 if ( mValueFieldIdx < 0 )
228 throw QgsProcessingException( QObject::tr(
"Invalid field specified for VALUE_FIELD: %1" ).arg( fieldValue ) );
233 mTableIterator = tableSource->getFeatures( request );
240 QVector< QgsReclassifyUtils::RasterClass > classes;
242 while ( mTableIterator.nextFeature( f ) )
247 const QVariant minVariant = f.
attribute( mMinFieldIdx );
251 minValue = std::numeric_limits<double>::quiet_NaN();
255 minValue = minVariant.toDouble( &ok );
257 throw QgsProcessingException( QObject::tr(
"Invalid value for minimum: %1" ).arg( minVariant.toString() ) );
259 const QVariant maxVariant = f.
attribute( mMaxFieldIdx );
263 maxValue = std::numeric_limits<double>::quiet_NaN();
268 maxValue = maxVariant.toDouble( &ok );
270 throw QgsProcessingException( QObject::tr(
"Invalid value for maximum: %1" ).arg( maxVariant.toString() ) );
273 const double value = f.
attribute( mValueFieldIdx ).toDouble( &ok );
277 classes << QgsReclassifyUtils::RasterClass( minValue, maxValue, boundsType, value );
287QString QgsReclassifyByTableAlgorithm::name()
const
289 return QStringLiteral(
"reclassifybytable" );
292QString QgsReclassifyByTableAlgorithm::displayName()
const
294 return QObject::tr(
"Reclassify by table" );
297QStringList QgsReclassifyByTableAlgorithm::tags()
const
299 return QObject::tr(
"raster,reclassify,classes,calculator" ).split(
',' );
302QString QgsReclassifyByTableAlgorithm::shortHelpString()
const
304 return QObject::tr(
"This algorithm reclassifies a raster band by assigning new class values based on the ranges specified in a fixed table." );
307QgsReclassifyByTableAlgorithm *QgsReclassifyByTableAlgorithm::createInstance()
const
309 return new QgsReclassifyByTableAlgorithm();
312void QgsReclassifyByTableAlgorithm::addAlgorithmParams()
315 QObject::tr(
"Reclassification table" ),
316 1,
false, QStringList() << QObject::tr(
"Minimum" )
317 << QObject::tr(
"Maximum" )
318 << QObject::tr(
"Value" ) ) );
326QVector<QgsReclassifyUtils::RasterClass> QgsReclassifyByTableAlgorithm::createClasses( QgsReclassifyUtils::RasterClass::BoundsType boundsType,
const QVariantMap ¶meters,
QgsProcessingContext &context,
QgsProcessingFeedback * )
328 const QVariantList table = parameterAsMatrix( parameters, QStringLiteral(
"TABLE" ), context );
329 if ( table.count() % 3 != 0 )
330 throw QgsProcessingException( QObject::tr(
"Invalid value for TABLE: list must contain a multiple of 3 elements (found %1)" ).arg( table.count() ) );
332 const int rows = table.count() / 3;
333 QVector< QgsReclassifyUtils::RasterClass > classes;
334 classes.reserve( rows );
335 for (
int row = 0; row < rows; ++row )
340 const QVariant minVariant = table.at( row * 3 );
344 minValue = std::numeric_limits<double>::quiet_NaN();
348 minValue = minVariant.toDouble( &ok );
350 throw QgsProcessingException( QObject::tr(
"Invalid value for minimum: %1" ).arg( table.at( row * 3 ).toString() ) );
352 const QVariant maxVariant = table.at( row * 3 + 1 );
356 maxValue = std::numeric_limits<double>::quiet_NaN();
361 maxValue = maxVariant.toDouble( &ok );
363 throw QgsProcessingException( QObject::tr(
"Invalid value for maximum: %1" ).arg( table.at( row * 3 + 1 ).toString() ) );
366 const double value = table.at( row * 3 + 2 ).toDouble( &ok );
368 throw QgsProcessingException( QObject::tr(
"Invalid output value: %1" ).arg( table.at( row * 3 + 2 ).toString() ) );
370 classes << QgsReclassifyUtils::RasterClass( minValue, maxValue, boundsType, value );
@ Vector
Tables (i.e. vector layers with or without geometry). When used for a sink this indicates the sink ha...
@ NoGeometry
Geometry is not required. It may still be returned if e.g. required for a filter condition.
@ Numeric
Accepts numeric fields.
@ Float32
Thirty two bit floating point (float)
@ Int8
Eight bit signed integer (qint8) (added in QGIS 3.30)
@ Advanced
Parameter is an advanced parameter which should be hidden from users by default.
@ Double
Double/float values.
This class wraps a request for features to a vector layer (or directly its vector data provider).
QgsFeatureRequest & setFlags(Qgis::FeatureRequestFlags flags)
Sets flags that affect how features will be fetched.
QgsFeatureRequest & setSubsetOfAttributes(const QgsAttributeList &attrs)
Set a subset of attributes that will be fetched.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
Q_INVOKABLE QVariant attribute(const QString &name) const
Lookup attribute value by attribute name.
virtual QgsRectangle extent() const
Returns the extent of the layer.
QgsCoordinateReferenceSystem crs
Contains information about the context in which a processing algorithm is executed.
Custom exception class for processing related exceptions.
Base class for providing feedback from a processing algorithm.
A raster band parameter for Processing algorithms.
An input feature source (such as vector layers) parameter for processing algorithms.
A vector layer or feature source field parameter for processing algorithms.
A table (matrix) parameter for processing algorithms.
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.
static QString driverForExtension(const QString &extension)
Returns the GDAL driver name for a specified file extension.
Represents a raster layer.
int bandCount() const
Returns the number of bands in this layer.
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.
BoundsType
Handling for min and max bounds.
static bool isNull(const QVariant &variant, bool silenceNullWarnings=false)
Returns true if the specified variant should be considered a NULL value.
QList< int > QgsAttributeList