Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsreclassifyutils.h 3 : : --------------------- 4 : : begin : June, 2018 5 : : copyright : (C) 2018 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 : : #ifndef QGSRECLASSIFYUTILS 19 : : #define QGSRECLASSIFYUTILS 20 : : 21 : : #define SIP_NO_FILE 22 : : 23 : : #include "qgis_sip.h" 24 : : #include "qgis_analysis.h" 25 : : #include "qgsrasterrange.h" 26 : : #include <QVector> 27 : : 28 : : class QgsRasterInterface; 29 : : class QgsProcessingFeedback; 30 : : class QgsRasterDataProvider; 31 : : class QgsRectangle; 32 : : 33 : : ///@cond PRIVATE 34 : : 35 : : /** 36 : : * \brief Utility functions for reclassifying raster layers. 37 : : * \ingroup analysis 38 : : * \since QGIS 3.2 39 : : */ 40 : : class ANALYSIS_EXPORT QgsReclassifyUtils 41 : : { 42 : : 43 : : public: 44 : : 45 : : /** 46 : : * Represents a single class for a reclassification operation. 47 : : */ 48 : : class RasterClass : public QgsRasterRange 49 : : { 50 : : public: 51 : : 52 : : //! Default constructor for an empty class 53 : : RasterClass() = default; 54 : : 55 : : /** 56 : : * Constructor for RasterClass, with the specified range of min to max values. 57 : : * The \a value argument gives the desired output value for this raster class. 58 : : */ 59 : 0 : RasterClass( double minValue, double maxValue, QgsRasterRange::BoundsType type, double value ) 60 : 0 : : QgsRasterRange( minValue, maxValue, type ) 61 : 0 : , value( value ) 62 : 0 : {} 63 : : 64 : : //! Desired output value for class 65 : : double value = 0; 66 : : }; 67 : : 68 : : /** 69 : : * Prints a list of classes contained within \a classes to specified \a feedback object. 70 : : */ 71 : : static void reportClasses( const QVector< RasterClass > &classes, QgsProcessingFeedback *feedback ); 72 : : 73 : : /** 74 : : * Checks for overlaps in a set of \a classes, reporting any overlapping 75 : : * classes the to specified \a feedback object. 76 : : */ 77 : : static void checkForOverlaps( const QVector< RasterClass > &classes, QgsProcessingFeedback *feedback ); 78 : : 79 : : /** 80 : : * Performs a reclassification operation on a raster source \a sourceRaster, reclassifying to the given 81 : : * list of \a classes. 82 : : * 83 : : * Parameters of the raster must be given by the \a band, \a extent, \a sourceWidthPixels and 84 : : * \a sourceHeightPixels values. 85 : : * 86 : : * The raster data provider \a destinationRaster will be used to save the result of the 87 : : * reclassification operation. The caller is responsible for ensuring that this data provider 88 : : * has been created with the same extent, pixel dimensions and CRS as the input raster. 89 : : * 90 : : * The nodata value for the destination should be specified via \a destNoDataValue. This 91 : : * will be used wherever the source raster has a no data value or a source pixel value 92 : : * does not have a matching class. 93 : : * 94 : : * If \a useNoDataForMissingValues is TRUE, then any raster values which do not match to 95 : : * a class will be changed to the no data value. Otherwise they are saved unchanged. 96 : : * 97 : : * The \a feedback argument gives an optional processing feedback, for progress reports 98 : : * and cancellation. 99 : : */ 100 : : static void reclassify( const QVector< RasterClass > &classes, 101 : : QgsRasterInterface *sourceRaster, 102 : : int band, 103 : : const QgsRectangle &extent, 104 : : int sourceWidthPixels, 105 : : int sourceHeightPixels, 106 : : QgsRasterDataProvider *destinationRaster, 107 : : double destNoDataValue, bool useNoDataForMissingValues, 108 : : QgsProcessingFeedback *feedback = nullptr ); 109 : : 110 : : /** 111 : : * Reclassifies a single \a input value, using the specified list of \a classes. 112 : : * 113 : : * If a matching class was found, then \a reclassified will be set to TRUE and the 114 : : * class output value returned. 115 : : * 116 : : * If no matching class was found then \a reclassified will be set to FALSE, and the 117 : : * original \a input value returned unchanged. 118 : : */ 119 : 0 : static double reclassifyValue( const QVector< RasterClass > &classes, double input, bool &reclassified ) 120 : : { 121 : 0 : reclassified = false; 122 : 0 : for ( const QgsReclassifyUtils::RasterClass &c : classes ) 123 : : { 124 : 0 : if ( c.contains( input ) ) 125 : : { 126 : 0 : reclassified = true; 127 : 0 : return c.value; 128 : : } 129 : : } 130 : 0 : return input; 131 : 0 : } 132 : : 133 : : }; 134 : : 135 : : Q_DECLARE_TYPEINFO( QgsReclassifyUtils::RasterClass, Q_MOVABLE_TYPE ); 136 : : 137 : : 138 : : ///@endcond PRIVATE 139 : : 140 : : #endif // QGSRECLASSIFYUTILS 141 : : 142 : :