Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsrastercalculator.h - description 3 : : --------------------- 4 : : begin : September 28th, 2010 5 : : copyright : (C) 2010 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 QGSRASTERCALCULATOR_H 19 : : #define QGSRASTERCALCULATOR_H 20 : : 21 : : #include "qgsrectangle.h" 22 : : #include "qgscoordinatereferencesystem.h" 23 : : #include <QString> 24 : : #include <QVector> 25 : : #include "gdal.h" 26 : : #include "qgis_analysis.h" 27 : : #include "qgsogrutils.h" 28 : : #include "qgsrastercalcnode.h" 29 : : 30 : : class QgsRasterLayer; 31 : : class QgsFeedback; 32 : : 33 : : /** 34 : : * \ingroup analysis 35 : : * \class QgsRasterCalculatorEntry 36 : : * \brief Represents an individual raster layer/band number entry within a raster calculation. 37 : : * \since QGIS 2.18 38 : : */ 39 : 0 : class ANALYSIS_EXPORT QgsRasterCalculatorEntry 40 : : { 41 : : 42 : : public: 43 : : 44 : : /** 45 : : * Creates a list of raster entries from the current project. 46 : : * 47 : : * If there is more than one layer with the same data source 48 : : * only one of them is added to the list, duplicate names are 49 : : * also handled by appending an _n integer to the base name. 50 : : * 51 : : * \return the list of raster entries form the current project 52 : : * \since QGIS 3.6 53 : : */ 54 : : static QVector<QgsRasterCalculatorEntry> rasterEntries(); 55 : : 56 : : /** 57 : : * Name of entry. 58 : : */ 59 : : QString ref; 60 : : 61 : : /** 62 : : * Raster layer associated with entry. 63 : : */ 64 : 0 : QgsRasterLayer *raster = nullptr; 65 : : 66 : : /** 67 : : * Band number for entry. Numbering for bands usually starts at 1 for the first band, not 0. 68 : : */ 69 : 0 : int bandNumber = 1; 70 : : }; 71 : : 72 : : /** 73 : : * \ingroup analysis 74 : : * \brief Performs raster layer calculations. 75 : : */ 76 : : class ANALYSIS_EXPORT QgsRasterCalculator 77 : : { 78 : : public: 79 : : 80 : : //! Result of the calculation 81 : : enum Result 82 : : { 83 : : Success = 0, //!< Calculation successful 84 : : CreateOutputError = 1, //!< Error creating output data file 85 : : InputLayerError = 2, //!< Error reading input layer 86 : : Canceled = 3, //!< User canceled calculation 87 : : ParserError = 4, //!< Error parsing formula 88 : : MemoryError = 5, //!< Error allocating memory for result 89 : : BandError = 6, //!< Invalid band number for input 90 : : CalculationError = 7, //!< Error occurred while performing calculation 91 : : }; 92 : : 93 : : 94 : : /** 95 : : * QgsRasterCalculator constructor. 96 : : * \param formulaString formula for raster calculation 97 : : * \param outputFile output file path 98 : : * \param outputFormat output file format 99 : : * \param outputExtent output extent. CRS for output is taken from first entry in rasterEntries. 100 : : * \param nOutputColumns number of columns in output raster 101 : : * \param nOutputRows number of rows in output raster 102 : : * \param rasterEntries list of referenced raster layers 103 : : * \param transformContext coordinate transformation context 104 : : * \since QGIS 3.8 105 : : */ 106 : : QgsRasterCalculator( const QString &formulaString, const QString &outputFile, const QString &outputFormat, 107 : : const QgsRectangle &outputExtent, int nOutputColumns, int nOutputRows, 108 : : const QVector<QgsRasterCalculatorEntry> &rasterEntries, 109 : : const QgsCoordinateTransformContext &transformContext ); 110 : : 111 : : /** 112 : : * QgsRasterCalculator constructor. 113 : : * \param formulaString formula for raster calculation 114 : : * \param outputFile output file path 115 : : * \param outputFormat output file format 116 : : * \param outputExtent output extent, CRS is specified by outputCrs parameter 117 : : * \param outputCrs destination CRS for output raster 118 : : * \param nOutputColumns number of columns in output raster 119 : : * \param nOutputRows number of rows in output raster 120 : : * \param rasterEntries list of referenced raster layers 121 : : * \param transformContext coordinate transformation context 122 : : * \since QGIS 3.8 123 : : */ 124 : : QgsRasterCalculator( const QString &formulaString, const QString &outputFile, const QString &outputFormat, 125 : : const QgsRectangle &outputExtent, const QgsCoordinateReferenceSystem &outputCrs, 126 : : int nOutputColumns, int nOutputRows, 127 : : const QVector<QgsRasterCalculatorEntry> &rasterEntries, 128 : : const QgsCoordinateTransformContext &transformContext ); 129 : : 130 : : 131 : : /** 132 : : * QgsRasterCalculator constructor. 133 : : * \param formulaString formula for raster calculation 134 : : * \param outputFile output file path 135 : : * \param outputFormat output file format 136 : : * \param outputExtent output extent. CRS for output is taken from first entry in rasterEntries. 137 : : * \param nOutputColumns number of columns in output raster 138 : : * \param nOutputRows number of rows in output raster 139 : : * \param rasterEntries list of referenced raster layers 140 : : * \deprecated since QGIS 3.8, use the version with transformContext instead 141 : : */ 142 : : Q_DECL_DEPRECATED QgsRasterCalculator( const QString &formulaString, const QString &outputFile, const QString &outputFormat, 143 : : const QgsRectangle &outputExtent, int nOutputColumns, int nOutputRows, const QVector<QgsRasterCalculatorEntry> &rasterEntries ) SIP_DEPRECATED; 144 : : 145 : : /** 146 : : * QgsRasterCalculator constructor. 147 : : * \param formulaString formula for raster calculation 148 : : * \param outputFile output file path 149 : : * \param outputFormat output file format 150 : : * \param outputExtent output extent, CRS is specified by outputCrs parameter 151 : : * \param outputCrs destination CRS for output raster 152 : : * \param nOutputColumns number of columns in output raster 153 : : * \param nOutputRows number of rows in output raster 154 : : * \param rasterEntries list of referenced raster layers 155 : : * \deprecated since QGIS 3.8, use the version with transformContext instead 156 : : * \since QGIS 2.10 157 : : */ 158 : : Q_DECL_DEPRECATED QgsRasterCalculator( const QString &formulaString, const QString &outputFile, const QString &outputFormat, 159 : : const QgsRectangle &outputExtent, const QgsCoordinateReferenceSystem &outputCrs, int nOutputColumns, int nOutputRows, const QVector<QgsRasterCalculatorEntry> &rasterEntries ) SIP_DEPRECATED; 160 : : 161 : : /** 162 : : * Starts the calculation and writes a new raster. 163 : : * 164 : : * The optional \a feedback argument can be used for progress reporting and cancellation support. 165 : : * 166 : : * \returns QgsRasterCalculator::Success in case of success. If an error is encountered then 167 : : * a description of the error can be obtained by calling lastError(). 168 : : */ 169 : : Result processCalculation( QgsFeedback *feedback = nullptr ); 170 : : 171 : : /** 172 : : * Returns a description of the last error encountered. 173 : : * \since QGIS 3.4 174 : : */ 175 : : QString lastError() const; 176 : : 177 : : private: 178 : : //default constructor forbidden. We need formula, output file, output format and output raster resolution obligatory 179 : : QgsRasterCalculator() = delete; 180 : : 181 : : /** 182 : : * Opens the output driver and tests if it supports the creation of a new dataset 183 : : * \returns nullptr on error and the driver handle on success 184 : : */ 185 : : GDALDriverH openOutputDriver(); 186 : : 187 : : /** 188 : : * Opens the output file and sets the same geotransform and CRS as the input data 189 : : * \returns the output dataset or nullptr in case of error 190 : : */ 191 : : gdal::dataset_unique_ptr openOutputFile( GDALDriverH outputDriver ); 192 : : 193 : : /** 194 : : * Sets gdal 6 parameters array from mOutputRectangle, mNumOutputColumns, mNumOutputRows 195 : : * \param transform double[6] array that receives the GDAL parameters 196 : : */ 197 : : void outputGeoTransform( double *transform ) const; 198 : : 199 : : //! Execute calculations on GPU 200 : : Result processCalculationGPU( std::unique_ptr< QgsRasterCalcNode > calcNode, QgsFeedback *feedback = nullptr ); 201 : : 202 : : QString mFormulaString; 203 : : QString mOutputFile; 204 : : QString mOutputFormat; 205 : : 206 : : //! Output raster extent 207 : : QgsRectangle mOutputRectangle; 208 : : QgsCoordinateReferenceSystem mOutputCrs; 209 : : 210 : : //! Number of output columns 211 : : int mNumOutputColumns = 0; 212 : : //! Number of output rows 213 : : int mNumOutputRows = 0; 214 : : 215 : : QString mLastError; 216 : : 217 : : /***/ 218 : : QVector<QgsRasterCalculatorEntry> mRasterEntries; 219 : : 220 : : QgsCoordinateTransformContext mTransformContext; 221 : : }; 222 : : 223 : : #endif // QGSRASTERCALCULATOR_H