QGIS API Documentation 4.3.0-Master (7c7bd4d7018)
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 outputParam = std::make_unique<QgsProcessingParameterRasterDestination>( u"OUTPUT"_s, QObject::tr( "Relief" ) );
78 outputParam->setHelp( QObject::tr( "The output shaded relief raster layer." ) );
79 addParameter( outputParam.release() );
80
81 auto freqDistParam
82 = std::make_unique<QgsProcessingParameterFileDestination>( u"FREQUENCY_DISTRIBUTION"_s, QObject::tr( "Frequency distribution" ), QObject::tr( "CSV files (*.csv)" ), QVariant(), true, false );
83 freqDistParam->setHelp( QObject::tr( "An optional CSV file to save the frequency distribution of the relief classes." ) );
84 addParameter( freqDistParam.release() );
85}
86
87QString QgsReliefAlgorithm::shortHelpString() const
88{
89 return QObject::tr( "This algorithm creates a shaded relief layer from digital elevation data." );
90}
91
92QString QgsReliefAlgorithm::shortDescription() const
93{
94 return QObject::tr( "Creates a shaded relief layer from digital elevation data." );
95}
96
97QgsReliefAlgorithm *QgsReliefAlgorithm::createInstance() const
98{
99 return new QgsReliefAlgorithm();
100}
101
102bool QgsReliefAlgorithm::prepareAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback * )
103{
104 QgsRasterLayer *layer = parameterAsRasterLayer( parameters, u"INPUT"_s, context );
105 if ( !layer )
106 {
107 throw QgsProcessingException( invalidRasterError( parameters, u"INPUT"_s ) );
108 }
109
110 mLayerSource = layer->source();
111 return true;
112}
113
114QVariantMap QgsReliefAlgorithm::processAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback )
115{
116 const double zFactor = parameterAsDouble( parameters, u"Z_FACTOR"_s, context );
117 const bool automaticColors = parameterAsBoolean( parameters, u"AUTO_COLORS"_s, context );
118 const QString outputFile = parameterAsOutputLayer( parameters, u"OUTPUT"_s, context );
119 const QString outputFormat = parameterAsOutputRasterFormat( parameters, u"OUTPUT"_s, context );
120 const QString frequencyDistribution = parameterAsFileOutput( parameters, u"FREQUENCY_DISTRIBUTION"_s, context );
121
122 QgsRelief relief( mLayerSource, outputFile, outputFormat );
123
124 QList<QgsRasterReliefColor> reliefColors;
125 if ( automaticColors )
126 {
127 reliefColors = relief.calculateOptimizedReliefClasses();
128 }
129 else
130 {
131 reliefColors = qgis::down_cast< const QgsProcessingParameterReliefColors * >( parameterDefinition( u"COLORS"_s ) )->valueAsReliefColors( parameters.value( u"COLORS"_s ), context );
132 if ( reliefColors.isEmpty() )
133 throw QgsProcessingException( QObject::tr( "Specify relief colors or activate \"Generate relief classes automatically\" option." ) );
134 }
135
136 relief.setReliefColors( reliefColors );
137 relief.setZFactor( zFactor );
138
139 if ( !frequencyDistribution.isEmpty() )
140 relief.exportFrequencyDistributionToCsv( frequencyDistribution );
141
142 const QgsRelief::Result result = relief.processRaster( feedback );
143 switch ( result )
144 {
146 break;
147
149 throw QgsProcessingException( QObject::tr( "Could not open input file." ) );
150
152 throw QgsProcessingException( QObject::tr( "Could not create output file." ) );
153
155 throw QgsProcessingException( QObject::tr( "Input raster size is too small (at least 3 rows needed)." ) );
156
158 feedback->pushInfo( QObject::tr( "Canceled." ) );
159 break;
160 }
161
162 QVariantMap outputs;
163 outputs.insert( u"OUTPUT"_s, outputFile );
164 if ( !frequencyDistribution.isEmpty() )
165 outputs.insert( u"FREQUENCY_DISTRIBUTION"_s, frequencyDistribution );
166
167 return outputs;
168}
169
@ Double
Double/float values.
Definition qgis.h:3989
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