QGIS API Documentation 4.3.0-Master (45633be667c)
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 QGS_MARK_ALGORITHM_SOURCE
128
129 const double zFactor = parameterAsDouble( parameters, u"Z_FACTOR"_s, context );
130 const bool automaticColors = parameterAsBoolean( parameters, u"AUTO_COLORS"_s, context );
131 const QString creationOptions = parameterAsString( parameters, u"CREATION_OPTIONS"_s, context ).trimmed();
132 const double outputNodata = parameterAsDouble( parameters, u"NODATA"_s, context );
133 const QString outputFile = parameterAsOutputLayer( parameters, u"OUTPUT"_s, context );
134 const QString outputFormat = parameterAsOutputRasterFormat( parameters, u"OUTPUT"_s, context );
135 const QString frequencyDistribution = parameterAsFileOutput( parameters, u"FREQUENCY_DISTRIBUTION"_s, context );
136
137 QgsRelief relief( mLayerSource, outputFile, outputFormat );
138
139 QList<QgsRasterReliefColor> reliefColors;
140 if ( automaticColors )
141 {
142 reliefColors = relief.calculateOptimizedReliefClasses();
143 }
144 else
145 {
146 reliefColors = qgis::down_cast< const QgsProcessingParameterReliefColors * >( parameterDefinition( u"COLORS"_s ) )->valueAsReliefColors( parameters.value( u"COLORS"_s ), context );
147 if ( reliefColors.isEmpty() )
148 throw QgsProcessingException( QObject::tr( "Specify relief colors or activate \"Generate relief classes automatically\" option." ) );
149 }
150
151 relief.setReliefColors( reliefColors );
152 relief.setZFactor( zFactor );
153
154 if ( !creationOptions.isEmpty() )
155 {
156 relief.setCreationOptions( creationOptions.split( '|' ) );
157 }
158 relief.setOutputNodataValue( outputNodata );
159
160 if ( !frequencyDistribution.isEmpty() )
161 relief.exportFrequencyDistributionToCsv( frequencyDistribution );
162
163 const QgsRelief::Result result = relief.processRaster( feedback );
164 switch ( result )
165 {
167 break;
168
170 throw QgsProcessingException( QObject::tr( "Could not open input file." ) );
171
173 throw QgsProcessingException( QObject::tr( "Could not create output file." ) );
174
176 throw QgsProcessingException( QObject::tr( "Input raster size is too small (at least 3 rows needed)." ) );
177
179 feedback->pushInfo( QObject::tr( "Canceled." ) );
180 break;
181 }
182
183 QVariantMap outputs;
184 outputs.insert( u"OUTPUT"_s, outputFile );
185 if ( !frequencyDistribution.isEmpty() )
186 outputs.insert( u"FREQUENCY_DISTRIBUTION"_s, frequencyDistribution );
187
188 return outputs;
189}
190
@ Advanced
Parameter is an advanced parameter which should be hidden from users by default.
Definition qgis.h:4006
@ Double
Double/float values.
Definition qgis.h:4047
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