25QString QgsConstantRasterAlgorithm::name()
const
27 return QStringLiteral(
"createconstantrasterlayer" );
30QString QgsConstantRasterAlgorithm::displayName()
const
32 return QObject::tr(
"Create constant raster layer" );
35QStringList QgsConstantRasterAlgorithm::tags()
const
37 return QObject::tr(
"raster,create,constant" ).split(
',' );
40QString QgsConstantRasterAlgorithm::group()
const
42 return QObject::tr(
"Raster creation" );
45QString QgsConstantRasterAlgorithm::groupId()
const
47 return QStringLiteral(
"rastercreation" );
50QString QgsConstantRasterAlgorithm::shortHelpString()
const
52 return QObject::tr(
"This algorithm generates a raster layer for a given extent and cell "
53 "size filled with a single constant value.\n"
54 "Additionally an output data type can be specified. "
55 "The algorithm will abort if a value has been entered that "
56 "cannot be represented by the selected output raster data type." );
59QString QgsConstantRasterAlgorithm::shortDescription()
const
61 return QObject::tr(
"Generates a raster layer for a given extent and cell size filled with a single constant value." );
64QgsConstantRasterAlgorithm *QgsConstantRasterAlgorithm::createInstance()
const
66 return new QgsConstantRasterAlgorithm();
69void QgsConstantRasterAlgorithm::initAlgorithm(
const QVariantMap & )
72 addParameter(
new QgsProcessingParameterCrs( QStringLiteral(
"TARGET_CRS" ), QObject::tr(
"Target CRS" ), QStringLiteral(
"ProjectCrs" ) ) );
76 QStringList rasterDataTypes;
77 rasterDataTypes << QStringLiteral(
"Byte" )
78 << QStringLiteral(
"Integer16" )
79 << QStringLiteral(
"Unsigned Integer16" )
80 << QStringLiteral(
"Integer32" )
81 << QStringLiteral(
"Unsigned Integer32" )
82 << QStringLiteral(
"Float32" )
83 << QStringLiteral(
"Float64" );
86 std::unique_ptr<QgsProcessingParameterDefinition> rasterTypeParameter = std::make_unique<QgsProcessingParameterEnum>( QStringLiteral(
"OUTPUT_TYPE" ), QObject::tr(
"Output raster data type" ), rasterDataTypes,
false, 5,
false );
88 addParameter( rasterTypeParameter.release() );
92 auto createOptsParam = std::make_unique<QgsProcessingParameterString>( QStringLiteral(
"CREATE_OPTIONS" ), QObject::tr(
"Creation options" ), QVariant(),
false,
true );
93 createOptsParam->setMetadata( QVariantMap( { { QStringLiteral(
"widget_wrapper" ), QVariantMap( { { QStringLiteral(
"widget_type" ), QStringLiteral(
"rasteroptions" ) } } ) } } ) );
95 addParameter( createOptsParam.release() );
97 auto creationOptsParam = std::make_unique<QgsProcessingParameterString>( QStringLiteral(
"CREATION_OPTIONS" ), QObject::tr(
"Creation options" ), QVariant(),
false,
true );
98 creationOptsParam->setMetadata( QVariantMap( { { QStringLiteral(
"widget_wrapper" ), QVariantMap( { { QStringLiteral(
"widget_type" ), QStringLiteral(
"rasteroptions" ) } } ) } } ) );
100 addParameter( creationOptsParam.release() );
108 const QgsRectangle extent = parameterAsExtent( parameters, QStringLiteral(
"EXTENT" ), context,
crs );
109 const double pixelSize = parameterAsDouble( parameters, QStringLiteral(
"PIXEL_SIZE" ), context );
110 const double value = parameterAsDouble( parameters, QStringLiteral(
"NUMBER" ), context );
111 const int typeId = parameterAsInt( parameters, QStringLiteral(
"OUTPUT_TYPE" ), context );
113 if ( pixelSize <= 0 )
121 fractpart = abs( std::modf( value, &intpart ) );
128 if ( value < std::numeric_limits<quint8>::min() || value > std::numeric_limits<quint8>::max() )
129 throw QgsProcessingException( QObject::tr(
"Raster datasets of type %3 only accept positive values between %1 and %2" ).arg( std::numeric_limits<quint8>::min() ).arg( std::numeric_limits<quint8>::max() ).arg( QLatin1String(
"Byte" ) ) );
131 feedback->
reportError( QObject::tr(
"The entered constant value has decimals but will be written to a raster dataset of type %1. The decimals of the constant value will be omitted." ).arg( QLatin1String(
"Byte" ) ) );
135 if ( value < std::numeric_limits<qint16>::min() || value > std::numeric_limits<qint16>::max() )
136 throw QgsProcessingException( QObject::tr(
"Raster datasets of type %3 only accept values between %1 and %2" ).arg( std::numeric_limits<qint16>::min() ).arg( std::numeric_limits<qint16>::max() ).arg( QLatin1String(
"Integer16" ) ) );
138 feedback->
reportError( QObject::tr(
"The entered constant value has decimals but will be written to a raster dataset of type %1. The decimals of the constant value will be omitted." ).arg( QLatin1String(
"Integer16" ) ) );
142 if ( value < std::numeric_limits<quint16>::min() || value > std::numeric_limits<quint16>::max() )
143 throw QgsProcessingException( QObject::tr(
"Raster datasets of type %3 only accept positive values between %1 and %2" ).arg( std::numeric_limits<quint16>::min() ).arg( std::numeric_limits<quint16>::max() ).arg(
"Unsigned Integer16" ) );
145 feedback->
reportError( QObject::tr(
"The entered constant value has decimals but will be written to a raster dataset of type %1. The decimals of the constant value will be omitted." ).arg( QLatin1String(
"Unsigned Integer16" ) ) );
149 if ( value < std::numeric_limits<qint32>::min() || value > std::numeric_limits<qint32>::max() )
150 throw QgsProcessingException( QObject::tr(
"Raster datasets of type %3 only accept values between %1 and %2" ).arg( std::numeric_limits<qint32>::min() ).arg( std::numeric_limits<qint32>::max() ).arg( QLatin1String(
"Integer32" ) ) );
152 feedback->
reportError( QObject::tr(
"The entered constant value has decimals but will be written to a raster dataset of type %1. The decimals of the constant value will be omitted." ).arg( QLatin1String(
"Integer32" ) ) );
156 if ( value < std::numeric_limits<quint32>::min() || value > std::numeric_limits<quint32>::max() )
157 throw QgsProcessingException( QObject::tr(
"Raster datasets of type %3 only accept positive values between %1 and %2" ).arg( std::numeric_limits<quint32>::min() ).arg( std::numeric_limits<quint32>::max() ).arg( QLatin1String(
"Unsigned Integer32" ) ) );
159 feedback->
reportError( QObject::tr(
"The entered constant value has decimals but will be written to a raster dataset of type %1. The decimals of the constant value will be omitted." ).arg( QLatin1String(
"Unsigned Integer32" ) ) );
171 QString creationOptions = parameterAsString( parameters, QStringLiteral(
"CREATION_OPTIONS" ), context ).trimmed();
173 const QString optionsString = parameterAsString( parameters, QStringLiteral(
"CREATE_OPTIONS" ), context );
174 if ( !optionsString.isEmpty() )
175 creationOptions = optionsString;
177 const QString outputFile = parameterAsOutputLayer( parameters, QStringLiteral(
"OUTPUT" ), context );
178 const QFileInfo fi( outputFile );
183 const int rows =
static_cast<int>( 0.5 + extent.
height() / pixelSize );
184 const int cols =
static_cast<int>( 0.5 + extent.
width() / pixelSize );
190 auto writer = std::make_unique<QgsRasterFileWriter>( outputFile );
191 writer->setOutputProviderKey( QStringLiteral(
"gdal" ) );
192 if ( !creationOptions.isEmpty() )
194 writer->setCreationOptions( creationOptions.split(
'|' ) );
196 writer->setOutputFormat( outputFormat );
197 std::unique_ptr<QgsRasterDataProvider> provider( writer->createOneBandRaster( rasterDataType, cols, rows, rasterExtent,
crs ) );
200 if ( !provider->isValid() )
211 const double step = rows > 0 ? 100.0 / rows : 1;
213 for (
int i = 0; i < rows; i++ )
220 if ( !provider->writeBlock( &block, 1, 0, i ) )
222 throw QgsProcessingException( QObject::tr(
"Could not write raster block: %1" ).arg( provider->error().summary() ) );
228 outputs.insert( QStringLiteral(
"OUTPUT" ), outputFile );
DataType
Raster data types.
@ Float32
Thirty two bit floating point (float)
@ Int16
Sixteen bit signed integer (qint16)
@ UInt16
Sixteen bit unsigned integer (quint16)
@ Byte
Eight bit unsigned integer (quint8)
@ Int32
Thirty two bit signed integer (qint32)
@ Float64
Sixty four bit floating point (double)
@ UInt32
Thirty two bit unsigned integer (quint32)
@ 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.
Represents a coordinate reference system (CRS).
bool isCanceled() const
Tells whether the operation has been canceled already.
void setProgress(double progress)
Sets the current progress for the feedback object.
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.
virtual void reportError(const QString &error, bool fatalError=false)
Reports that the algorithm encountered an error while executing.
A coordinate reference system parameter for processing algorithms.
A rectangular map extent parameter for processing algorithms.
A numeric parameter for processing algorithms.
A raster layer destination parameter, for specifying the destination path for a raster layer created ...
static QString driverForExtension(const QString &extension)
Returns the GDAL driver name for a specified file extension.
A rectangle specified with double values.
const QgsCoordinateReferenceSystem & crs