QGIS API Documentation 4.1.0-Master (5bf3c20f3c9)
Loading...
Searching...
No Matches
qgsalgorithmbasicstatistics.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsalgorithmbasicstatistics.cpp
3 ------------------------------
4 begin : June 2024
5 copyright : (C) 2024 by Alexander Bruy
6 email : alexander dot bruy 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
19
23
24#include <QString>
25
26using namespace Qt::StringLiterals;
27
29
30QString QgsBasicStatisticsAlgorithm::name() const
31{
32 return u"basicstatisticsforfields"_s;
33}
34
35QString QgsBasicStatisticsAlgorithm::displayName() const
36{
37 return QObject::tr( "Basic statistics for fields" );
38}
39
40QStringList QgsBasicStatisticsAlgorithm::tags() const
41{
42 return QObject::tr( "stats,statistics,date,time,datetime,string,number,text,table,layer,sum,maximum,minimum,mean,average,standard,deviation,count,distinct,unique,variance,median,quartile,range,majority,minority,summary" )
43 .split( ',' );
44}
45
46QString QgsBasicStatisticsAlgorithm::group() const
47{
48 return QObject::tr( "Vector analysis" );
49}
50
51QString QgsBasicStatisticsAlgorithm::groupId() const
52{
53 return u"vectoranalysis"_s;
54}
55
56QString QgsBasicStatisticsAlgorithm::shortHelpString() const
57{
58 return QObject::tr(
59 "This algorithm generates basic statistics from the analysis of values in a field in the attribute table of a vector layer. Numeric, date, time and string fields are supported. The statistics "
60 "returned will depend on the field type."
61 );
62}
63
64QString QgsBasicStatisticsAlgorithm::shortDescription() const
65{
66 return QObject::tr( "Generates basic statistics from the values in a field of a vector layer." );
67}
68
69QgsBasicStatisticsAlgorithm *QgsBasicStatisticsAlgorithm::createInstance() const
70{
71 return new QgsBasicStatisticsAlgorithm();
72}
73
74void QgsBasicStatisticsAlgorithm::initAlgorithm( const QVariantMap & )
75{
76 addParameter( new QgsProcessingParameterFeatureSource( u"INPUT_LAYER"_s, QObject::tr( "Input layer" ), QList<int>() << static_cast<int>( Qgis::ProcessingSourceType::Vector ) ) );
77 addParameter( new QgsProcessingParameterField( u"FIELD_NAME"_s, QObject::tr( "Field to calculate statistics on" ), QVariant(), u"INPUT_LAYER"_s ) );
78 addParameter( new QgsProcessingParameterFeatureSink( u"OUTPUT"_s, QObject::tr( "Statistics" ), Qgis::ProcessingSourceType::Vector, QVariant(), true ) );
79 addParameter( new QgsProcessingParameterFileDestination( u"OUTPUT_HTML_FILE"_s, QObject::tr( "Statistics report" ), QObject::tr( "'HTML files (*.html)" ), QVariant(), true ) );
80
81 addOutput( new QgsProcessingOutputNumber( u"COUNT"_s, QObject::tr( "Count" ) ) );
82 addOutput( new QgsProcessingOutputNumber( u"UNIQUE"_s, QObject::tr( "Number of unique values" ) ) );
83 addOutput( new QgsProcessingOutputNumber( u"EMPTY"_s, QObject::tr( "Number of empty (null) values" ) ) );
84 addOutput( new QgsProcessingOutputNumber( u"FILLED"_s, QObject::tr( "Number of non-empty values" ) ) );
85 addOutput( new QgsProcessingOutputNumber( u"MIN"_s, QObject::tr( "Minimum value" ) ) );
86 addOutput( new QgsProcessingOutputNumber( u"MAX"_s, QObject::tr( "Maximum value" ) ) );
87 addOutput( new QgsProcessingOutputNumber( u"MIN_LENGTH"_s, QObject::tr( "Minimum length" ) ) );
88 addOutput( new QgsProcessingOutputNumber( u"MAX_LENGTH"_s, QObject::tr( "Maximum length" ) ) );
89 addOutput( new QgsProcessingOutputNumber( u"MEAN_LENGTH"_s, QObject::tr( "Mean length" ) ) );
90 addOutput( new QgsProcessingOutputNumber( u"CV"_s, QObject::tr( "Coefficient of Variation" ) ) );
91 addOutput( new QgsProcessingOutputNumber( u"SUM"_s, QObject::tr( "Sum" ) ) );
92 addOutput( new QgsProcessingOutputNumber( u"MEAN"_s, QObject::tr( "Mean value" ) ) );
93 addOutput( new QgsProcessingOutputNumber( u"STD_DEV"_s, QObject::tr( "Standard deviation" ) ) );
94 addOutput( new QgsProcessingOutputNumber( u"RANGE"_s, QObject::tr( "Range" ) ) );
95 addOutput( new QgsProcessingOutputNumber( u"MEDIAN"_s, QObject::tr( "Median" ) ) );
96 addOutput( new QgsProcessingOutputNumber( u"MINORITY"_s, QObject::tr( "Minority (rarest occurring value)" ) ) );
97 addOutput( new QgsProcessingOutputNumber( u"MAJORITY"_s, QObject::tr( "Majority (most frequently occurring value)" ) ) );
98 addOutput( new QgsProcessingOutputNumber( u"FIRSTQUARTILE"_s, QObject::tr( "First quartile" ) ) );
99 addOutput( new QgsProcessingOutputNumber( u"THIRDQUARTILE"_s, QObject::tr( "Third quartile" ) ) );
100 addOutput( new QgsProcessingOutputNumber( u"IQR"_s, QObject::tr( "Interquartile Range (IQR)" ) ) );
101}
102
103QVariantMap QgsBasicStatisticsAlgorithm::processAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback )
104{
105 std::unique_ptr<QgsProcessingFeatureSource> source( parameterAsSource( parameters, u"INPUT_LAYER"_s, context ) );
106 if ( !source )
107 throw QgsProcessingException( invalidSourceError( parameters, u"INPUT_LAYER"_s ) );
108
109 const QString fieldName = parameterAsString( parameters, u"FIELD_NAME"_s, context );
110 const int fieldIndex = source->fields().lookupField( fieldName );
111 if ( fieldIndex < 0 )
112 {
113 throw QgsProcessingException( QObject::tr( "Invalid field for statistics: “%1” does not exist" ).arg( fieldName ) );
114 }
115
116 QgsField field = source->fields().at( fieldIndex );
117
118 QString outputHtml = parameterAsFileOutput( parameters, u"OUTPUT_HTML_FILE"_s, context );
119
120 QgsFeatureRequest request;
121 request.setFlags( Qgis::FeatureRequestFlag::NoGeometry ).setSubsetOfAttributes( QStringList() << fieldName, source->fields() );
123 const long long count = source->featureCount();
124
125 QgsFields fields;
126 fields.append( QgsField( u"count"_s, QMetaType::Int ) );
127 fields.append( QgsField( u"unique"_s, QMetaType::Int ) );
128 fields.append( QgsField( u"empty"_s, QMetaType::Int ) );
129 fields.append( QgsField( u"filled"_s, QMetaType::Int ) );
130
131 if ( field.isNumeric() )
132 {
133 fields.append( QgsField( u"min"_s, QMetaType::Double ) );
134 fields.append( QgsField( u"max"_s, QMetaType::Double ) );
135 fields.append( QgsField( u"range"_s, QMetaType::Double ) );
136 fields.append( QgsField( u"sum"_s, QMetaType::Double ) );
137 fields.append( QgsField( u"mean"_s, QMetaType::Double ) );
138 fields.append( QgsField( u"median"_s, QMetaType::Double ) );
139 fields.append( QgsField( u"stddev"_s, QMetaType::Double ) );
140 fields.append( QgsField( u"cv"_s, QMetaType::Double ) );
141 fields.append( QgsField( u"minority"_s, QMetaType::Double ) );
142 fields.append( QgsField( u"majority"_s, QMetaType::Double ) );
143 fields.append( QgsField( u"q1"_s, QMetaType::Double ) );
144 fields.append( QgsField( u"q3"_s, QMetaType::Double ) );
145 fields.append( QgsField( u"iqr"_s, QMetaType::Double ) );
146 }
147 else if ( field.isDateOrTime() )
148 {
149 if ( field.type() == QMetaType::Type::QDate )
150 {
151 fields.append( QgsField( u"min"_s, QMetaType::QDate ) );
152 fields.append( QgsField( u"max"_s, QMetaType::QDate ) );
153 }
154 else if ( field.type() == QMetaType::Type::QTime )
155 {
156 fields.append( QgsField( u"min"_s, QMetaType::QTime ) );
157 fields.append( QgsField( u"max"_s, QMetaType::QTime ) );
158 }
159 else
160 {
161 fields.append( QgsField( u"min"_s, QMetaType::QDateTime ) );
162 fields.append( QgsField( u"max"_s, QMetaType::QDateTime ) );
163 }
164 fields.append( QgsField( u"range"_s, QMetaType::Double ) );
165 }
166 else
167 {
168 fields.append( QgsField( u"min"_s, QMetaType::QString ) );
169 fields.append( QgsField( u"max"_s, QMetaType::QString ) );
170 fields.append( QgsField( u"min_length"_s, QMetaType::Double ) );
171 fields.append( QgsField( u"max_length"_s, QMetaType::Double ) );
172 fields.append( QgsField( u"mean_length"_s, QMetaType::Double ) );
173 fields.append( QgsField( u"minority"_s, QMetaType::QString ) );
174 fields.append( QgsField( u"majority"_s, QMetaType::QString ) );
175 }
176
177 QString destId;
178 std::unique_ptr<QgsFeatureSink> sink( parameterAsSink( parameters, u"OUTPUT"_s, context, destId, fields, Qgis::WkbType::NoGeometry, QgsCoordinateReferenceSystem() ) );
179 if ( parameters.value( u"OUTPUT"_s ).isValid() && !sink )
180 throw QgsProcessingException( invalidSinkError( parameters, u"OUTPUT"_s ) );
181
182 QStringList data;
183 data << QObject::tr( "Analyzed field: %1" ).arg( fieldName );
184
185 QVariantMap outputs;
186
187 if ( field.isNumeric() )
188 {
189 outputs = calculateNumericStatistics( parameters, fieldIndex, features, count, sink.get(), data, feedback );
190 }
191 else if ( field.isDateOrTime() )
192 {
193 outputs = calculateDateTimeStatistics( parameters, fieldIndex, field, features, count, sink.get(), data, feedback );
194 }
195 else
196 {
197 outputs = calculateStringStatistics( parameters, fieldIndex, features, count, sink.get(), data, feedback );
198 }
199 if ( sink )
200 sink->finalize();
201
202 if ( !outputHtml.isEmpty() )
203 {
204 QFile file( outputHtml );
205 if ( file.open( QIODevice::WriteOnly | QIODevice::Truncate ) )
206 {
207 QTextStream out( &file );
208 out << u"<html><head><meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\"/></head><body>\n"_s;
209 for ( const QString &s : data )
210 {
211 out << u"<p>%1</p>"_s.arg( s );
212 }
213 out << u"</body></html>"_s;
214
215 outputs.insert( u"OUTPUT_HTML_FILE"_s, outputHtml );
216 }
217 }
218
219 if ( sink )
220 {
221 outputs.insert( u"OUTPUT"_s, destId );
222 }
223
224 return outputs;
225}
226
227QVariantMap QgsBasicStatisticsAlgorithm::calculateNumericStatistics(
228 const QVariantMap &parameters, const int fieldIndex, QgsFeatureIterator features, const long long count, QgsFeatureSink *sink, QStringList &data, QgsProcessingFeedback *feedback
229)
230{
231 const double step = count > 0 ? 100.0 / count : 1;
232 long long current = 0;
233
234 QgsFeature f;
236
237 while ( features.nextFeature( f ) )
238 {
239 if ( feedback->isCanceled() )
240 {
241 break;
242 }
243
244 stat.addVariant( f.attribute( fieldIndex ) );
245 feedback->setProgress( current * step );
246 current++;
247 }
248 stat.finalize();
249
250 const double cv = stat.mean() != 0 ? stat.stDev() / stat.mean() : 0;
251
252 QVariantMap outputs;
253 outputs.insert( u"COUNT"_s, stat.count() );
254 outputs.insert( u"UNIQUE"_s, stat.variety() );
255 outputs.insert( u"EMPTY"_s, stat.countMissing() );
256 outputs.insert( u"FILLED"_s, count - stat.countMissing() );
257 outputs.insert( u"MIN"_s, stat.min() );
258 outputs.insert( u"MAX"_s, stat.max() );
259 outputs.insert( u"RANGE"_s, stat.range() );
260 outputs.insert( u"SUM"_s, stat.sum() );
261 outputs.insert( u"MEAN"_s, stat.mean() );
262 outputs.insert( u"MEDIAN"_s, stat.median() );
263 outputs.insert( u"STD_DEV"_s, stat.stDev() );
264 outputs.insert( u"CV"_s, cv );
265 outputs.insert( u"MINORITY"_s, stat.minority() );
266 outputs.insert( u"MAJORITY"_s, stat.majority() );
267 outputs.insert( u"FIRSTQUARTILE"_s, stat.firstQuartile() );
268 outputs.insert( u"THIRDQUARTILE"_s, stat.thirdQuartile() );
269 outputs.insert( u"IQR"_s, stat.interQuartileRange() );
270
271 data
272 << QObject::tr( "Count: %1" ).arg( stat.count() )
273 << QObject::tr( "Unique values: %1" ).arg( stat.variety() )
274 << QObject::tr( "NULL (missing) values: %1" ).arg( stat.countMissing() )
275 << QObject::tr( "NOT NULL (filled) values: %1" ).arg( count - stat.countMissing() )
276 << QObject::tr( "Minimum value: %1" ).arg( stat.min() )
277 << QObject::tr( "Maximum value: %1" ).arg( stat.max() )
278 << QObject::tr( "Range: %1" ).arg( stat.range() )
279 << QObject::tr( "Sum: %1" ).arg( stat.sum(), 0, 'f' )
280 << QObject::tr( "Mean value: %1" ).arg( stat.mean(), 0, 'f' )
281 << QObject::tr( "Median value: %1" ).arg( stat.median(), 0, 'f' )
282 << QObject::tr( "Standard deviation: %1" ).arg( stat.stDev(), 0, 'f', 12 )
283 << QObject::tr( "Coefficient of Variation: %1" ).arg( cv, 0, 'f' )
284 << QObject::tr( "Minority (rarest occurring value): %1" ).arg( stat.minority() )
285 << QObject::tr( "Majority (most frequently occurring value): %1" ).arg( stat.majority() )
286 << QObject::tr( "First quartile: %1" ).arg( stat.firstQuartile(), 0, 'f' )
287 << QObject::tr( "Third quartile: %1" ).arg( stat.thirdQuartile(), 0, 'f' )
288 << QObject::tr( "Interquartile Range (IQR): %1" ).arg( stat.interQuartileRange() );
289
290 if ( sink )
291 {
292 QgsFeature f;
295 << outputs.value( u"COUNT"_s )
296 << outputs.value( u"UNIQUE"_s )
297 << outputs.value( u"EMPTY"_s )
298 << outputs.value( u"FILLED"_s )
299 << outputs.value( u"MIN"_s )
300 << outputs.value( u"MAX"_s )
301 << outputs.value( u"RANGE"_s )
302 << outputs.value( u"SUM"_s )
303 << outputs.value( u"MEAN"_s )
304 << outputs.value( u"MEDIAN"_s )
305 << outputs.value( u"STD_DEV"_s )
306 << outputs.value( u"CV"_s )
307 << outputs.value( u"MINORITY"_s )
308 << outputs.value( u"MAJORITY"_s )
309 << outputs.value( u"FIRSTQUARTILE"_s )
310 << outputs.value( u"THIRDQUARTILE"_s )
311 << outputs.value( u"IQR"_s )
312 );
313 if ( !sink->addFeature( f, QgsFeatureSink::FastInsert ) )
314 {
315 throw QgsProcessingException( writeFeatureError( sink, parameters, QString() ) );
316 }
317 }
318
319 return outputs;
320}
321
322QVariantMap QgsBasicStatisticsAlgorithm::calculateDateTimeStatistics(
323 const QVariantMap &parameters, const int fieldIndex, QgsField field, QgsFeatureIterator features, const long long count, QgsFeatureSink *sink, QStringList &data, QgsProcessingFeedback *feedback
324)
325{
326 const double step = count > 0 ? 100.0 / count : 1;
327 long long current = 0;
328
329 QgsFeature f;
331
332 while ( features.nextFeature( f ) )
333 {
334 if ( feedback->isCanceled() )
335 {
336 break;
337 }
338
339 stat.addValue( f.attribute( fieldIndex ) );
340 feedback->setProgress( current * step );
341 current++;
342 }
343 stat.finalize();
344
345 QVariantMap outputs;
346 outputs.insert( u"COUNT"_s, stat.count() );
347 outputs.insert( u"UNIQUE"_s, stat.countDistinct() );
348 outputs.insert( u"EMPTY"_s, stat.countMissing() );
349 outputs.insert( u"FILLED"_s, stat.count() - stat.countMissing() );
350 outputs.insert( u"MIN"_s, stat.statistic( Qgis::DateTimeStatistic::Min ) );
351 outputs.insert( u"MAX"_s, stat.statistic( Qgis::DateTimeStatistic::Max ) );
352 outputs.insert( u"RANGE"_s, stat.range().seconds() );
353
354 data
355 << QObject::tr( "Count: %1" ).arg( stat.count() )
356 << QObject::tr( "Unique values: %1" ).arg( stat.countDistinct() )
357 << QObject::tr( "NULL (missing) values: %1" ).arg( stat.countMissing() )
358 << QObject::tr( "NOT NULL (filled) values: %1" ).arg( stat.count() - stat.countMissing() )
359 << QObject::tr( "Minimum value: %1" ).arg( field.displayString( stat.statistic( Qgis::DateTimeStatistic::Min ) ) )
360 << QObject::tr( "Maximum value: %1" ).arg( field.displayString( stat.statistic( Qgis::DateTimeStatistic::Max ) ) )
361 << QObject::tr( "Range (seconds): %1" ).arg( stat.range().seconds() );
362
363 if ( sink )
364 {
365 QgsFeature f;
368 << outputs.value( u"COUNT"_s )
369 << outputs.value( u"UNIQUE"_s )
370 << outputs.value( u"EMPTY"_s )
371 << outputs.value( u"FILLED"_s )
372 << outputs.value( u"MIN"_s )
373 << outputs.value( u"MAX"_s )
374 << outputs.value( u"RANGE"_s )
375 );
376 if ( !sink->addFeature( f, QgsFeatureSink::FastInsert ) )
377 {
378 throw QgsProcessingException( writeFeatureError( sink, parameters, QString() ) );
379 }
380 }
381
382 return outputs;
383}
384
385QVariantMap QgsBasicStatisticsAlgorithm::calculateStringStatistics(
386 const QVariantMap &parameters, const int fieldIndex, QgsFeatureIterator features, const long long count, QgsFeatureSink *sink, QStringList &data, QgsProcessingFeedback *feedback
387)
388{
389 const double step = count > 0 ? 100.0 / count : 1;
390 long long current = 0;
391
392 QgsFeature f;
394
395 while ( features.nextFeature( f ) )
396 {
397 if ( feedback->isCanceled() )
398 {
399 break;
400 }
401
402 stat.addValue( f.attribute( fieldIndex ) );
403 feedback->setProgress( current * step );
404 current++;
405 }
406 stat.finalize();
407
408 QVariantMap outputs;
409 outputs.insert( u"COUNT"_s, stat.count() );
410 outputs.insert( u"UNIQUE"_s, stat.countDistinct() );
411 outputs.insert( u"EMPTY"_s, stat.countMissing() );
412 outputs.insert( u"FILLED"_s, stat.count() - stat.countMissing() );
413 outputs.insert( u"MIN"_s, stat.min() );
414 outputs.insert( u"MAX"_s, stat.max() );
415 outputs.insert( u"MIN_LENGTH"_s, stat.minLength() );
416 outputs.insert( u"MAX_LENGTH"_s, stat.maxLength() );
417 outputs.insert( u"MEAN_LENGTH"_s, stat.meanLength() );
418 outputs.insert( u"MINORITY"_s, stat.minority() );
419 outputs.insert( u"MAJORITY"_s, stat.majority() );
420
421 data
422 << QObject::tr( "Count: %1" ).arg( stat.count() )
423 << QObject::tr( "Unique values: %1" ).arg( stat.countDistinct() )
424 << QObject::tr( "NULL (missing) values: %1" ).arg( stat.countMissing() )
425 << QObject::tr( "NOT NULL (filled) values: %1" ).arg( count - stat.countMissing() )
426 << QObject::tr( "Minimum value: %1" ).arg( stat.min() )
427 << QObject::tr( "Maximum value: %1" ).arg( stat.max() )
428 << QObject::tr( "Minimum length: %1" ).arg( stat.minLength() )
429 << QObject::tr( "Maximum length: %1" ).arg( stat.maxLength() )
430 << QObject::tr( "Mean length: %1" ).arg( stat.meanLength(), 0, 'f' )
431 << QObject::tr( "Minority: %1" ).arg( stat.minority() )
432 << QObject::tr( "Majority: %1" ).arg( stat.majority() );
433
434 if ( sink )
435 {
436 QgsFeature f;
439 << outputs.value( u"COUNT"_s )
440 << outputs.value( u"UNIQUE"_s )
441 << outputs.value( u"EMPTY"_s )
442 << outputs.value( u"FILLED"_s )
443 << outputs.value( u"MIN"_s )
444 << outputs.value( u"MAX"_s )
445 << outputs.value( u"MIN_LENGTH"_s )
446 << outputs.value( u"MAX_LENGTH"_s )
447 << outputs.value( u"MEAN_LENGTH"_s )
448 << outputs.value( u"MINORITY"_s )
449 << outputs.value( u"MAJORITY"_s )
450 );
451 if ( !sink->addFeature( f, QgsFeatureSink::FastInsert ) )
452 {
453 throw QgsProcessingException( writeFeatureError( sink, parameters, QString() ) );
454 }
455 }
456
457 return outputs;
458}
459
@ Vector
Tables (i.e. vector layers with or without geometry). When used for a sink this indicates the sink ha...
Definition qgis.h:3653
@ NoGeometry
Geometry is not required. It may still be returned if e.g. required for a filter condition.
Definition qgis.h:2276
@ SkipGeometryValidityChecks
Invalid geometry checks should always be skipped. This flag can be useful for algorithms which always...
Definition qgis.h:3828
@ NoGeometry
No geometry.
Definition qgis.h:312
@ Max
Maximum (latest) datetime value.
Definition qgis.h:6248
@ Min
Minimum (earliest) datetime value.
Definition qgis.h:6247
A vector of attributes.
Represents a coordinate reference system (CRS).
Calculator for summary statistics and aggregates for a list of datetimes.
QVariant statistic(Qgis::DateTimeStatistic stat) const
Returns the value of a specified statistic.
QgsInterval range() const
Returns the range (interval between earliest and latest non-null datetime values).
void addValue(const QVariant &value)
Adds a single datetime to the statistics calculation.
void finalize()
Must be called after adding all datetimes with addValue() and before retrieving any calculated dateti...
int count() const
Returns the calculated count of values.
int countMissing() const
Returns the number of missing (null) datetime values.
int countDistinct() const
Returns the number of distinct datetime values.
Wrapper for iterator of features from vector data provider or vector layer.
bool nextFeature(QgsFeature &f)
Fetch next feature and stores in f, returns true on success.
Wraps a request for features to a vector layer (or directly its vector data provider).
QgsFeatureRequest & setFlags(Qgis::FeatureRequestFlags flags)
Sets flags that affect how features will be fetched.
QgsFeatureRequest & setSubsetOfAttributes(const QgsAttributeList &attrs)
Set a subset of attributes that will be fetched.
An interface for objects which accept features via addFeature(s) methods.
virtual bool addFeature(QgsFeature &feature, QgsFeatureSink::Flags flags=QgsFeatureSink::Flags())
Adds a single feature to the sink.
@ FastInsert
Use faster inserts, at the cost of updating the passed features to reflect changes made at the provid...
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
Definition qgsfeature.h:60
void setAttributes(const QgsAttributes &attrs)
Sets the feature's attributes.
Q_INVOKABLE QVariant attribute(const QString &name) const
Lookup attribute value by attribute name.
bool isCanceled() const
Tells whether the operation has been canceled already.
Definition qgsfeedback.h:56
void setProgress(double progress)
Sets the current progress for the feedback object.
Definition qgsfeedback.h:65
Encapsulate a field in an attribute table or data source.
Definition qgsfield.h:56
QMetaType::Type type
Definition qgsfield.h:63
bool isDateOrTime
Definition qgsfield.h:60
QString displayString(const QVariant &v) const
Formats string for display.
Definition qgsfield.cpp:314
bool isNumeric
Definition qgsfield.h:59
Container of fields for a vector layer.
Definition qgsfields.h:46
bool append(const QgsField &field, Qgis::FieldOrigin origin=Qgis::FieldOrigin::Provider, int originIndex=-1)
Appends a field.
Definition qgsfields.cpp:75
double seconds() const
Returns the interval duration in seconds.
Contains information about the context in which a processing algorithm is executed.
Custom exception class for processing related exceptions.
Base class for providing feedback from a processing algorithm.
A numeric output for processing algorithms.
A feature sink output for processing algorithms.
An input feature source (such as vector layers) parameter for processing algorithms.
A vector layer or feature source field parameter for processing algorithms.
A generic file based destination parameter, for specifying the destination path for a file (non-map l...
Calculator for summary statistics for a list of doubles.
void addVariant(const QVariant &value)
Adds a single value to the statistics calculation.
double firstQuartile() const
Returns the first quartile of the values.
double sum() const
Returns calculated sum of values.
double mean() const
Returns calculated mean of values.
double majority() const
Returns majority of values.
int countMissing() const
Returns the number of missing (null) values.
double interQuartileRange() const
Returns the inter quartile range of the values.
double median() const
Returns calculated median of values.
double minority() const
Returns minority of values.
double min() const
Returns calculated minimum from values.
double stDev() const
Returns population standard deviation.
double thirdQuartile() const
Returns the third quartile of the values.
int count() const
Returns calculated count of values.
double range() const
Returns calculated range (difference between maximum and minimum values).
double max() const
Returns calculated maximum from values.
void finalize()
Must be called after adding all values with addValues() and before retrieving any calculated statisti...
int variety() const
Returns variety of values.
Calculator for summary statistics and aggregates for a list of strings.
QString max() const
Returns the maximum (non-null) string value.
QString min() const
Returns the minimum (non-null) string value.
int countMissing() const
Returns the number of missing (null) string values.
int count() const
Returns the calculated count of values.
int countDistinct() const
Returns the number of distinct string values.
void finalize()
Must be called after adding all strings with addString() and before retrieving any calculated string ...
void addValue(const QVariant &value)
Adds a single variant to the statistics calculation.
int minLength() const
Returns the minimum length of strings.
int maxLength() const
Returns the maximum length of strings.
QString majority() const
Returns the most common string.
QString minority() const
Returns the least common string.
double meanLength() const
Returns the mean length of strings.