QGIS API Documentation 3.28.0-Firenze (ed3ad0430f)
qgszonalstatistics.h
Go to the documentation of this file.
1/***************************************************************************
2 qgszonalstatistics.h - description
3 ----------------------------
4 begin : August 29th, 2009
5 copyright : (C) 2009 by Marco Hugentobler
6 email : marco at hugis dot net
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 QGSZONALSTATISTICS_H
19#define QGSZONALSTATISTICS_H
20
21#include <QString>
22#include <QMap>
23
24#include <limits>
25#include <cfloat>
26
27#include "qgis_analysis.h"
28#include "qgsfeedback.h"
30#include "qgsfields.h"
31
32class QgsGeometry;
33class QgsVectorLayer;
34class QgsRasterLayer;
37class QgsRectangle;
38class QgsField;
39class QgsFeatureSink;
41
46class ANALYSIS_EXPORT QgsZonalStatistics
47{
48 public:
49
52 {
53 Count = 1,
54 Sum = 2,
55 Mean = 4,
56 Median = 8,
57 StDev = 16,
58 Min = 32,
59 Max = 64,
60 Range = 128,
61 Minority = 256,
62 Majority = 512,
63 Variety = 1024,
64 Variance = 2048,
65 All = Count | Sum | Mean | Median | StDev | Max | Min | Range | Minority | Majority | Variety | Variance
66 };
67 Q_DECLARE_FLAGS( Statistics, Statistic )
68
69
70 enum Result
71 {
72 Success = 0,
73 LayerTypeWrong = 1,
77 FailedToCreateField = 8,
78 Canceled = 9
79 };
80
90 QgsRasterLayer *rasterLayer,
91 const QString &attributePrefix = QString(),
92 int rasterBand = 1,
93 QgsZonalStatistics::Statistics stats = QgsZonalStatistics::Statistics( QgsZonalStatistics::Count | QgsZonalStatistics::Sum | QgsZonalStatistics::Mean ) );
94
121 QgsZonalStatistics( QgsVectorLayer *polygonLayer,
122 QgsRasterInterface *rasterInterface,
123 const QgsCoordinateReferenceSystem &rasterCrs,
124 double rasterUnitsPerPixelX,
125 double rasterUnitsPerPixelY,
126 const QString &attributePrefix = QString(),
127 int rasterBand = 1,
128 QgsZonalStatistics::Statistics stats = QgsZonalStatistics::Statistics( QgsZonalStatistics::Count | QgsZonalStatistics::Sum | QgsZonalStatistics::Mean ) );
129
130
134 QgsZonalStatistics::Result calculateStatistics( QgsFeedback *feedback );
135
141 static QString displayName( QgsZonalStatistics::Statistic statistic );
142
148 static QString shortName( QgsZonalStatistics::Statistic statistic );
149
158#ifndef SIP_RUN
159 static QMap<QgsZonalStatistics::Statistic, QVariant> calculateStatistics( QgsRasterInterface *rasterInterface, const QgsGeometry &geometry, double cellSizeX, double cellSizeY, int rasterBand, QgsZonalStatistics::Statistics statistics );
160#endif
161
163 // Required to fix https://github.com/qgis/QGIS/issues/43245 (SIP is failing to convert the enum to values)
164
173 static QMap<int, QVariant> calculateStatisticsInt( QgsRasterInterface *rasterInterface, const QgsGeometry &geometry, double cellSizeX, double cellSizeY, int rasterBand, QgsZonalStatistics::Statistics statistics ) SIP_PYNAME( calculateStatistics );
175
176 private:
177 QgsZonalStatistics() = default;
178
179 class FeatureStats
180 {
181 public:
182 FeatureStats( bool storeValues = false, bool storeValueCounts = false )
183 : mStoreValues( storeValues )
184 , mStoreValueCounts( storeValueCounts )
185 {
186 }
187
188 void reset()
189 {
190 sum = 0;
191 count = 0;
192 max = std::numeric_limits<double>::lowest();
193 min = std::numeric_limits<double>::max();
194 valueCount.clear();
195 values.clear();
196 }
197
198 void addValue( double value, double weight = 1.0 )
199 {
200 if ( weight < 1.0 )
201 {
202 sum += value * weight;
203 count += weight;
204 }
205 else
206 {
207 sum += value;
208 ++count;
209 }
210 min = std::min( min, value );
211 max = std::max( max, value );
212 if ( mStoreValueCounts )
213 valueCount.insert( value, valueCount.value( value, 0 ) + 1 );
214 if ( mStoreValues )
215 values.append( value );
216 }
217 double sum = 0.0;
218 double count = 0.0;
219 double max = std::numeric_limits<double>::lowest();
220 double min = std::numeric_limits<double>::max();
221 QMap< double, int > valueCount;
222 QList< double > values;
223
224 private:
225 bool mStoreValues = false;
226 bool mStoreValueCounts = false;
227 };
228
229 QString getUniqueFieldName( const QString &fieldName, const QList<QgsField> &newFields );
230
231 QgsRasterInterface *mRasterInterface = nullptr;
233
234 double mCellSizeX = 0;
235 double mCellSizeY = 0;
236
238 int mRasterBand = 0;
239 QgsVectorLayer *mPolygonLayer = nullptr;
240 QString mAttributePrefix;
241 Statistics mStatistics = QgsZonalStatistics::All;
242};
243
244Q_DECLARE_OPERATORS_FOR_FLAGS( QgsZonalStatistics::Statistics )
245
246// clazy:excludeall=qstring-allocations
247
248#endif // QGSZONALSTATISTICS_H
This class represents a coordinate reference system (CRS).
An interface for objects which accept features via addFeature(s) methods.
An interface for objects which provide features via a getFeatures method.
Base class for feedback objects to be used for cancellation of something running in a worker thread.
Definition: qgsfeedback.h:45
Encapsulate a field in an attribute table or data source.
Definition: qgsfield.h:51
A geometry is the spatial representation of a feature.
Definition: qgsgeometry.h:164
Base class for raster data providers.
Base class for processing filters like renderers, reprojector, resampler etc.
Represents a raster layer.
A rectangle specified with double values.
Definition: qgsrectangle.h:42
Represents a vector layer which manages a vector based data sets.
A class that calculates raster statistics (count, sum, mean) for a polygon or multipolygon layer and ...
Statistic
Enumeration of flags that specify statistics to be calculated.
@ Mean
Mean of pixel values.
@ Sum
Sum of pixel values.
Result
Error codes for calculation.
@ RasterInvalid
Raster layer is invalid.
@ RasterBandInvalid
The raster band does not exist on the raster layer.
@ LayerInvalid
Layer is invalid.
#define SIP_PYNAME(name)
Definition: qgis_sip.h:81
Q_DECLARE_OPERATORS_FOR_FLAGS(QgsField::ConfigurationFlags) CORE_EXPORT QDataStream &operator<<(QDataStream &out
Writes the field to stream out. QGIS version compatibility is not guaranteed.