QGIS API Documentation 4.3.0-Master (7d9941090cd)
Loading...
Searching...
No Matches
qgsalgorithmrelief.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsalgorithmrelief.cpp
3 ---------------------
4 begin : June 2026
5 copyright : (C) 2026 by Nyall Dawson
6 email : nyall dot dawson at gmail dot com
7 ***************************************************************************/
8
9/***************************************************************************
10 * *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
15 * *
16 ***************************************************************************/
17
18#include "qgsalgorithmrelief.h"
19
21#include "qgsrelief.h"
22
23#include <QString>
24
25using namespace Qt::StringLiterals;
26
28
29
30QString QgsReliefAlgorithm::name() const
31{
32 return u"relief"_s;
33}
34
35QString QgsReliefAlgorithm::displayName() const
36{
37 return QObject::tr( "Relief" );
38}
39
40QStringList QgsReliefAlgorithm::tags() const
41{
42 return QObject::tr( "elevation" ).split( ',' );
43}
44
45QString QgsReliefAlgorithm::group() const
46{
47 return QObject::tr( "Raster terrain analysis" );
48}
49
50QString QgsReliefAlgorithm::groupId() const
51{
52 return u"rasterterrainanalysis"_s;
53}
54
55QgsReliefAlgorithm::~QgsReliefAlgorithm() = default;
56
57void QgsReliefAlgorithm::initAlgorithm( const QVariantMap & )
58{
59 auto inputParam = std::make_unique<QgsProcessingParameterRasterLayer>( u"INPUT"_s, QObject::tr( "Elevation layer" ) );
60 inputParam->setHelp( QObject::tr( "The digital elevation model (DEM) raster layer to use for calculating the shaded relief." ) );
61 addParameter( inputParam.release() );
62
63 auto zFactorParam = std::make_unique<QgsProcessingParameterNumber>( u"Z_FACTOR"_s, QObject::tr( "Z factor" ), Qgis::ProcessingNumberParameterType::Double, 1.0, false, 0.0 );
64 zFactorParam->setHelp( QObject::tr( "The Z factor allows you to exaggerate or compress the elevation values. A value of 1.0 means no exaggeration. Values greater than 1.0 exaggerate the relief." ) );
65 addParameter( zFactorParam.release() );
66
67 auto autoColorsParam = std::make_unique<QgsProcessingParameterBoolean>( u"AUTO_COLORS"_s, QObject::tr( "Generate relief classes automatically" ), false );
68 autoColorsParam->setHelp( QObject::tr( "If checked, relief classes (colors and elevation ranges) will be generated automatically based on the input layer's statistics." ) );
69 addParameter( autoColorsParam.release() );
70
71 auto colorsParam = std::make_unique<QgsProcessingParameterReliefColors>( u"COLORS"_s, QObject::tr( "Relief colors" ), u"INPUT"_s, true );
72 colorsParam->setHelp(
73 QObject::tr( "The color classes to use for the relief. Each class is defined by a minimum elevation, maximum elevation, and a color. Ignored if 'Generate relief classes automatically' is checked." )
74 );
75 addParameter( colorsParam.release() );
76
77 auto outputNodataParam = std::make_unique<QgsProcessingParameterNumber>( u"NODATA"_s, QObject::tr( "Output NoData value" ), Qgis::ProcessingNumberParameterType::Double, -9999.0 );
78 outputNodataParam->setHelp( QObject::tr( "The NODATA value to use in the output raster." ) );
79 outputNodataParam->setFlags( outputNodataParam->flags() | Qgis::ProcessingParameterFlag::Advanced );
80 addParameter( outputNodataParam.release() );
81
82 auto creationOptsParam = std::make_unique<QgsProcessingParameterString>( u"CREATION_OPTIONS"_s, QObject::tr( "Creation options" ), QVariant(), false, true );
83 creationOptsParam->setHelp( QObject::tr( "The raster creation options for the output raster. These options control things like colorimetry, compression, etc." ) );
84 creationOptsParam->setMetadata( QVariantMap( { { u"widget_wrapper"_s, QVariantMap( { { u"widget_type"_s, u"rasteroptions"_s } } ) } } ) );
85 creationOptsParam->setFlags( creationOptsParam->flags() | Qgis::ProcessingParameterFlag::Advanced );
86 addParameter( creationOptsParam.release() );
87
88 auto outputParam = std::make_unique<QgsProcessingParameterRasterDestination>( u"OUTPUT"_s, QObject::tr( "Relief" ) );
89 outputParam->setHelp( QObject::tr( "The output shaded relief raster layer." ) );
90 addParameter( outputParam.release() );
91
92 auto freqDistParam
93 = std::make_unique<QgsProcessingParameterFileDestination>( u"FREQUENCY_DISTRIBUTION"_s, QObject::tr( "Frequency distribution" ), QObject::tr( "CSV files (*.csv)" ), QVariant(), true, false );
94 freqDistParam->setHelp( QObject::tr( "An optional CSV file to save the frequency distribution of the relief classes." ) );
95 addParameter( freqDistParam.release() );
96}
97
98QString QgsReliefAlgorithm::shortHelpString() const
99{
100 return QObject::tr( "This algorithm creates a shaded relief layer from digital elevation data." );
101}
102
103QString QgsReliefAlgorithm::shortDescription() const
104{
105 return QObject::tr( "Creates a shaded relief layer from digital elevation data." );
106}
107
108QgsReliefAlgorithm *QgsReliefAlgorithm::createInstance() const
109{
110 return new QgsReliefAlgorithm();
111}
112
113bool QgsReliefAlgorithm::prepareAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback * )
114{
115 QgsRasterLayer *layer = parameterAsRasterLayer( parameters, u"INPUT"_s, context );
116 if ( !layer )
117 {
118 throw QgsProcessingException( invalidRasterError( parameters, u"INPUT"_s ) );
119 }
120
121 mLayerSource = layer->source();
122 return true;
123}
124
125QVariantMap QgsReliefAlgorithm::processAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback )
126{
127 const double zFactor = parameterAsDouble( parameters, u"Z_FACTOR"_s, context );
128 const bool automaticColors = parameterAsBoolean( parameters, u"AUTO_COLORS"_s, context );
129 const QString creationOptions = parameterAsString( parameters, u"CREATION_OPTIONS"_s, context ).trimmed();
130 const double outputNodata = parameterAsDouble( parameters, u"NODATA"_s, context );
131 const QString outputFile = parameterAsOutputLayer( parameters, u"OUTPUT"_s, context );
132 const QString outputFormat = parameterAsOutputRasterFormat( parameters, u"OUTPUT"_s, context );
133 const QString frequencyDistribution = parameterAsFileOutput( parameters, u"FREQUENCY_DISTRIBUTION"_s, context );
134
135 QgsRelief relief( mLayerSource, outputFile, outputFormat );
136
137 QList<QgsRasterReliefColor> reliefColors;
138 if ( automaticColors )
139 {
140 reliefColors = relief.calculateOptimizedReliefClasses();
141 }
142 else
143 {
144 reliefColors = qgis::down_cast< const QgsProcessingParameterReliefColors * >( parameterDefinition( u"COLORS"_s ) )->valueAsReliefColors( parameters.value( u"COLORS"_s ), context );
145 if ( reliefColors.isEmpty() )
146 throw QgsProcessingException( QObject::tr( "Specify relief colors or activate \"Generate relief classes automatically\" option." ) );
147 }
148
149 relief.setReliefColors( reliefColors );
150 relief.setZFactor( zFactor );
151
152 if ( !creationOptions.isEmpty() )
153 {
154 relief.setCreationOptions( creationOptions.split( '|' ) );
155 }
156 relief.setOutputNodataValue( outputNodata );
157
158 if ( !frequencyDistribution.isEmpty() )
159 relief.exportFrequencyDistributionToCsv( frequencyDistribution );
160
161 const QgsRelief::Result result = relief.processRaster( feedback );
162 switch ( result )
163 {
165 break;
166
168 throw QgsProcessingException( QObject::tr( "Could not open input file." ) );
169
171 throw QgsProcessingException( QObject::tr( "Could not create output file." ) );
172
174 throw QgsProcessingException( QObject::tr( "Input raster size is too small (at least 3 rows needed)." ) );
175
177 feedback->pushInfo( QObject::tr( "Canceled." ) );
178 break;
179 }
180
181 QVariantMap outputs;
182 outputs.insert( u"OUTPUT"_s, outputFile );
183 if ( !frequencyDistribution.isEmpty() )
184 outputs.insert( u"FREQUENCY_DISTRIBUTION"_s, frequencyDistribution );
185
186 return outputs;
187}
188
@ Advanced
Parameter is an advanced parameter which should be hidden from users by default.
Definition qgis.h:3982
@ Double
Double/float values.
Definition qgis.h:4023
QString source() const
Returns the source for the layer.
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 pushInfo(const QString &info)
Pushes a general informational message from the algorithm.
Represents a raster layer.
Produces colored relief rasters from DEM.
Definition qgsrelief.h:42
Result
Calculation results.
Definition qgsrelief.h:59
@ Canceled
Operation was canceled.
Definition qgsrelief.h:64
@ Success
Calculation succeeded.
Definition qgsrelief.h:60
@ OutputCreationFailed
Creation of output layer failed.
Definition qgsrelief.h:62
@ InvalidInput
Invalid input layer.
Definition qgsrelief.h:61
@ InvalidInputSize
Input raster was too small (at least 3 rows are required).
Definition qgsrelief.h:63