QGIS API Documentation 3.99.0-Master (26c88405ac0)
Loading...
Searching...
No Matches
qgsfeaturerequest.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsfeaturerequest.cpp
3 ---------------------
4 begin : Mai 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#include "qgsfeaturerequest.h"
16
17#include <memory>
18
19#include "qgsfields.h"
20#include "qgsgeometry.h"
21#include "qgsgeometryengine.h"
22
23#include <QStringList>
24
25//constants
26const QString QgsFeatureRequest::ALL_ATTRIBUTES = QStringLiteral( "#!allattributes!#" );
27
31
33
35 : mFilter( Qgis::FeatureRequestFilterType::Fid )
36 , mFilterFid( fid )
37{
38}
39
41 : mFilter( Qgis::FeatureRequestFilterType::Fids )
42 , mFilterFids( fids )
43{
44
45}
46
48 : mSpatialFilter( !rect.isNull() ? Qgis::SpatialFilterType::BoundingBox : Qgis::SpatialFilterType::NoFilter )
49 , mFilterRect( rect )
50{
51}
52
54 : mFilter( Qgis::FeatureRequestFilterType::Expression )
55 , mFilterExpression( new QgsExpression( expr ) )
56 , mExpressionContext( context )
57{
58}
59
61//****** IMPORTANT! editing this? make sure you update the move constructor too! *****
62 : mFilter( rh.mFilter )
72 , mFlags( rh.mFlags )
73 , mAttrs( rh.mAttrs )
74 //****** IMPORTANT! editing this? make sure you update the move constructor too! *****
76 , mLimit( rh.mLimit )
77 , mOrderBy( rh.mOrderBy )
82 , mCrs( rh.mCrs )
84 , mTimeout( rh.mTimeout )
86 , mFeedback( rh.mFeedback )
87 //****** IMPORTANT! editing this? make sure you update the move constructor too! *****
88{
89
90}
91
93 : mFilter( rh.mFilter )
95 , mFilterRect( std::move( rh.mFilterRect ) )
96 , mReferenceGeometry( std::move( rh.mReferenceGeometry ) )
100 , mFilterFids( std::move( rh.mFilterFids ) )
101 , mFilterExpression( std::move( rh.mFilterExpression ) )
102 , mExpressionContext( std::move( rh.mExpressionContext ) )
103 , mFlags( rh.mFlags )
104 , mAttrs( std::move( rh.mAttrs ) )
105 , mSimplifyMethod( std::move( rh.mSimplifyMethod ) )
106 , mLimit( rh.mLimit )
107 , mOrderBy( std::move( rh.mOrderBy ) )
111 , mTransform( std::move( rh.mTransform ) )
112 , mCrs( std::move( rh.mCrs ) )
113 , mTransformContext( std::move( rh.mTransformContext ) )
114 , mTimeout( rh.mTimeout )
116 , mFeedback( rh.mFeedback )
117{
118
119}
120
122{
123 //****** IMPORTANT! editing this? make sure you update the move assignment operator too! *****
124 if ( &rh == this )
125 return *this;
126
127 mFlags = rh.mFlags;
128 mFilter = rh.mFilter;
136 if ( rh.mFilterExpression )
137 {
138 mFilterExpression = std::make_unique<QgsExpression>( *rh.mFilterExpression );
139 }
140 else
141 {
142 mFilterExpression.reset( nullptr );
143 }
144 //****** IMPORTANT! editing this? make sure you update the move assignment operator too! *****
148 mAttrs = rh.mAttrs;
150 mLimit = rh.mLimit;
151 mOrderBy = rh.mOrderBy;
153 mCrs = rh.mCrs;
156 mTimeout = rh.mTimeout;
158 mFeedback = rh.mFeedback;
159 return *this;
160 //****** IMPORTANT! editing this? make sure you update the move assignment operator too! *****
161}
162
163
165{
166 if ( &rh == this )
167 return *this;
168
169 mFlags = rh.mFlags;
170 mFilter = rh.mFilter;
171 mSpatialFilter = rh.mSpatialFilter;
172 mFilterRect = std::move( rh.mFilterRect );
173 mReferenceGeometry = std::move( rh.mReferenceGeometry );
174 mReferenceGeometryEngine = std::move( rh.mReferenceGeometryEngine );
175 mDistanceWithin = rh.mDistanceWithin;
176 mFilterFid = rh.mFilterFid;
177 mFilterFids = std::move( rh.mFilterFids );
178 mFilterExpression = std::move( rh.mFilterExpression );
179 mInvalidGeometryFilter = std::move( rh.mInvalidGeometryFilter );
180 mInvalidGeometryCallback = std::move( rh.mInvalidGeometryCallback );
181 mExpressionContext = std::move( rh.mExpressionContext );
182 mAttrs = std::move( rh.mAttrs );
183 mSimplifyMethod = std::move( rh.mSimplifyMethod );
184 mLimit = rh.mLimit;
185 mOrderBy = std::move( rh.mOrderBy );
186 mTransform = std::move( rh.mTransform );
187 mCrs = std::move( rh.mCrs );
188 mTransformContext = std::move( rh.mTransformContext );
189 mTransformErrorCallback = std::move( rh.mTransformErrorCallback );
190 mTimeout = rh.mTimeout;
191 mRequestMayBeNested = rh.mRequestMayBeNested;
192 mFeedback = rh.mFeedback;
193 return *this;
194}
195
196// Relaxed Equality operator
198{
199 if ( &rh == this )
200 return true;
201
202 return mFlags == rh.mFlags &&
203 mFilter == rh.mFilter &&
205 mFilterRect == rh.mFilterRect &&
206 ( ( mReferenceGeometry.isNull() && rh.mReferenceGeometry.isNull() ) || mReferenceGeometry.equals( rh.mReferenceGeometry ) ) &&
208 mFilterFid == rh.mFilterFid &&
209 mFilterFids == rh.mFilterFids &&
212 mAttrs == rh.mAttrs &&
214 mLimit == rh.mLimit &&
215 mOrderBy == rh.mOrderBy &&
216 mTransform == rh.mTransform &&
217 mCrs == rh.mCrs &&
219 mTimeout == rh.mTimeout &&
221}
222
223
225{
226 mFilterRect = rect;
228 mDistanceWithin = 0;
229 if ( mFilterRect.isNull() )
230 {
232 }
233 else
234 {
236 }
237 return *this;
238}
239
244
246{
247 mReferenceGeometry = geometry;
248 if ( !mReferenceGeometry.isEmpty() )
249 {
251 mReferenceGeometryEngine->prepareGeometry();
252 }
253 else
254 {
256 }
257 mDistanceWithin = distance;
259 mFilterRect = mReferenceGeometry.boundingBox().buffered( mDistanceWithin );
260
261 return *this;
262}
263
270
277
283
284QgsFeatureRequest &QgsFeatureRequest::setInvalidGeometryCallback( const std::function<void ( const QgsFeature & )> &callback )
285{
286 mInvalidGeometryCallback = callback;
287 return *this;
288}
289
291{
293 mFilterExpression = std::make_unique<QgsExpression>( expression );
294 return *this;
295}
296
298{
299 if ( mFilterExpression )
300 {
301 setFilterExpression( QStringLiteral( "(%1) AND (%2)" ).arg( mFilterExpression->expression(), expression ) );
302 }
303 else
304 {
305 setFilterExpression( expression );
306 }
307 return *this;
308}
309
311{
312 mExpressionContext = context;
313 return *this;
314}
315
316QgsFeatureRequest &QgsFeatureRequest::addOrderBy( const QString &expression, bool ascending )
317{
318 mOrderBy.append( OrderByClause( expression, ascending ) );
319 return *this;
320}
321
322QgsFeatureRequest &QgsFeatureRequest::addOrderBy( const QString &expression, bool ascending, bool nullsfirst )
323{
324 mOrderBy.append( OrderByClause( expression, ascending, nullsfirst ) );
325 return *this;
326}
327
332
338
340{
341 mLimit = limit;
342 return *this;
343}
344
350
357
362
363QgsFeatureRequest &QgsFeatureRequest::setSubsetOfAttributes( const QStringList &attrNames, const QgsFields &fields )
364{
365 if ( attrNames.contains( QgsFeatureRequest::ALL_ATTRIBUTES ) )
366 {
367 //attribute string list contains the all attributes flag, so we must fetch all attributes
368 return *this;
369 }
370
372 mAttrs.clear();
373
374 const auto constAttrNames = attrNames;
375 for ( const QString &attrName : constAttrNames )
376 {
377 const int attrNum = fields.lookupField( attrName );
378 if ( attrNum != -1 && !mAttrs.contains( attrNum ) )
379 mAttrs.append( attrNum );
380 }
381
382 return *this;
383}
384
385QgsFeatureRequest &QgsFeatureRequest::setSubsetOfAttributes( const QSet<QString> &attrNames, const QgsFields &fields )
386{
387 if ( attrNames.contains( QgsFeatureRequest::ALL_ATTRIBUTES ) )
388 {
389 //attribute string list contains the all attributes flag, so we must fetch all attributes
390 return *this;
391 }
392
394 mAttrs.clear();
395
396 const auto constAttrNames = attrNames;
397 for ( const QString &attrName : constAttrNames )
398 {
399 const int attrNum = fields.lookupField( attrName );
400 if ( attrNum != -1 && !mAttrs.contains( attrNum ) )
401 mAttrs.append( attrNum );
402 }
403
404 return *this;
405}
406
412
417
422
427
429{
430 if ( mTransform.isValid() )
431 {
432 return mTransform;
433 }
434 else if ( sourceCrs.isValid() && mCrs != sourceCrs )
435 {
436 return QgsCoordinateTransform( sourceCrs, mCrs, mTransformContext );
437 }
438 return QgsCoordinateTransform();
439}
440
442{
443 mTransform = transform;
444 return *this;
445}
446
448{
449 mCrs = crs;
450 mTransformContext = context;
451 return *this;
452}
453
454QgsFeatureRequest &QgsFeatureRequest::setTransformErrorCallback( const std::function<void ( const QgsFeature & )> &callback )
455{
456 mTransformErrorCallback = callback;
457 return *this;
458}
459
461{
462 // check the attribute/id filter first, it's more likely to be faster than
463 // the spatial filter
464 switch ( mFilter )
465 {
467 break;
468
470 if ( feature.id() != mFilterFid )
471 return false;
472 break;
473
475 mExpressionContext.setFeature( feature );
476 if ( !mFilterExpression->evaluate( &mExpressionContext ).toBool() )
477 return false;
478 break;
479
481 if ( !mFilterFids.contains( feature.id() ) )
482 return false;
483 break;
484 }
485
486 switch ( mSpatialFilter )
487 {
489 break;
490
492 if ( !feature.hasGeometry() ||
493 (
495 ||
497 )
498 )
499 return false;
500 break;
501
503 if ( !feature.hasGeometry()
506 || !mReferenceGeometryEngine->distanceWithin( feature.geometry().constGet(), mDistanceWithin )
507 )
508 return false;
509 break;
510 }
511
512 return true;
513}
514
516{
517 return mTimeout;
518}
519
525
527{
528 return mTimeout;
529}
530
532{
534 return *this;
535}
536
541
547
552
554{
555 return mFeedback;
556}
557
558
559#include "qgsfeatureiterator.h"
560#include "qgslogger.h"
561
563{
564 while ( !mActiveIterators.empty() )
565 {
567 QgsDebugMsgLevel( QStringLiteral( "closing active iterator" ), 2 );
568 it->close();
569 }
570}
571
576
581
582
583
585 : mExpression( expression )
586 , mAscending( ascending )
587{
588 // postgres behavior: default for ASC: NULLS LAST, default for DESC: NULLS FIRST
589 mNullsFirst = !ascending;
590}
591
593 : mExpression( expression )
594 , mAscending( ascending )
595 , mNullsFirst( nullsfirst )
596{
597}
598
600 : mExpression( expression )
601 , mAscending( ascending )
602{
603 // postgres behavior: default for ASC: NULLS LAST, default for DESC: NULLS FIRST
604 mNullsFirst = !ascending;
605}
606
608 : mExpression( expression )
609 , mAscending( ascending )
610 , mNullsFirst( nullsfirst )
611{
612
613}
614
616{
617 return mAscending;
618}
619
624
626{
627 return mNullsFirst;
628}
629
634
636{
637 return QStringLiteral( "%1 %2 %3" )
638 .arg( mExpression.expression(),
639 mAscending ? "ASC" : "DESC",
640 mNullsFirst ? "NULLS FIRST" : "NULLS LAST" );
641}
642
644{
645 return mExpression;
646}
647
649{
650 return mExpression.prepare( context );
651}
652
654
655QgsFeatureRequest::OrderBy::OrderBy( const QList<QgsFeatureRequest::OrderByClause> &other )
656{
657 const auto constOther = other;
658 for ( const QgsFeatureRequest::OrderByClause &clause : constOther )
659 {
660 append( clause );
661 }
662}
663
665{
666 if ( this == &other )
667 return true;
668 if ( size() != other.size() )
669 return false;
670 for ( int i = 0; i < size(); ++i )
671 {
672 if ( at( i ) != other.at( i ) )
673 return false;
674 }
675 return true;
676}
677
679{
680 return !operator==( other );
681}
682
683QList<QgsFeatureRequest::OrderByClause> QgsFeatureRequest::OrderBy::list() const
684{
685 return *this;
686}
687
688void QgsFeatureRequest::OrderBy::save( QDomElement &elem ) const
689{
690 QDomDocument doc = elem.ownerDocument();
691 QList<OrderByClause>::ConstIterator it;
692 for ( it = constBegin(); it != constEnd(); ++it )
693 {
694 const OrderByClause &clause = *it;
695 QDomElement clauseElem = doc.createElement( QStringLiteral( "orderByClause" ) );
696 clauseElem.setAttribute( QStringLiteral( "asc" ), clause.ascending() );
697 clauseElem.setAttribute( QStringLiteral( "nullsFirst" ), clause.nullsFirst() );
698 clauseElem.appendChild( doc.createTextNode( clause.expression().expression() ) );
699
700 elem.appendChild( clauseElem );
701 }
702}
703
704void QgsFeatureRequest::OrderBy::load( const QDomElement &elem )
705{
706 clear();
707
708 const QDomNodeList clauses = elem.childNodes();
709
710 for ( int i = 0; i < clauses.size(); ++i )
711 {
712 const QDomElement clauseElem = clauses.at( i ).toElement();
713 const QString expression = clauseElem.text();
714 const bool asc = clauseElem.attribute( QStringLiteral( "asc" ) ).toInt() != 0;
715 const bool nullsFirst = clauseElem.attribute( QStringLiteral( "nullsFirst" ) ).toInt() != 0;
716
717 append( OrderByClause( expression, asc, nullsFirst ) );
718 }
719}
720
722{
723 QSet<QString> usedAttributes;
724
725 QList<OrderByClause>::ConstIterator it;
726 for ( it = constBegin(); it != constEnd(); ++it )
727 {
728 const OrderByClause &clause = *it;
729
730 usedAttributes.unite( clause.expression().referencedColumns() );
731 }
732
733 return usedAttributes;
734}
735
737{
738 QSet<int> usedAttributeIdx;
739 for ( const OrderByClause &clause : *this )
740 {
741 const auto referencedColumns = clause.expression().referencedColumns();
742 for ( const QString &fieldName : referencedColumns )
743 {
744 const int idx = fields.lookupField( fieldName );
745 if ( idx >= 0 )
746 {
747 usedAttributeIdx.insert( idx );
748 }
749 }
750 }
751 return usedAttributeIdx;
752}
753
755{
756 QStringList results;
757
758 QList<OrderByClause>::ConstIterator it;
759 for ( it = constBegin(); it != constEnd(); ++it )
760 {
761 const OrderByClause &clause = *it;
762
763 results << clause.dump();
764 }
765
766 return results.join( QLatin1String( ", " ) );
767}
Provides global constants and enumerations for use throughout the application.
Definition qgis.h:56
@ Fid
Filter using feature ID.
Definition qgis.h:2224
@ Fids
Filter using feature IDs.
Definition qgis.h:2226
@ Expression
Filter using expression.
Definition qgis.h:2225
@ NoFilter
No filter is applied.
Definition qgis.h:2223
@ ExactIntersect
Use exact geometry intersection (slower) instead of bounding boxes.
Definition qgis.h:2198
@ SubsetOfAttributes
Fetch only a subset of attributes (setSubsetOfAttributes sets this flag).
Definition qgis.h:2197
@ DistanceWithin
Filter by distance to reference geometry.
Definition qgis.h:2254
@ BoundingBox
Filter using a bounding box.
Definition qgis.h:2253
@ NoFilter
No spatial filtering of features.
Definition qgis.h:2252
QFlags< FeatureRequestFlag > FeatureRequestFlags
Flags for controlling feature requests.
Definition qgis.h:2211
InvalidGeometryCheck
Methods for handling of features with invalid geometries.
Definition qgis.h:2238
Internal feature iterator to be implemented within data providers.
virtual bool close()=0
Call to end the iteration.
void iteratorOpened(QgsAbstractFeatureIterator *it)
void iteratorClosed(QgsAbstractFeatureIterator *it)
QSet< QgsAbstractFeatureIterator * > mActiveIterators
Represents a coordinate reference system (CRS).
bool isValid() const
Returns whether this CRS is correctly initialized and usable.
Contains information about the context in which a coordinate transform is executed.
Handles coordinate transforms between two coordinate systems.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
Handles parsing and evaluation of expressions (formerly called "search strings").
bool prepare(const QgsExpressionContext *context)
Gets the expression ready for evaluation - find out column indexes.
QString expression() const
Returns the original, unmodified expression string.
QSet< QString > referencedColumns() const
Gets list of columns referenced by the expression.
The OrderByClause class represents an order by clause for a QgsFeatureRequest.
OrderByClause(const QString &expression, bool ascending=true)
Creates a new OrderByClause for a QgsFeatureRequest.
QString dump() const
Dumps the content to an SQL equivalent.
QgsExpression expression() const
The expression.
bool ascending() const
Order ascending.
bool nullsFirst() const
Set if NULLS should be returned first.
void setAscending(bool ascending)
Set if ascending order is requested.
bool prepare(QgsExpressionContext *context)
Prepare the expression with the given context.
void setNullsFirst(bool nullsFirst)
Set if NULLS should be returned first.
Represents a list of OrderByClauses, with the most important first and the least important last.
QSet< int > CORE_EXPORT usedAttributeIndices(const QgsFields &fields) const
Returns a set of used, validated attribute indices.
CORE_EXPORT bool operator==(const OrderBy &v) const
Equality operator.
QSet< QString > CORE_EXPORT usedAttributes() const
Returns a set of used attributes.
void CORE_EXPORT load(const QDomElement &elem)
Deserialize from XML.
QList< QgsFeatureRequest::OrderByClause > CORE_EXPORT list() const
Gets a copy as a list of OrderByClauses.
QString CORE_EXPORT dump() const
Dumps the content to an SQL equivalent syntax.
CORE_EXPORT OrderBy()
Create a new empty order by.
CORE_EXPORT bool operator!=(const OrderBy &v) const
Inequality operator.
void CORE_EXPORT save(QDomElement &elem) const
Serialize to XML.
QgsFeatureRequest & setFlags(Qgis::FeatureRequestFlags flags)
Sets flags that affect how features will be fetched.
QgsFeatureRequest & setLimit(long long limit)
Set the maximum number of features to request.
std::unique_ptr< QgsExpression > mFilterExpression
QgsCoordinateReferenceSystem mCrs
QgsFeatureRequest & setCoordinateTransform(const QgsCoordinateTransform &transform)
Sets the coordinate transform which will be used to transform the feature's geometries.
Qgis::InvalidGeometryCheck mInvalidGeometryFilter
QgsFeatureRequest & setSimplifyMethod(const QgsSimplifyMethod &simplifyMethod)
Set a simplification method for geometries that will be fetched.
Qgis::FeatureRequestFlags mFlags
QgsRectangle filterRect() const
Returns the rectangle from which features will be taken.
QgsCoordinateTransformContext mTransformContext
Q_DECL_DEPRECATED QgsFeatureRequest & setConnectionTimeout(int connectionTimeout)
Sets the timeout (in milliseconds) for how long we should wait for a connection if none is available ...
QgsCoordinateTransform mTransform
QgsRectangle mFilterRect
Bounding box for spatial filtering.
Qgis::SpatialFilterType mSpatialFilter
Spatial filter type.
Qgis::FeatureRequestFilterType mFilter
Attribute/ID filter type.
QgsFeedback * feedback() const
Returns the feedback object that can be queried regularly by the iterator to check if it should be ca...
QgsFeatureRequest & setRequestMayBeNested(bool requestMayBeNested)
In case this request may be run nested within another already running iteration on the same connectio...
long long limit() const
Returns the maximum number of features to request, or -1 if no limit set.
QgsFeatureRequest & combineFilterExpression(const QString &expression)
Modifies the existing filter expression to add an additional expression filter.
QgsFeatureRequest & setFilterFids(const QgsFeatureIds &fids)
Sets the feature IDs that should be fetched.
OrderBy orderBy() const
Returns a list of order by clauses specified for this feature request.
QgsFeatureIds mFilterFids
QgsGeometry mReferenceGeometry
Reference geometry for Qgis::RequestSpatialFilter::DistanceWithin filtering.
QgsFeatureRequest & addOrderBy(const QString &expression, bool ascending=true)
Adds a new OrderByClause, appending it as the least important one.
QgsFeatureRequest & setTimeout(int timeout)
Sets the timeout (in milliseconds) for the maximum time we should wait during feature requests before...
static const QString ALL_ATTRIBUTES
A special attribute that if set matches all attributes.
QgsExpressionContext mExpressionContext
Qgis::FeatureRequestFlags flags() const
Returns the flags which affect how features are fetched.
QgsSimplifyMethod mSimplifyMethod
QgsFeatureRequest & setSubsetOfAttributes(const QgsAttributeList &attrs)
Set a subset of attributes that will be fetched.
int timeout() const
Returns the timeout (in milliseconds) for the maximum time we should wait during feature requests bef...
std::function< void(const QgsFeature &) > mTransformErrorCallback
QgsFeatureRequest & setDestinationCrs(const QgsCoordinateReferenceSystem &crs, const QgsCoordinateTransformContext &context)
Sets the destination crs for feature's geometries.
QgsFeatureRequest & setInvalidGeometryCheck(Qgis::InvalidGeometryCheck check)
Sets invalid geometry checking behavior.
QgsFeatureRequest & setFilterExpression(const QString &expression)
Set the filter expression.
void setFeedback(QgsFeedback *feedback)
Attach a feedback object that can be queried regularly by the iterator to check if it should be cance...
QgsCoordinateReferenceSystem destinationCrs() const
Returns the destination coordinate reference system for feature's geometries, or an invalid QgsCoordi...
QgsCoordinateTransform coordinateTransform() const
Returns the coordinate transform which will be used to transform the feature's geometries.
QgsAttributeList mAttrs
QgsFeatureRequest & setExpressionContext(const QgsExpressionContext &context)
Sets the expression context used to evaluate filter expressions.
bool acceptFeature(const QgsFeature &feature)
Check if a feature is accepted by this requests filter.
std::shared_ptr< QgsGeometryEngine > mReferenceGeometryEngine
Prepared geometry engine for mReferenceGeometry.
const QgsSimplifyMethod & simplifyMethod() const
Returns the simplification method for geometries that will be fetched.
std::function< void(const QgsFeature &) > mInvalidGeometryCallback
Q_DECL_DEPRECATED int connectionTimeout() const
Returns the timeout (in milliseconds) for how long we should wait for a connection if none is availab...
QgsCoordinateTransformContext transformContext() const
Returns the transform context, for use when a destinationCrs() has been set and reprojection is requi...
QgsCoordinateTransform calculateTransform(const QgsCoordinateReferenceSystem &sourceCrs) const
Calculates the coordinate transform to use to transform geometries when they are originally in source...
QgsFeatureRequest & setInvalidGeometryCallback(const std::function< void(const QgsFeature &)> &callback)
Sets a callback function to use when encountering an invalid geometry and invalidGeometryCheck() is s...
QgsFeatureRequest & setNoAttributes()
Set that no attributes will be fetched.
QgsFeatureRequest & operator=(const QgsFeatureRequest &rh)
QgsFeatureRequest & setOrderBy(const OrderBy &orderBy)
Set a list of order by clauses.
QgsFeatureRequest & setTransformErrorCallback(const std::function< void(const QgsFeature &)> &callback)
Sets a callback function to use when encountering a transform error when iterating features and a des...
double mDistanceWithin
Maximum distance from reference geometry.
bool requestMayBeNested() const
In case this request may be run nested within another already running iteration on the same connectio...
bool compare(const QgsFeatureRequest &other) const
Compare two requests for equality, ignoring Expression Context, Transform Error Callback,...
QgsFeatureRequest()
construct a default request: for all features get attributes and geometries
QgsFeatureRequest & setFilterFid(QgsFeatureId fid)
Sets the feature ID that should be fetched.
QgsFeatureRequest & setFilterRect(const QgsRectangle &rectangle)
Sets the rectangle from which features will be taken.
QgsFeatureRequest & setDistanceWithin(const QgsGeometry &geometry, double distance)
Sets a reference geometry and a maximum distance from this geometry to retrieve features within.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
Definition qgsfeature.h:58
QgsFeatureId id
Definition qgsfeature.h:66
QgsGeometry geometry
Definition qgsfeature.h:69
bool hasGeometry() const
Returns true if the feature has an associated geometry.
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
Q_INVOKABLE int lookupField(const QString &fieldName) const
Looks up field's index from the field name.
A geometry is the spatial representation of a feature.
bool boundingBoxIntersects(const QgsRectangle &rectangle) const
Returns true if the bounding box of this geometry intersects with a rectangle.
const QgsAbstractGeometry * constGet() const
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
static QgsGeometryEngine * createGeometryEngine(const QgsAbstractGeometry *geometry, double precision=0.0, Qgis::GeosCreationFlags flags=Qgis::GeosCreationFlag::SkipEmptyInteriorRings)
Creates and returns a new geometry engine representing the specified geometry using precision on a gr...
bool intersects(const QgsRectangle &rectangle) const
Returns true if this geometry exactly intersects with a rectangle.
A rectangle specified with double values.
Contains information about how to simplify geometries fetched from a QgsFeatureIterator.
QSet< QgsFeatureId > QgsFeatureIds
qint64 QgsFeatureId
64 bit feature ids negative numbers are used for uncommitted/newly added features
bool operator==(const QgsFeatureIterator &fi1, const QgsFeatureIterator &fi2)
QList< int > QgsAttributeList
Definition qgsfield.h:28
#define QgsDebugMsgLevel(str, level)
Definition qgslogger.h:61