Branch data Line data Source code
1 : : /***************************************************************************
2 : : qgsrasteranalysisutils.h
3 : : ---------------------
4 : : Date : June 2018
5 : : Copyright : (C) 2018 by Nyall Dawson
6 : : Email : nyall dot dawson at gmail dot com
7 : : ***************************************************************************
8 : : * *
9 : : * This program is free software; you can redistribute it and/or modify *
10 : : * it under the terms of the GNU General Public License as published by *
11 : : * the Free Software Foundation; either version 2 of the License, or *
12 : : * (at your option) any later version. *
13 : : * *
14 : : ***************************************************************************/
15 : :
16 : : #ifndef QGSRASTERANALYSISUTILS_H
17 : : #define QGSRASTERANALYSISUTILS_H
18 : :
19 : : #include "qgis_analysis.h"
20 : : #include "qgis.h"
21 : :
22 : : #include <functional>
23 : : #include <memory>
24 : : #include <vector>
25 : :
26 : : #define SIP_NO_FILE
27 : :
28 : : ///@cond PRIVATE
29 : :
30 : : class QgsRasterInterface;
31 : : class QgsGeometry;
32 : : class QgsRectangle;
33 : : class QgsProcessingParameterDefinition;
34 : : class QgsRasterProjector;
35 : : class QgsRasterDataProvider;
36 : : class QgsFeedback;
37 : : class QgsRasterBlock;
38 : :
39 : : namespace QgsRasterAnalysisUtils
40 : : {
41 : :
42 : : /**
43 : : * Analyzes which cells need to be considered to completely cover the bounding box of a feature.
44 : : */
45 : : void cellInfoForBBox( const QgsRectangle &rasterBBox, const QgsRectangle &featureBBox, double cellSizeX, double cellSizeY, int &nCellsX, int &nCellsY,
46 : : int rasterWidth, int rasterHeight,
47 : : QgsRectangle &rasterBlockExtent );
48 : :
49 : : //! Returns statistics by considering the pixels where the center point is within the polygon (fast)
50 : : void statisticsFromMiddlePointTest( QgsRasterInterface *rasterInterface, int rasterBand, const QgsGeometry &poly, int nCellsX, int nCellsY,
51 : : double cellSizeX, double cellSizeY, const QgsRectangle &rasterBBox, const std::function<void( double )> &addValue, bool skipNodata = true );
52 : :
53 : : //! Returns statistics with precise pixel - polygon intersection test (slow)
54 : : void statisticsFromPreciseIntersection( QgsRasterInterface *rasterInterface, int rasterBand, const QgsGeometry &poly, int nCellsX, int nCellsY,
55 : : double cellSizeX, double cellSizeY, const QgsRectangle &rasterBBox, const std::function<void( double, double )> &addValue, bool skipNodata = true );
56 : :
57 : : //! Tests whether a pixel's value should be included in the result
58 : : bool validPixel( double value );
59 : :
60 : : //! Converts real-world map coordinates to raster row/col coordinates
61 : : void mapToPixel( const double x, const double y, const QgsRectangle bounds, const double unitsPerPixelX, const double unitsPerPixelY, int &px, int &py );
62 : :
63 : : //! Converts raster row-col coordinates to real-world map coordinates
64 : : void pixelToMap( const int px, const int py, const QgsRectangle bounds, const double unitsPerPixelX, const double unitsPerPixelY, double &x, double &y );
65 : :
66 : : /**
67 : : * Returns a new processing enum parameter for choice of raster data types.
68 : : * \see rasterTypeChoiceToDataType()
69 : : */
70 : : std::unique_ptr< QgsProcessingParameterDefinition > createRasterTypeParameter( const QString &name,
71 : : const QString &description,
72 : : Qgis::DataType defaultType = Qgis::Float32 );
73 : :
74 : : /**
75 : : * Converts the value of a raster type parameter to the corresponding data type.
76 : : * \see createRasterTypeParameter()
77 : : */
78 : : Qgis::DataType rasterTypeChoiceToDataType( int choice );
79 : :
80 : 0 : struct RasterLogicInput
81 : : {
82 : : std::unique_ptr< QgsRasterInterface > sourceDataProvider;
83 : : std::unique_ptr< QgsRasterProjector> projector;
84 : 0 : QgsRasterInterface *interface = nullptr;
85 : 0 : bool hasNoDataValue = false;
86 : 0 : std::vector< int > bands { 1 };
87 : : };
88 : :
89 : : ANALYSIS_EXPORT void applyRasterLogicOperator( const std::vector< QgsRasterAnalysisUtils::RasterLogicInput > &inputs, QgsRasterDataProvider *destinationRaster, double outputNoDataValue, const bool treatNoDataAsFalse,
90 : : int width, int height, const QgsRectangle &extent, QgsFeedback *feedback,
91 : : std::function<void( const std::vector< std::unique_ptr< QgsRasterBlock > > &, bool &, bool &, int, int, bool )> &applyLogicFunc,
92 : : qgssize &noDataCount, qgssize &trueCount, qgssize &falseCount );
93 : :
94 : : /**
95 : : * Returns a vector of double values obtained from a stack of input QgsRasterBlocks
96 : : */
97 : : std::vector<double> getCellValuesFromBlockStack( const std::vector< std::unique_ptr< QgsRasterBlock > > &inputBlocks, int &row, int &col, bool &noDataInStack );
98 : :
99 : : /**
100 : : * Enum of cell value statistic methods to be used with QgsProcessingParameterEnum
101 : : */
102 : : enum CellValueStatisticMethods
103 : : {
104 : : Sum,
105 : : Count,
106 : : Mean,
107 : : Median,
108 : : StandardDeviation,
109 : : Variance,
110 : : Minimum,
111 : : Maximum,
112 : : Minority,
113 : : Majority,
114 : : Range,
115 : : Variety
116 : : };
117 : :
118 : : /**
119 : : * Returns the arithmetic mean from a vector of cell values
120 : : */
121 : : double meanFromCellValues( std::vector<double> &cellValues, int stackSize );
122 : :
123 : : /**
124 : : * Returns the median from a vector of cell values
125 : : */
126 : : double medianFromCellValues( std::vector<double> &cellValues, int stackSize );
127 : :
128 : : /**
129 : : * Returns the standard deviation from a vector of cell values
130 : : */
131 : : double stddevFromCellValues( std::vector<double> &cellValues, int stackSize );
132 : :
133 : : /**
134 : : * Returns the variance from a vector of cell values
135 : : */
136 : : double varianceFromCellValues( std::vector<double> &cellValues, int stackSize );
137 : :
138 : : /**
139 : : * Returns the maximum value from a vector of cell values
140 : : */
141 : : double maximumFromCellValues( std::vector<double> &cellValues );
142 : :
143 : : /**
144 : : * Returns the minimum value from a vector of cell values
145 : : */
146 : : double minimumFromCellValues( std::vector<double> &cellValues );
147 : :
148 : : /**
149 : : * Returns the majority value from a vector of cell values
150 : : */
151 : : double majorityFromCellValues( std::vector<double> &cellValues, const double noDataValue, int stackSize );
152 : :
153 : : /**
154 : : * Returns the minority value from a vector of cell values
155 : : */
156 : : double minorityFromCellValues( std::vector<double> &cellValues, const double noDataValue, int stackSize );
157 : :
158 : : /**
159 : : * Returns the range from a vector of cell values
160 : : */
161 : : double rangeFromCellValues( std::vector<double> &cellValues );
162 : :
163 : : /**
164 : : * Returns the variety from a vector of cell values
165 : : */
166 : : double varietyFromCellValues( std::vector<double> &cellValues );
167 : :
168 : : enum CellValuePercentileMethods
169 : : {
170 : : NearestRankPercentile,
171 : : InterpolatedPercentileInc,
172 : : InterpolatedPercentileExc
173 : : };
174 : :
175 : : /**
176 : : * Returns the nearest rank percentile from a vector of cellValues,
177 : : * percentile parameter ranges between 0 and 1
178 : : */
179 : : double nearestRankPercentile( std::vector<double> &cellValues, int stackSize, double percentile );
180 : :
181 : : /**
182 : : * Returns the linearly interpolated percentile inclusive from a vector of cellValues,
183 : : * percentile parameter ranges between 0 and 1 inclusive
184 : : * see LibreOffice Calc's or Microsoft Excel's PERCENTILE.INC() function
185 : : */
186 : : double interpolatedPercentileInc( std::vector<double> &cellValues, int stackSize, double percentile );
187 : :
188 : : /**
189 : : * Returns the linearly interpolated percentile inclusive from a vector of cellValues,
190 : : * percentile parameter ranges between 0 and 1 exclusive
191 : : * see LibreOffice Calc's or Microsoft Excel's PERCENTILE.EXC() function
192 : : */
193 : : double interpolatedPercentileExc( std::vector<double> &cellValues, int stackSize, double percentile, double noDataValue );
194 : :
195 : : enum CellValuePercentRankMethods
196 : : {
197 : : InterpolatedPercentRankInc,
198 : : InterpolatedPercentRankExc
199 : : };
200 : :
201 : : /**
202 : : * Returns the linearly interpolated percentrank inclusive of a value from a vector of cellValues,
203 : : * values outside the cellValue distribution (greater or smaller) will return noData
204 : : * see LibreOffice Calc's or Microsoft Excel's PERCENTRANK.INC() function
205 : : */
206 : : double interpolatedPercentRankInc( std::vector<double> &cellValues, int stackSize, double value, double noDataValue );
207 : :
208 : : /**
209 : : * Returns the linearly interpolated percentrank exclusive of a value from a vector of cellValues,
210 : : * values outside the cellValue distribution (greater or smaller) will return noData
211 : : * see LibreOffice Calc's or Microsoft Excel's PERCENTRANK.EXC() function
212 : : */
213 : : double interpolatedPercentRankExc( std::vector<double> &cellValues, int stackSize, double value, double noDataValue );
214 : :
215 : : }
216 : :
217 : :
218 : : ///@endcond PRIVATE
219 : :
220 : : #endif // QGSRASTERANALYSISUTILS_H
|