QGIS API Documentation 3.99.0-Master (26c88405ac0)
Loading...
Searching...
No Matches
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 <memory>
19
20#include "qgis_core.h"
21#include "qgis_sip.h"
25#include "qgsfeatureiterator.h"
26#include "qgsfeaturesource.h"
27#include "qgsfields.h"
28
29#include <QPointer>
30#include <QSet>
31
32typedef QMap<QgsFeatureId, QgsFeature> QgsFeatureMap SIP_SKIP;
33
35class QgsVectorLayer;
40
42
43#ifdef SIP_RUN
44% ModuleHeaderCode
45#include "qgsfeatureiterator.h"
46% End
47#endif
48
54{
55 public:
56
61 explicit QgsVectorLayerFeatureSource( const QgsVectorLayer *layer );
62
65
67
69
71
77 QgsFields fields() const;
78
83
89 QString id() const;
90
91 protected:
92
93 std::unique_ptr< QgsAbstractFeatureSource > mProviderFeatureSource;
94
95 std::unique_ptr< QgsVectorLayerJoinBuffer > mJoinBuffer;
96
97#ifndef SIP_RUN
98
106 {
107
111 std::shared_ptr< QgsVectorLayerFeatureSource > joinSource;
112
117 };
118
120 QMap< QString, JoinLayerSource > mJoinSources;
121#endif
122
123 std::unique_ptr< QgsExpressionFieldBuffer > mExpressionFieldBuffer;
124
126
127 QString mId;
128
130
132
133 // A deep-copy is only performed, if the original maps change
134 // see here https://github.com/qgis/Quantum-GIS/pull/673
135 // for explanation
139 QList<QgsField> mAddedAttributes;
142
144
145 private:
146#ifdef SIP_RUN
148#endif
149};
150
155class CORE_EXPORT QgsVectorLayerFeatureIterator : public QgsAbstractFeatureIteratorFromSource<QgsVectorLayerFeatureSource>
156{
157 public:
158 QgsVectorLayerFeatureIterator( QgsVectorLayerFeatureSource *source, bool ownSource, const QgsFeatureRequest &request );
159
161
163 bool rewind() override;
164
166 bool close() override;
167
168 void setInterruptionChecker( QgsFeedback *interruptionChecker ) override SIP_SKIP;
169
174 struct CORE_EXPORT FetchJoinInfo
175 {
184
185#ifndef SIP_RUN
186
193 std::shared_ptr< QgsVectorLayerFeatureSource > joinSource;
194
202#endif
203
206
209
210 void addJoinedAttributesCached( QgsFeature &f, const QVariant &joinValue ) const;
211 void addJoinedAttributesDirect( QgsFeature &f, const QVariant &joinValue ) const;
212 };
213
214 bool isValid() const override;
215
216 protected:
218 bool fetchFeature( QgsFeature &feature ) override;
219
224 bool nextFeatureFilterExpression( QgsFeature &f ) override { return fetchFeature( f ); }
225
227 bool prepareSimplification( const QgsSimplifyMethod &simplifyMethod ) override;
228
230 void rewindEditBuffer() SIP_SKIP;
231
233 void prepareJoin( int fieldIdx ) SIP_SKIP;
234
236 void prepareExpression( int fieldIdx ) SIP_SKIP;
237
239 void prepareFields() SIP_SKIP;
240
242 void prepareField( int fieldIdx ) SIP_SKIP;
243
245 bool fetchNextAddedFeature( QgsFeature &f ) SIP_SKIP;
247 bool fetchNextChangedGeomFeature( QgsFeature &f ) SIP_SKIP;
249 bool fetchNextChangedAttributeFeature( QgsFeature &f ) SIP_SKIP;
251 void useAddedFeature( const QgsFeature &src, QgsFeature &f ) SIP_SKIP;
253 void useChangedAttributeFeature( QgsFeatureId fid, const QgsGeometry &geom, QgsFeature &f ) SIP_SKIP;
255 bool nextFeatureFid( QgsFeature &f ) SIP_SKIP;
257 void addJoinedAttributes( QgsFeature &f ) SIP_SKIP;
258
269 void addVirtualAttributes( QgsFeature &f ) SIP_SKIP;
270
277 void addExpressionAttribute( QgsFeature &f, int attrIndex ) SIP_SKIP;
278
283 void updateChangedAttributes( QgsFeature &f ) SIP_SKIP;
284
289 void updateFeatureGeometry( QgsFeature &f ) SIP_SKIP;
290
295
296 // filter bounding box constraint, in SOURCE CRS
298 bool mHasValidTransform = false;
300
301 // distance within constraint reference geometry and distance IN DESTINATION CRS
304 double mDistanceWithin = 0;
305
306 // only related to editing
310
311 bool mFetchedFid; // when iterating by FID: indicator whether it has been fetched yet or not
312
318
320
322
323 private:
324#ifdef SIP_RUN
326#endif
327
328 void createExpressionContext();
329 std::unique_ptr<QgsExpressionContext> mExpressionContext;
330
331 QgsFeedback *mInterruptionChecker = nullptr;
332
333 QList< int > mPreparedFields;
334 QList< int > mFieldsToPrepare;
335
337 QList< FetchJoinInfo > mOrderedJoinInfoList;
338
343 bool prepareOrderBy( const QList<QgsFeatureRequest::OrderByClause> &orderBys ) override;
344
346 bool providerCanSimplify( QgsSimplifyMethod::MethodType methodType ) const override;
347
348 void createOrderedJoinList();
349
353 bool postProcessFeature( QgsFeature &feature );
354
358 bool checkGeometryValidity( const QgsFeature &feature );
359
360 bool mDelegatedOrderByToProvider = false;
361};
362
363
364
371{
372 public:
373
380
383
384 QgsFeatureIterator getFeatures( const QgsFeatureRequest &request = QgsFeatureRequest() ) const override;
386 QgsFields fields() const override;
387 Qgis::WkbType wkbType() const override;
388 long long featureCount() const override;
389 QString sourceName() const override;
392
393 private:
394
395#ifdef SIP_RUN
397#endif
398
399 // ideally this wouldn't be mutable, but QgsVectorLayerFeatureSource has non-const getFeatures()
400 mutable QgsVectorLayerFeatureSource mSource;
401 QgsFeatureIds mSelectedFeatureIds;
403 QString mName;
404 QPointer< QgsVectorLayer > mLayer;
405
406};
407
409
410#ifndef SIP_RUN
411class QgsVectorLayerSelectedFeatureIterator : public QgsAbstractFeatureIterator
412{
413 public:
414
415 QgsVectorLayerSelectedFeatureIterator( const QgsFeatureIds &selectedFeatureIds,
416 const QgsFeatureRequest &request,
418
419 bool rewind() override;
420 bool close() override;
421
422 protected:
423 bool fetchFeature( QgsFeature &f ) override;
424
425 private:
426 QgsFeatureIds mSelectedFeatureIds;
427 QgsFeatureIterator mIterator;
428
429};
430
431#endif
432
434
435#endif // QGSVECTORLAYERFEATUREITERATOR_H
SpatialIndexPresence
Enumeration of spatial index presence states.
Definition qgis.h:558
WkbType
The WKB type describes the number of dimensions a geometry has.
Definition qgis.h:277
@ Unknown
Unknown.
Definition qgis.h:278
QgsAbstractFeatureIteratorFromSource(QgsVectorLayerFeatureSource *source, bool ownSource, const QgsFeatureRequest &request)
Internal feature iterator to be implemented within data providers.
virtual bool rewind()=0
Resets 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
Call to end the iteration.
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.
Represents a coordinate reference system (CRS).
Handles coordinate transforms between two 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.
Handles parsing and evaluation of expressions (formerly called "search strings").
Wrapper for iterator of features from vector data provider or vector layer.
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.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
Definition qgsfeature.h:58
Base class for feedback objects to be used for cancellation of something running in a worker thread.
Definition qgsfeedback.h:44
Container of fields for a vector layer.
Definition qgsfields.h:46
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.
A rectangle specified with double values.
Contains information about how to simplify geometries fetched from a QgsFeatureIterator.
Stores queued vector layer edit operations prior to committing changes to the layer's data provider.
A feature iterator which iterates over features from a QgsVectorLayer.
QMap< const QgsVectorLayerJoinInfo *, QgsVectorLayerFeatureIterator::FetchJoinInfo > mFetchJoinInfo
Information about joins used in the current select() statement.
QgsFeatureMap::ConstIterator mFetchAddedFeaturesIt
void setInterruptionChecker(QgsFeedback *interruptionChecker) override
Attach an object that can be queried regularly by the iterator to check if it must stopped.
bool close() override
end of iterating: free the resources / lock
bool nextFeatureFilterExpression(QgsFeature &f) override
Overrides default method as we only need to filter features in the edit buffer while for others filte...
QMap< int, QgsExpression * > mExpressionFieldInfo
QgsGeometryMap::ConstIterator mFetchChangedGeomIt
bool fetchFeature(QgsFeature &feature) override
fetch next feature, return true on success
std::shared_ptr< QgsGeometryEngine > mDistanceWithinEngine
bool isValid() const override
Returns if this iterator is valid.
bool rewind() override
reset the iterator to the starting position
QgsVectorLayerFeatureIterator(QgsVectorLayerFeatureSource *source, bool ownSource, const QgsFeatureRequest &request)
Partial snapshot of vector layer's state (only the members necessary for access to features).
QgsCoordinateReferenceSystem crs() const
Returns the coordinate reference system for features retrieved from this source.
QgsChangedAttributesMap mChangedAttributeValues
std::unique_ptr< QgsAbstractFeatureSource > mProviderFeatureSource
QgsVectorLayerFeatureSource(const QgsVectorLayer *layer)
Constructor for QgsVectorLayerFeatureSource.
~QgsVectorLayerFeatureSource() override
QString id() const
Returns the layer id of the source layer.
QgsFields fields() const
Returns the fields that will be available for features that are retrieved from this source.
QgsVectorLayerFeatureSource(const QgsVectorLayerFeatureSource &other)=delete
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
Manages joined fields for a vector layer.
Defines left outer join from our vector layer to some other vector layer.
QgsVectorLayerSelectedFeatureSource(const QgsVectorLayerSelectedFeatureSource &other)=delete
long long featureCount() const override
Returns the number of features contained in the source, or -1 if the feature count is unknown.
Qgis::WkbType wkbType() const override
Returns the geometry type for features returned by this source.
Qgis::SpatialIndexPresence hasSpatialIndex() const override
Returns an enum value representing the presence of a valid spatial index on the source,...
QgsFields fields() const override
Returns the fields associated with features in the source.
QgsCoordinateReferenceSystem sourceCrs() const override
Returns the coordinate reference system for features in the source.
QgsVectorLayerSelectedFeatureSource(QgsVectorLayer *layer)
Constructor for QgsVectorLayerSelectedFeatureSource, for selected features from the specified layer.
QgsVectorLayerSelectedFeatureSource & operator==(const QgsVectorLayerSelectedFeatureSource &other)=delete
QgsExpressionContextScope * createExpressionContextScope() const override
This method needs to be reimplemented in all classes which implement this interface and return an exp...
QString sourceName() const override
Returns a friendly display name for the source.
Represents a vector layer which manages a vector based dataset.
#define SIP_SKIP
Definition qgis_sip.h:134
QMap< QgsFeatureId, QgsGeometry > QgsGeometryMap
QMap< QgsFeatureId, QgsAttributeMap > QgsChangedAttributesMap
QSet< QgsFeatureId > QgsFeatureIds
qint64 QgsFeatureId
64 bit feature ids negative numbers are used for uncommitted/newly added features
QList< int > QgsAttributeList
Definition qgsfield.h:28
QMap< QgsFeatureId, QgsFeature > QgsFeatureMap
QMap< QgsFeatureId, QgsFeature > QgsFeatureMap
Join information prepared for fast attribute id mapping in QgsVectorLayerJoinBuffer::updateFeatureAtt...
QMap< int, int > attributesSourceToDestLayerMap
Mapping from original attribute index to the joined layer index.
void addJoinedAttributesDirect(QgsFeature &f, const QVariant &joinValue) const
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.
void addJoinedAttributesCached(QgsFeature &f, const QVariant &joinValue) const
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.