25using namespace Qt::StringLiterals;
30QString QgsReliefAlgorithm::name()
const
35QString QgsReliefAlgorithm::displayName()
const
37 return QObject::tr(
"Relief" );
40QStringList QgsReliefAlgorithm::tags()
const
42 return QObject::tr(
"elevation" ).split(
',' );
45QString QgsReliefAlgorithm::group()
const
47 return QObject::tr(
"Raster terrain analysis" );
50QString QgsReliefAlgorithm::groupId()
const
52 return u
"rasterterrainanalysis"_s;
55QgsReliefAlgorithm::~QgsReliefAlgorithm() =
default;
57void QgsReliefAlgorithm::initAlgorithm(
const QVariantMap & )
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() );
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() );
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() );
71 auto colorsParam = std::make_unique<QgsProcessingParameterReliefColors>( u
"COLORS"_s, QObject::tr(
"Relief colors" ), u
"INPUT"_s,
true );
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." )
75 addParameter( colorsParam.release() );
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() );
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() );
87QString QgsReliefAlgorithm::shortHelpString()
const
89 return QObject::tr(
"This algorithm creates a shaded relief layer from digital elevation data." );
92QString QgsReliefAlgorithm::shortDescription()
const
94 return QObject::tr(
"Creates a shaded relief layer from digital elevation data." );
97QgsReliefAlgorithm *QgsReliefAlgorithm::createInstance()
const
99 return new QgsReliefAlgorithm();
104 QgsRasterLayer *layer = parameterAsRasterLayer( parameters, u
"INPUT"_s, context );
110 mLayerSource = layer->
source();
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 );
122 QgsRelief relief( mLayerSource, outputFile, outputFormat );
124 QList<QgsRasterReliefColor> reliefColors;
125 if ( automaticColors )
127 reliefColors = relief.calculateOptimizedReliefClasses();
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." ) );
136 relief.setReliefColors( reliefColors );
137 relief.setZFactor( zFactor );
139 if ( !frequencyDistribution.isEmpty() )
140 relief.exportFrequencyDistributionToCsv( frequencyDistribution );
155 throw QgsProcessingException( QObject::tr(
"Input raster size is too small (at least 3 rows needed)." ) );
158 feedback->
pushInfo( QObject::tr(
"Canceled." ) );
163 outputs.insert( u
"OUTPUT"_s, outputFile );
164 if ( !frequencyDistribution.isEmpty() )
165 outputs.insert( u
"FREQUENCY_DISTRIBUTION"_s, frequencyDistribution );
@ Double
Double/float values.
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.
Result
Calculation results.
@ Canceled
Operation was canceled.
@ Success
Calculation succeeded.
@ OutputCreationFailed
Creation of output layer failed.
@ InvalidInput
Invalid input layer.
@ InvalidInputSize
Input raster was too small (at least 3 rows are required).