Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsrelief.h - description 3 : : --------------------------- 4 : : begin : November 2011 5 : : copyright : (C) 2011 by Marco Hugentobler 6 : : email : marco dot hugentobler at sourcepole dot ch 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 : : #ifndef QGSRELIEF_H 19 : : #define QGSRELIEF_H 20 : : 21 : : #include <QColor> 22 : : #include <QMap> 23 : : #include <QPair> 24 : : #include <QString> 25 : : #include "gdal.h" 26 : : #include "qgsogrutils.h" 27 : : #include "qgis_analysis.h" 28 : : 29 : : class QgsAspectFilter; 30 : : class QgsSlopeFilter; 31 : : class QgsHillshadeFilter; 32 : : class QgsFeedback; 33 : : 34 : : /** 35 : : * \ingroup analysis 36 : : * \brief Produces colored relief rasters from DEM. 37 : : */ 38 : : class ANALYSIS_EXPORT QgsRelief 39 : : { 40 : : public: 41 : 0 : struct ReliefColor 42 : : { 43 : 0 : ReliefColor( const QColor &c, double min, double max ): color( c ), minElevation( min ), maxElevation( max ) { } 44 : : QColor color; 45 : : double minElevation; 46 : : double maxElevation; 47 : : }; 48 : : 49 : : QgsRelief( const QString &inputFile, const QString &outputFile, const QString &outputFormat ); 50 : : ~QgsRelief(); 51 : : 52 : : //! QgsRelief cannot be copied 53 : : QgsRelief( const QgsRelief &rh ) = delete; 54 : : //! QgsRelief cannot be copied 55 : : QgsRelief &operator=( const QgsRelief &rh ) = delete; 56 : : 57 : : /** 58 : : * Starts the calculation, reads from mInputFile and stores the result in mOutputFile 59 : : * \param feedback feedback object that receives update and that is checked for cancellation. 60 : : * \returns 0 in case of success 61 : : */ 62 : : int processRaster( QgsFeedback *feedback = nullptr ); 63 : : 64 : : double zFactor() const { return mZFactor; } 65 : : void setZFactor( double factor ) { mZFactor = factor; } 66 : : 67 : : void clearReliefColors(); 68 : : void addReliefColorClass( const QgsRelief::ReliefColor &color ); 69 : : QList< QgsRelief::ReliefColor > reliefColors() const { return mReliefColors; } 70 : : void setReliefColors( const QList< QgsRelief::ReliefColor > &c ) { mReliefColors = c; } 71 : : 72 : : /** 73 : : * Calculates class breaks according with the method of Buenzli (2011) using an iterative algorithm for segmented regression 74 : : * \returns TRUE in case of success 75 : : */ 76 : : QList< QgsRelief::ReliefColor > calculateOptimizedReliefClasses(); 77 : : 78 : : //! Write frequency of elevation values to file for manual inspection 79 : : bool exportFrequencyDistributionToCsv( const QString &file ); 80 : : 81 : : private: 82 : : #ifdef SIP_RUN 83 : : QgsRelief( const QgsRelief &rh ); 84 : : #endif 85 : : 86 : : QString mInputFile; 87 : : QString mOutputFile; 88 : : QString mOutputFormat; 89 : : 90 : : double mCellSizeX = 0.0; 91 : : double mCellSizeY = 0.0; 92 : : //! The nodata value of the input layer 93 : : float mInputNodataValue = -1; 94 : : //! The nodata value of the output layer 95 : : float mOutputNodataValue = -1; 96 : : 97 : : double mZFactor = 1; 98 : : 99 : : std::unique_ptr< QgsSlopeFilter > mSlopeFilter; 100 : : std::unique_ptr< QgsAspectFilter > mAspectFilter; 101 : : std::unique_ptr< QgsHillshadeFilter > mHillshadeFilter285; 102 : : std::unique_ptr< QgsHillshadeFilter > mHillshadeFilter300; 103 : : std::unique_ptr< QgsHillshadeFilter > mHillshadeFilter315; 104 : : 105 : : //relief colors and corresponding elevations 106 : : QList< ReliefColor > mReliefColors; 107 : : 108 : : bool processNineCellWindow( float *x1, float *x2, float *x3, float *x4, float *x5, float *x6, float *x7, float *x8, float *x9, 109 : : unsigned char *red, unsigned char *green, unsigned char *blue ); 110 : : 111 : : //! Opens the input file and returns the dataset handle and the number of pixels in x-/y- direction 112 : : gdal::dataset_unique_ptr openInputFile( int &nCellsX, int &nCellsY ); 113 : : 114 : : /** 115 : : * Opens the output driver and tests if it supports the creation of a new dataset 116 : : * \returns nullptr on error and the driver handle on success 117 : : */ 118 : : GDALDriverH openOutputDriver(); 119 : : 120 : : /** 121 : : * Opens the output file and sets the same geotransform and CRS as the input data 122 : : * \returns the output dataset or nullptr in case of error 123 : : */ 124 : : gdal::dataset_unique_ptr openOutputFile( GDALDatasetH inputDataset, GDALDriverH outputDriver ); 125 : : 126 : : //! Sets elevation color 127 : : bool setElevationColor( double elevation, int *red, int *green, int *blue ); 128 : : 129 : : //! Sets relief colors 130 : : void setDefaultReliefColors(); 131 : : 132 : : /** 133 : : * Returns class (0-255) for an elevation value 134 : : * \returns elevation class or -1 in case of error 135 : : */ 136 : : int frequencyClassForElevation( double elevation, double minElevation, double elevationClassRange ); 137 : : //! Do one iteration of class break optimisation (algorithm from Garcia and Rodriguez) 138 : : void optimiseClassBreaks( QList<int> &breaks, double *frequencies ); 139 : : 140 : : /** 141 : : * Calculates coefficients a and b 142 : : * \param input data points ( elevation class / frequency ) 143 : : * \param a slope 144 : : * \param b y value for x=0 145 : : */ 146 : : bool calculateRegression( const QList< QPair < int, double > > &input, double &a, double &b ); 147 : : 148 : : }; 149 : : 150 : : #endif // QGSRELIEF_H