@@ -158,6 +158,13 @@ int QgsZonalStatistics::calculateStatistics( QgsFeedback *feedback )
158
158
QgsField varietyField ( varietyFieldName, QVariant::Int, QStringLiteral ( " int" ) );
159
159
newFieldList.push_back ( varietyField );
160
160
}
161
+ QString varianceFieldName;
162
+ if ( mStatistics & QgsZonalStatistics::Variance )
163
+ {
164
+ varianceFieldName = getUniqueFieldName ( mAttributePrefix + " variance" , newFieldList );
165
+ QgsField varianceField ( varianceFieldName, QVariant::Double, QStringLiteral ( " double precision" ) );
166
+ newFieldList.push_back ( varianceField );
167
+ }
161
168
vectorProvider->addAttributes ( newFieldList );
162
169
163
170
// index of the new fields
@@ -172,6 +179,7 @@ int QgsZonalStatistics::calculateStatistics( QgsFeedback *feedback )
172
179
int minorityIndex = mStatistics & QgsZonalStatistics::Minority ? vectorProvider->fieldNameIndex ( minorityFieldName ) : -1 ;
173
180
int majorityIndex = mStatistics & QgsZonalStatistics::Majority ? vectorProvider->fieldNameIndex ( majorityFieldName ) : -1 ;
174
181
int varietyIndex = mStatistics & QgsZonalStatistics::Variety ? vectorProvider->fieldNameIndex ( varietyFieldName ) : -1 ;
182
+ int varianceIndex = mStatistics & QgsZonalStatistics::Variance ? vectorProvider->fieldNameIndex ( varianceFieldName ) : -1 ;
175
183
176
184
if ( ( mStatistics & QgsZonalStatistics::Count && countIndex == -1 )
177
185
|| ( mStatistics & QgsZonalStatistics::Sum && sumIndex == -1 )
@@ -184,6 +192,7 @@ int QgsZonalStatistics::calculateStatistics( QgsFeedback *feedback )
184
192
|| ( mStatistics & QgsZonalStatistics::Minority && minorityIndex == -1 )
185
193
|| ( mStatistics & QgsZonalStatistics::Majority && majorityIndex == -1 )
186
194
|| ( mStatistics & QgsZonalStatistics::Variety && varietyIndex == -1 )
195
+ || ( mStatistics & QgsZonalStatistics::Variance && varianceIndex == -1 )
187
196
)
188
197
{
189
198
// failed to create a required field
@@ -200,7 +209,8 @@ int QgsZonalStatistics::calculateStatistics( QgsFeedback *feedback )
200
209
QgsFeature f;
201
210
202
211
bool statsStoreValues = ( mStatistics & QgsZonalStatistics::Median ) ||
203
- ( mStatistics & QgsZonalStatistics::StDev );
212
+ ( mStatistics & QgsZonalStatistics::StDev ) ||
213
+ ( mStatistics & QgsZonalStatistics::Variance );
204
214
bool statsStoreValueCount = ( mStatistics & QgsZonalStatistics::Minority ) ||
205
215
( mStatistics & QgsZonalStatistics::Majority );
206
216
@@ -288,16 +298,22 @@ int QgsZonalStatistics::calculateStatistics( QgsFeedback *feedback )
288
298
}
289
299
changeAttributeMap.insert ( medianIndex, QVariant ( medianValue ) );
290
300
}
291
- if ( mStatistics & QgsZonalStatistics::StDev )
301
+ if ( mStatistics & QgsZonalStatistics::StDev || mStatistics & QgsZonalStatistics::Variance )
292
302
{
293
303
double sumSquared = 0 ;
294
304
for ( int i = 0 ; i < featureStats.values .count (); ++i )
295
305
{
296
306
double diff = featureStats.values .at ( i ) - mean;
297
307
sumSquared += diff * diff;
298
308
}
299
- double stdev = qPow ( sumSquared / featureStats.values .count (), 0.5 );
300
- changeAttributeMap.insert ( stdevIndex, QVariant ( stdev ) );
309
+ double variance = sumSquared / featureStats.values .count ();
310
+ if ( mStatistics & QgsZonalStatistics::StDev )
311
+ {
312
+ double stdev = qPow ( variance, 0.5 );
313
+ changeAttributeMap.insert ( stdevIndex, QVariant ( stdev ) );
314
+ }
315
+ if ( mStatistics & QgsZonalStatistics::Variance )
316
+ changeAttributeMap.insert ( varianceIndex, QVariant ( variance ) );
301
317
}
302
318
if ( mStatistics & QgsZonalStatistics::Min )
303
319
changeAttributeMap.insert ( minIndex, QVariant ( featureStats.min ) );
0 commit comments