Branch data Line data Source code
1 : : /***************************************************************************
2 : : qgsalgorithmextractzmvalues.cpp
3 : : ---------------------------------
4 : : begin : January 2019
5 : : copyright : (C) 2019 by Nyall Dawson
6 : : email : nyall dot dawson at gmail dot com
7 : : ***************************************************************************/
8 : : /***************************************************************************
9 : : * *
10 : : * This program is free software; you can redistribute it and/or modify *
11 : : * it under the terms of the GNU General Public License as published by *
12 : : * the Free Software Foundation; either version 2 of the License, or *
13 : : * (at your option) any later version. *
14 : : * *
15 : : ***************************************************************************/
16 : :
17 : : #include "qgsalgorithmextractzmvalues.h"
18 : : #include "qgsfeaturerequest.h"
19 : : #include <vector>
20 : :
21 : : ///@cond PRIVATE
22 : :
23 : 2 : const std::vector< QgsStatisticalSummary::Statistic > STATS
24 : 2 : {
25 : : QgsStatisticalSummary::First,
26 : : QgsStatisticalSummary::Last,
27 : : QgsStatisticalSummary::Count,
28 : : QgsStatisticalSummary::Sum,
29 : : QgsStatisticalSummary::Mean,
30 : : QgsStatisticalSummary::Median,
31 : : QgsStatisticalSummary::StDev,
32 : : QgsStatisticalSummary::Min,
33 : : QgsStatisticalSummary::Max,
34 : : QgsStatisticalSummary::Range,
35 : : QgsStatisticalSummary::Minority,
36 : : QgsStatisticalSummary::Majority,
37 : : QgsStatisticalSummary::Variety,
38 : : QgsStatisticalSummary::FirstQuartile,
39 : : QgsStatisticalSummary::ThirdQuartile,
40 : : QgsStatisticalSummary::InterQuartileRange,
41 : : };
42 : :
43 : 0 : QString QgsExtractZMValuesAlgorithmBase::group() const
44 : : {
45 : 0 : return QObject::tr( "Vector geometry" );
46 : : }
47 : :
48 : 0 : QString QgsExtractZMValuesAlgorithmBase::groupId() const
49 : : {
50 : 0 : return QStringLiteral( "vectorgeometry" );
51 : : }
52 : :
53 : 0 : QString QgsExtractZMValuesAlgorithmBase::outputName() const
54 : : {
55 : 0 : return QObject::tr( "Extracted" );
56 : : }
57 : :
58 : 0 : QList<int> QgsExtractZMValuesAlgorithmBase::inputLayerTypes() const
59 : : {
60 : 0 : return QList<int>() << QgsProcessing::TypeVectorAnyGeometry;
61 : 0 : }
62 : :
63 : 0 : QgsProcessingFeatureSource::Flag QgsExtractZMValuesAlgorithmBase::sourceFlags() const
64 : : {
65 : 0 : return QgsProcessingFeatureSource::FlagSkipGeometryValidityChecks;
66 : : }
67 : :
68 : 0 : void QgsExtractZMValuesAlgorithmBase::initParameters( const QVariantMap & )
69 : : {
70 : 0 : QStringList statChoices;
71 : 0 : statChoices.reserve( STATS.size() );
72 : 0 : for ( QgsStatisticalSummary::Statistic stat : STATS )
73 : : {
74 : 0 : statChoices << QgsStatisticalSummary::displayName( stat );
75 : : }
76 : :
77 : 0 : addParameter( new QgsProcessingParameterEnum( QStringLiteral( "SUMMARIES" ),
78 : 0 : QObject::tr( "Summaries to calculate" ),
79 : 0 : statChoices, true, QVariantList() << 0 ) );
80 : :
81 : 0 : addParameter( new QgsProcessingParameterString( QStringLiteral( "COLUMN_PREFIX" ), QObject::tr( "Output column prefix" ), mDefaultFieldPrefix, false, true ) );
82 : 0 : }
83 : :
84 : 0 : QgsFields QgsExtractZMValuesAlgorithmBase::outputFields( const QgsFields &inputFields ) const
85 : : {
86 : 0 : return QgsProcessingUtils::combineFields( inputFields, mNewFields );
87 : 0 : }
88 : :
89 : 0 : bool QgsExtractZMValuesAlgorithmBase::prepareAlgorithm( const QVariantMap ¶meters, QgsProcessingContext &context, QgsProcessingFeedback * )
90 : : {
91 : 0 : mPrefix = parameterAsString( parameters, QStringLiteral( "COLUMN_PREFIX" ), context );
92 : :
93 : 0 : const QList< int > stats = parameterAsEnums( parameters, QStringLiteral( "SUMMARIES" ), context );
94 : 0 : mStats = QgsStatisticalSummary::Statistics();
95 : 0 : for ( int s : stats )
96 : : {
97 : 0 : mStats |= STATS.at( s );
98 : 0 : mSelectedStats << STATS.at( s );
99 : 0 : mNewFields.append( QgsField( mPrefix + QgsStatisticalSummary::shortName( STATS.at( s ) ), STATS.at( s ) == QgsStatisticalSummary::Count || STATS.at( s ) == QgsStatisticalSummary::Variety ? QVariant::Int : QVariant::Double ) );
100 : : }
101 : :
102 : : return true;
103 : 0 : }
104 : :
105 : 0 : QgsFeatureList QgsExtractZMValuesAlgorithmBase::processFeature( const QgsFeature &feature, QgsProcessingContext &, QgsProcessingFeedback * )
106 : : {
107 : 0 : QgsFeature f = feature;
108 : 0 : QgsAttributes attrs = f.attributes();
109 : 0 : attrs.reserve( attrs.count() + mSelectedStats.count() );
110 : 0 : if ( !f.hasGeometry() || f.geometry().isEmpty() || !mTestGeomFunc( f.geometry() ) )
111 : : {
112 : 0 : attrs.resize( attrs.count() + mNewFields.size() );
113 : 0 : }
114 : : else
115 : : {
116 : 0 : const QgsGeometry g = f.geometry();
117 : 0 : QgsStatisticalSummary stat( mStats );
118 : 0 : for ( auto it = g.vertices_begin(); it != g.vertices_end(); ++it )
119 : : {
120 : 0 : stat.addValue( mExtractValFunc( *it ) );
121 : 0 : if ( mStats == QgsStatisticalSummary::First )
122 : : {
123 : : // only retrieving first vertex info (default behavior), so short cut and
124 : : // don't iterate remaining vertices
125 : 0 : break;
126 : : }
127 : 0 : }
128 : 0 : stat.finalize();
129 : :
130 : 0 : for ( QgsStatisticalSummary::Statistic s : std::as_const( mSelectedStats ) )
131 : 0 : attrs.append( stat.statistic( s ) );
132 : 0 : }
133 : 0 : f.setAttributes( attrs );
134 : :
135 : 0 : return QgsFeatureList() << f;
136 : 0 : }
137 : :
138 : 0 : bool QgsExtractZMValuesAlgorithmBase::supportInPlaceEdit( const QgsMapLayer *layer ) const
139 : : {
140 : : Q_UNUSED( layer )
141 : 0 : return false;
142 : : }
143 : :
144 : : //
145 : : // QgsExtractZValuesAlgorithm
146 : : //
147 : :
148 : 0 : QgsExtractZValuesAlgorithm::QgsExtractZValuesAlgorithm()
149 : 0 : {
150 : 0 : mExtractValFunc = []( const QgsPoint & p ) -> double
151 : : {
152 : 0 : return p.z();
153 : : };
154 : 0 : mTestGeomFunc = []( const QgsGeometry & g ) -> bool
155 : : {
156 : 0 : return QgsWkbTypes::hasZ( g.wkbType() );
157 : : };
158 : 0 : mDefaultFieldPrefix = QStringLiteral( "z_" );
159 : 0 : }
160 : :
161 : 0 : QString QgsExtractZValuesAlgorithm::name() const
162 : : {
163 : 0 : return QStringLiteral( "extractzvalues" );
164 : : }
165 : :
166 : 0 : QString QgsExtractZValuesAlgorithm::displayName() const
167 : : {
168 : 0 : return QObject::tr( "Extract Z values" );
169 : : }
170 : :
171 : 0 : QgsProcessingAlgorithm *QgsExtractZValuesAlgorithm::createInstance() const
172 : : {
173 : 0 : return new QgsExtractZValuesAlgorithm();
174 : 0 : }
175 : :
176 : 0 : QStringList QgsExtractZValuesAlgorithm::tags() const
177 : : {
178 : 0 : return QObject::tr( "add,z,value,elevation,height,attribute,statistics,stats" ).split( ',' );
179 : 0 : }
180 : :
181 : 0 : QString QgsExtractZValuesAlgorithm::shortHelpString() const
182 : : {
183 : 0 : return QObject::tr( "Extracts z values from geometries into feature attributes.\n\n"
184 : : "By default only the z value from the first vertex of each feature is extracted, however the algorithm "
185 : : "can optionally calculate statistics on all of the geometry's z values, including sums, means, and minimums and maximums" );
186 : : }
187 : :
188 : 0 : QString QgsExtractZValuesAlgorithm::shortDescription() const
189 : : {
190 : 0 : return QObject::tr( "Extracts z values (or z value statistics) from geometries into feature attributes." );
191 : : }
192 : :
193 : :
194 : : //
195 : : // QgsExtractMValuesAlgorithm
196 : : //
197 : :
198 : 0 : QgsExtractMValuesAlgorithm::QgsExtractMValuesAlgorithm()
199 : 0 : {
200 : 0 : mExtractValFunc = []( const QgsPoint & p ) -> double
201 : : {
202 : 0 : return p.m();
203 : : };
204 : 0 : mTestGeomFunc = []( const QgsGeometry & g ) -> bool
205 : : {
206 : 0 : return QgsWkbTypes::hasM( g.wkbType() );
207 : : };
208 : 0 : mDefaultFieldPrefix = QStringLiteral( "m_" );
209 : 0 : }
210 : :
211 : 0 : QString QgsExtractMValuesAlgorithm::name() const
212 : : {
213 : 0 : return QStringLiteral( "extractmvalues" );
214 : : }
215 : :
216 : 0 : QString QgsExtractMValuesAlgorithm::displayName() const
217 : : {
218 : 0 : return QObject::tr( "Extract M values" );
219 : : }
220 : :
221 : 0 : QgsProcessingAlgorithm *QgsExtractMValuesAlgorithm::createInstance() const
222 : : {
223 : 0 : return new QgsExtractMValuesAlgorithm();
224 : 0 : }
225 : :
226 : 0 : QStringList QgsExtractMValuesAlgorithm::tags() const
227 : : {
228 : 0 : return QObject::tr( "add,m,value,measure,attribute,statistics,stats" ).split( ',' );
229 : 0 : }
230 : :
231 : 0 : QString QgsExtractMValuesAlgorithm::shortHelpString() const
232 : : {
233 : 0 : return QObject::tr( "Extracts m values from geometries into feature attributes.\n\n"
234 : : "By default only the m value from the first vertex of each feature is extracted, however the algorithm "
235 : : "can optionally calculate statistics on all of the geometry's m values, including sums, means, and minimums and maximums" );
236 : : }
237 : :
238 : 0 : QString QgsExtractMValuesAlgorithm::shortDescription() const
239 : : {
240 : 0 : return QObject::tr( "Extracts m values (or m value statistics) from geometries into feature attributes." );
241 : : }
242 : :
243 : :
244 : : ///@endcond
245 : :
|