1 /***************************************************************************
2                          qgsalgorithmruggedness.cpp
3                          ---------------------
4     begin                : November 2019
5     copyright            : (C) 2019 by Alexander Bruy
6     email                : alexander dot bruy 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 "qgsalgorithmruggedness.h"
19 #include "qgsrasterfilewriter.h"
20 #include "qgsruggednessfilter.h"
21 
22 ///@cond PRIVATE
23 
name() const24 QString QgsRuggednessAlgorithm::name() const
25 {
26   return QStringLiteral( "ruggednessindex" );
27 }
28 
displayName() const29 QString QgsRuggednessAlgorithm::displayName() const
30 {
31   return QObject::tr( "Ruggedness index" );
32 }
33 
tags() const34 QStringList QgsRuggednessAlgorithm::tags() const
35 {
36   return QObject::tr( "dem,ruggedness,index,terrain" ).split( ',' );
37 }
38 
group() const39 QString QgsRuggednessAlgorithm::group() const
40 {
41   return QObject::tr( "Raster terrain analysis" );
42 }
43 
groupId() const44 QString QgsRuggednessAlgorithm::groupId() const
45 {
46   return QStringLiteral( "rasterterrainanalysis" );
47 }
48 
shortHelpString() const49 QString QgsRuggednessAlgorithm::shortHelpString() const
50 {
51   return QObject::tr( "This algorithm calculates the quantitative measurement of terrain "
52                       "heterogeneity described by Riley et al. (1999)." )
53          + QStringLiteral( "\n\n" )
54          + QObject::tr( "It is calculated for every location, by summarizing the change "
55                         "in elevation within the 3x3 pixel grid. Each pixel contains the "
56                         "difference in elevation from a center cell and the 8 cells surrounding it." );
57 }
58 
createInstance() const59 QgsRuggednessAlgorithm *QgsRuggednessAlgorithm::createInstance() const
60 {
61   return new QgsRuggednessAlgorithm();
62 }
63 
initAlgorithm(const QVariantMap &)64 void QgsRuggednessAlgorithm::initAlgorithm( const QVariantMap & )
65 {
66   addParameter( new QgsProcessingParameterRasterLayer( QStringLiteral( "INPUT" ), QObject::tr( "Elevation layer" ) ) );
67   addParameter( new QgsProcessingParameterNumber( QStringLiteral( "Z_FACTOR" ), QObject::tr( "Z factor" ),
68                 QgsProcessingParameterNumber::Double, 1, false, 0 ) );
69 
70   addParameter( new QgsProcessingParameterRasterDestination( QStringLiteral( "OUTPUT" ), QObject::tr( "Ruggedness" ) ) );
71 }
72 
processAlgorithm(const QVariantMap & parameters,QgsProcessingContext & context,QgsProcessingFeedback * feedback)73 QVariantMap QgsRuggednessAlgorithm::processAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback )
74 {
75   QgsRasterLayer *inputLayer = parameterAsRasterLayer( parameters, QStringLiteral( "INPUT" ), context );
76 
77   if ( !inputLayer )
78     throw QgsProcessingException( invalidRasterError( parameters, QStringLiteral( "INPUT" ) ) );
79 
80   double zFactor = parameterAsDouble( parameters, QStringLiteral( "Z_FACTOR" ), context );
81 
82   const QString outputFile = parameterAsOutputLayer( parameters, QStringLiteral( "OUTPUT" ), context );
83   QFileInfo fi( outputFile );
84   const QString outputFormat = QgsRasterFileWriter::driverForExtension( fi.suffix() );
85 
86   QgsRuggednessFilter ruggedness( inputLayer->source(), outputFile, outputFormat );
87   ruggedness.setZFactor( zFactor );
88   ruggedness.processRaster( feedback );
89 
90   QVariantMap outputs;
91   outputs.insert( QStringLiteral( "OUTPUT" ), outputFile );
92   return outputs;
93 }
94 
95 ///@endcond
96