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(
"Generates raster layer for given extent and cell "
53 "size filled with the specified 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." );
59QgsConstantRasterAlgorithm *QgsConstantRasterAlgorithm::createInstance()
const
61 return new QgsConstantRasterAlgorithm();
64void QgsConstantRasterAlgorithm::initAlgorithm(
const QVariantMap & )
67 addParameter(
new QgsProcessingParameterCrs( QStringLiteral(
"TARGET_CRS" ), QObject::tr(
"Target CRS" ), QStringLiteral(
"ProjectCrs" ) ) );
71 QStringList rasterDataTypes;
72 rasterDataTypes << QStringLiteral(
"Byte" )
73 << QStringLiteral(
"Integer16" )
74 << QStringLiteral(
"Unsigned Integer16" )
75 << QStringLiteral(
"Integer32" )
76 << QStringLiteral(
"Unsigned Integer32" )
77 << QStringLiteral(
"Float32" )
78 << QStringLiteral(
"Float64" );
81 std::unique_ptr<QgsProcessingParameterDefinition> rasterTypeParameter = std::make_unique<QgsProcessingParameterEnum>( QStringLiteral(
"OUTPUT_TYPE" ), QObject::tr(
"Output raster data type" ), rasterDataTypes,
false, 5,
false );
83 addParameter( rasterTypeParameter.release() );
85 std::unique_ptr<QgsProcessingParameterString> createOptsParam = std::make_unique<QgsProcessingParameterString>( QStringLiteral(
"CREATE_OPTIONS" ), QObject::tr(
"Creation options" ), QVariant(),
false,
true );
86 createOptsParam->setMetadata( QVariantMap( { { QStringLiteral(
"widget_wrapper" ), QVariantMap( { { QStringLiteral(
"widget_type" ), QStringLiteral(
"rasteroptions" ) } } ) } } ) );
88 addParameter( createOptsParam.release() );
96 const QgsRectangle extent = parameterAsExtent( parameters, QStringLiteral(
"EXTENT" ), context,
crs );
97 const double pixelSize = parameterAsDouble( parameters, QStringLiteral(
"PIXEL_SIZE" ), context );
98 const double value = parameterAsDouble( parameters, QStringLiteral(
"NUMBER" ), context );
99 const int typeId = parameterAsInt( parameters, QStringLiteral(
"OUTPUT_TYPE" ), context );
101 if ( pixelSize <= 0 )
109 fractpart = abs( std::modf( value, &intpart ) );
116 if ( value < std::numeric_limits<quint8>::min() || value > std::numeric_limits<quint8>::max() )
117 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" ) ) );
119 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" ) ) );
123 if ( value < std::numeric_limits<qint16>::min() || value > std::numeric_limits<qint16>::max() )
124 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" ) ) );
126 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" ) ) );
130 if ( value < std::numeric_limits<quint16>::min() || value > std::numeric_limits<quint16>::max() )
131 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" ) );
133 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" ) ) );
137 if ( value < std::numeric_limits<qint32>::min() || value > std::numeric_limits<qint32>::max() )
138 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" ) ) );
140 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" ) ) );
144 if ( value < std::numeric_limits<quint32>::min() || value > std::numeric_limits<quint32>::max() )
145 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" ) ) );
147 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" ) ) );
159 const QString createOptions = parameterAsString( parameters, QStringLiteral(
"CREATE_OPTIONS" ), context ).trimmed();
160 const QString outputFile = parameterAsOutputLayer( parameters, QStringLiteral(
"OUTPUT" ), context );
161 const QFileInfo fi( outputFile );
164 const int rows = std::max( std::ceil( extent.
height() / pixelSize ), 1.0 );
165 const int cols = std::max( std::ceil( extent.
width() / pixelSize ), 1.0 );
171 std::unique_ptr<QgsRasterFileWriter> writer = std::make_unique<QgsRasterFileWriter>( outputFile );
172 writer->setOutputProviderKey( QStringLiteral(
"gdal" ) );
173 if ( !createOptions.isEmpty() )
175 writer->setCreateOptions( createOptions.split(
'|' ) );
177 writer->setOutputFormat( outputFormat );
178 std::unique_ptr<QgsRasterDataProvider> provider( writer->createOneBandRaster( rasterDataType, cols, rows, rasterExtent,
crs ) );
181 if ( !provider->isValid() )
194 std::vector<quint8> byteRow( cols );
195 std::fill( byteRow.begin(), byteRow.end(), value );
201 std::vector<qint16> int16Row( cols );
202 std::fill( int16Row.begin(), int16Row.end(), value );
208 std::vector<quint16> uInt16Row( cols );
209 std::fill( uInt16Row.begin(), uInt16Row.end(), value );
215 std::vector<qint32> int32Row( cols );
216 std::fill( int32Row.begin(), int32Row.end(), value );
222 std::vector<quint32> uInt32Row( cols );
223 std::fill( uInt32Row.begin(), uInt32Row.end(), value );
229 std::vector<float> float32Row( cols );
230 std::fill( float32Row.begin(), float32Row.end(), value );
236 std::vector<double> float64Row( cols );
237 std::fill( float64Row.begin(), float64Row.end(), value );
243 std::vector<float> float32Row( cols );
244 std::fill( float32Row.begin(), float32Row.end(), value );
250 const double step = rows > 0 ? 100.0 / rows : 1;
252 for (
int i = 0; i < rows; i++ )
259 provider->writeBlock( &block, 1, 0, i );
264 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)
@ Advanced
Parameter is an advanced parameter which should be hidden from users by default.
@ Double
Double/float values.
This class 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 int typeSize(Qgis::DataType dataType)
Returns the size in bytes for the specified dataType.
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