QGIS API Documentation 3.32.0-Lima (311a8cb8a6)
qgsvectorlayerfeatureiterator.h
Go to the documentation of this file.
1/***************************************************************************
2 qgsvectorlayerfeatureiterator.h
3 ---------------------
4 begin : Dezember 2012
5 copyright : (C) 2012 by Martin Dobias
6 email : wonder dot sk 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#ifndef QGSVECTORLAYERFEATUREITERATOR_H
16#define QGSVECTORLAYERFEATUREITERATOR_H
17
18#include "qgis_core.h"
19#include "qgis_sip.h"
20#include "qgsfeatureiterator.h"
21#include "qgsfields.h"
23#include "qgsfeaturesource.h"
26
27#include <QPointer>
28#include <QSet>
29#include <memory>
30
31typedef QMap<QgsFeatureId, QgsFeature> QgsFeatureMap SIP_SKIP;
32
34class QgsVectorLayer;
39
41
42#ifdef SIP_RUN
43% ModuleHeaderCode
44#include "qgsfeatureiterator.h"
45% End
46#endif
47
53{
54 public:
55
60 explicit QgsVectorLayerFeatureSource( const QgsVectorLayer *layer );
61
66
68
70
72
79 QgsFields fields() const;
80
86
92 QString id() const;
93
94 protected:
95
96 std::unique_ptr< QgsAbstractFeatureSource > mProviderFeatureSource;
97
98 std::unique_ptr< QgsVectorLayerJoinBuffer > mJoinBuffer;
99
100#ifndef SIP_RUN
101
109 {
110
114 std::shared_ptr< QgsVectorLayerFeatureSource > joinSource;
115
120 };
121
123 QMap< QString, JoinLayerSource > mJoinSources;
124#endif
125
126 std::unique_ptr< QgsExpressionFieldBuffer > mExpressionFieldBuffer;
127
129
130 QString mId;
131
133
135
136 // A deep-copy is only performed, if the original maps change
137 // see here https://github.com/qgis/Quantum-GIS/pull/673
138 // for explanation
142 QList<QgsField> mAddedAttributes;
145
147
148 private:
149#ifdef SIP_RUN
151#endif
152};
153
157class CORE_EXPORT QgsVectorLayerFeatureIterator : public QgsAbstractFeatureIteratorFromSource<QgsVectorLayerFeatureSource>
158{
159 public:
160 QgsVectorLayerFeatureIterator( QgsVectorLayerFeatureSource *source, bool ownSource, const QgsFeatureRequest &request );
161
163
165 bool rewind() override;
166
168 bool close() override;
169
170 void setInterruptionChecker( QgsFeedback *interruptionChecker ) override SIP_SKIP;
171
176 struct CORE_EXPORT FetchJoinInfo
177 {
183 QMap<int, int> attributesSourceToDestLayerMap SIP_SKIP;
186
187#ifndef SIP_RUN
188
195 std::shared_ptr< QgsVectorLayerFeatureSource > joinSource;
196
204#endif
205
208
211
212 void addJoinedAttributesCached( QgsFeature &f, const QVariant &joinValue ) const;
213 void addJoinedAttributesDirect( QgsFeature &f, const QVariant &joinValue ) const;
214 };
215
216 bool isValid() const override;
217
218 protected:
220 bool fetchFeature( QgsFeature &feature ) override;
221
226 bool nextFeatureFilterExpression( QgsFeature &f ) override { return fetchFeature( f ); }
227
229 bool prepareSimplification( const QgsSimplifyMethod &simplifyMethod ) override;
230
232 void rewindEditBuffer() SIP_SKIP;
233
235 void prepareJoin( int fieldIdx ) SIP_SKIP;
236
238 void prepareExpression( int fieldIdx ) SIP_SKIP;
239
241 void prepareFields() SIP_SKIP;
242
244 void prepareField( int fieldIdx ) SIP_SKIP;
245
247 bool fetchNextAddedFeature( QgsFeature &f ) SIP_SKIP;
249 bool fetchNextChangedGeomFeature( QgsFeature &f ) SIP_SKIP;
251 bool fetchNextChangedAttributeFeature( QgsFeature &f ) SIP_SKIP;
253 void useAddedFeature( const QgsFeature &src, QgsFeature &f ) SIP_SKIP;
255 void useChangedAttributeFeature( QgsFeatureId fid, const QgsGeometry &geom, QgsFeature &f ) SIP_SKIP;
257 bool nextFeatureFid( QgsFeature &f ) SIP_SKIP;
259 void addJoinedAttributes( QgsFeature &f ) SIP_SKIP;
260
271 void addVirtualAttributes( QgsFeature &f ) SIP_SKIP;
272
280 void addExpressionAttribute( QgsFeature &f, int attrIndex ) SIP_SKIP;
281
286 void updateChangedAttributes( QgsFeature &f ) SIP_SKIP;
287
292 void updateFeatureGeometry( QgsFeature &f ) SIP_SKIP;
293
294 QgsFeatureRequest mProviderRequest;
295 QgsFeatureIterator mProviderIterator;
296 QgsFeatureRequest mChangedFeaturesRequest;
297 QgsFeatureIterator mChangedFeaturesIterator;
298
299 // filter bounding box constraint, in SOURCE CRS
300 QgsRectangle mFilterRect;
301 bool mHasValidTransform = false;
303
304 // distance within constraint reference geometry and distance IN DESTINATION CRS
305 QgsGeometry mDistanceWithinGeom;
306 std::shared_ptr< QgsGeometryEngine > mDistanceWithinEngine;
307 double mDistanceWithin = 0;
308
309 // only related to editing
310 QSet<QgsFeatureId> mFetchConsidered;
311 QgsGeometryMap::ConstIterator mFetchChangedGeomIt;
312 QgsFeatureMap::ConstIterator mFetchAddedFeaturesIt;
313
314 bool mFetchedFid; // when iterating by FID: indicator whether it has been fetched yet or not
315
321
322 QMap<int, QgsExpression *> mExpressionFieldInfo;
323
324 bool mHasVirtualAttributes;
325
326 private:
327#ifdef SIP_RUN
329#endif
330
331 void createExpressionContext();
332 std::unique_ptr<QgsExpressionContext> mExpressionContext;
333
334 QgsFeedback *mInterruptionChecker = nullptr;
335
336 QList< int > mPreparedFields;
337 QList< int > mFieldsToPrepare;
338
340 QList< FetchJoinInfo > mOrderedJoinInfoList;
341
346 bool prepareOrderBy( const QList<QgsFeatureRequest::OrderByClause> &orderBys ) override;
347
349 bool providerCanSimplify( QgsSimplifyMethod::MethodType methodType ) const override;
350
351 void createOrderedJoinList();
352
356 bool postProcessFeature( QgsFeature &feature );
357
361 bool checkGeometryValidity( const QgsFeature &feature );
362
363 bool mDelegatedOrderByToProvider = false;
364};
365
366
367
375{
376 public:
377
384
389
390 QgsFeatureIterator getFeatures( const QgsFeatureRequest &request = QgsFeatureRequest() ) const override;
391 QgsCoordinateReferenceSystem sourceCrs() const override;
392 QgsFields fields() const override;
393 Qgis::WkbType wkbType() const override;
394 long long featureCount() const override;
395 QString sourceName() const override;
396 QgsExpressionContextScope *createExpressionContextScope() const override;
397 SpatialIndexPresence hasSpatialIndex() const override;
398
399 private:
400
401#ifdef SIP_RUN
403#endif
404
405 // ideally this wouldn't be mutable, but QgsVectorLayerFeatureSource has non-const getFeatures()
406 mutable QgsVectorLayerFeatureSource mSource;
407 QgsFeatureIds mSelectedFeatureIds;
409 QString mName;
410 QPointer< QgsVectorLayer > mLayer;
411
412};
413
415
416#ifndef SIP_RUN
417class QgsVectorLayerSelectedFeatureIterator : public QgsAbstractFeatureIterator
418{
419 public:
420
421 QgsVectorLayerSelectedFeatureIterator( const QgsFeatureIds &selectedFeatureIds,
422 const QgsFeatureRequest &request,
424
425 bool rewind() override;
426 bool close() override;
427
428 protected:
429 bool fetchFeature( QgsFeature &f ) override;
430
431 private:
432 QgsFeatureIds mSelectedFeatureIds;
433 QgsFeatureIterator mIterator;
434
435};
436
437#endif
438
440
441#endif // QGSVECTORLAYERFEATUREITERATOR_H
WkbType
The WKB type describes the number of dimensions a geometry has.
Definition: qgis.h:154
@ Unknown
Unknown.
Helper template that cares of two things: 1.
Internal feature iterator to be implemented within data providers.
virtual bool rewind()=0
reset the iterator to the starting position
virtual bool fetchFeature(QgsFeature &f)=0
If you write a feature iterator for your provider, this is the method you need to implement!...
virtual bool close()=0
end of iterating: free the resources / lock
Base class that can be used for any class that is capable of returning features.
virtual QgsFeatureIterator getFeatures(const QgsFeatureRequest &request=QgsFeatureRequest())=0
Gets an iterator for features matching the specified request.
This class represents a coordinate reference system (CRS).
Class for doing transforms between two map coordinate systems.
Abstract interface for generating an expression context scope.
Single scope for storing variables and functions for use within a QgsExpressionContext.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
Buffers information about expression fields for a vector layer.
Class for parsing and evaluation of expressions (formerly called "search strings").
Wrapper for iterator of features from vector data provider or vector layer.
This class wraps a request for features to a vector layer (or directly its vector data provider).
An interface for objects which provide features via a getFeatures method.
SpatialIndexPresence
Enumeration of spatial index presence states.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
Definition: qgsfeature.h:56
Base class for feedback objects to be used for cancellation of something running in a worker thread.
Definition: qgsfeedback.h:45
Container of fields for a vector layer.
Definition: qgsfields.h:45
A geometry engine is a low-level representation of a QgsAbstractGeometry object, optimised for use wi...
A geometry is the spatial representation of a feature.
Definition: qgsgeometry.h:164
A rectangle specified with double values.
Definition: qgsrectangle.h:42
This class contains information about how to simplify geometries fetched from a QgsFeatureIterator.
bool nextFeatureFilterExpression(QgsFeature &f) override
Overrides default method as we only need to filter features in the edit buffer while for others filte...
Partial snapshot of vector layer's state (only the members necessary for access to features)
QgsChangedAttributesMap mChangedAttributeValues
std::unique_ptr< QgsAbstractFeatureSource > mProviderFeatureSource
~QgsVectorLayerFeatureSource() override
QgsVectorLayerFeatureSource(const QgsVectorLayerFeatureSource &other)=delete
QgsVectorLayerFeatureSource cannot be copied.
std::unique_ptr< QgsVectorLayerJoinBuffer > mJoinBuffer
std::unique_ptr< QgsExpressionFieldBuffer > mExpressionFieldBuffer
QMap< QString, JoinLayerSource > mJoinSources
Contains prepared join sources by layer ID.
QgsVectorLayerFeatureSource & operator==(const QgsVectorLayerFeatureSource &other)=delete
QgsVectorLayerFeatureSource cannot be copied.
Manages joined fields for a vector layer.
Defines left outer join from our vector layer to some other vector layer.
QgsFeatureSource subclass for the selected features from a QgsVectorLayer.
QgsVectorLayerSelectedFeatureSource(const QgsVectorLayerSelectedFeatureSource &other)=delete
QgsVectorLayerSelectedFeatureSource cannot be copied.
QgsVectorLayerSelectedFeatureSource & operator==(const QgsVectorLayerSelectedFeatureSource &other)=delete
QgsVectorLayerSelectedFeatureSource cannot be copied.
Represents a vector layer which manages a vector based data sets.
#define SIP_SKIP
Definition: qgis_sip.h:126
QMap< QgsFeatureId, QgsGeometry > QgsGeometryMap
Definition: qgsfeature.h:915
QMap< QgsFeatureId, QgsAttributeMap > QgsChangedAttributesMap
Definition: qgsfeature.h:906
QSet< QgsFeatureId > QgsFeatureIds
Definition: qgsfeatureid.h:37
qint64 QgsFeatureId
64 bit feature ids negative numbers are used for uncommitted/newly added features
Definition: qgsfeatureid.h:28
QList< int > QgsAttributeList
Definition: qgsfield.h:27
QMap< QgsFeatureId, QgsFeature > QgsFeatureMap
const QgsCoordinateReferenceSystem & crs
Join information prepared for fast attribute id mapping in QgsVectorLayerJoinBuffer::updateFeatureAtt...
std::shared_ptr< QgsVectorLayerFeatureSource > joinSource
Feature source for join.
int targetField
Index of field (of this layer) that drives the join.
const QgsVectorLayerJoinInfo * joinInfo
Canonical source of information about the join.
int indexOffset
At what position the joined fields start.
Contains join layer source information prepared in a thread-safe way, ready for vector layer feature ...
std::shared_ptr< QgsVectorLayerFeatureSource > joinSource
Feature source for join.