QGIS API Documentation  3.4.15-Madeira (e83d02e274)
qgsfeaturesource.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsfeaturesource.cpp
3  -------------------
4  begin : May 2017
5  copyright : (C) 2017 by Nyall Dawson
6  email : nyall dot dawson 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 
18 #include "qgsfeaturesource.h"
19 #include "qgsfeaturerequest.h"
20 #include "qgsfeatureiterator.h"
21 #include "qgsmemoryproviderutils.h"
22 #include "qgsfeedback.h"
23 #include "qgsvectorlayer.h"
24 #include "qgsvectordataprovider.h"
25 
27 {
29 }
30 
31 QSet<QVariant> QgsFeatureSource::uniqueValues( int fieldIndex, int limit ) const
32 {
33  if ( fieldIndex < 0 || fieldIndex >= fields().count() )
34  return QSet<QVariant>();
35 
38  req.setSubsetOfAttributes( QgsAttributeList() << fieldIndex );
39 
40  QSet<QVariant> values;
41  QgsFeatureIterator it = getFeatures( req );
42  QgsFeature f;
43  while ( it.nextFeature( f ) )
44  {
45  values.insert( f.attribute( fieldIndex ) );
46  if ( limit > 0 && values.size() >= limit )
47  return values;
48  }
49  return values;
50 }
51 
52 QVariant QgsFeatureSource::minimumValue( int fieldIndex ) const
53 {
54  if ( fieldIndex < 0 || fieldIndex >= fields().count() )
55  return QVariant();
56 
59  req.setSubsetOfAttributes( QgsAttributeList() << fieldIndex );
60 
61  QVariant min;
62  QgsFeatureIterator it = getFeatures( req );
63  QgsFeature f;
64  while ( it.nextFeature( f ) )
65  {
66  QVariant v = f.attribute( fieldIndex );
67  if ( !v.isNull() && ( qgsVariantLessThan( v, min ) || min.isNull() ) )
68  {
69  min = v;
70  }
71  }
72  return min;
73 }
74 
75 QVariant QgsFeatureSource::maximumValue( int fieldIndex ) const
76 {
77  if ( fieldIndex < 0 || fieldIndex >= fields().count() )
78  return QVariant();
79 
82  req.setSubsetOfAttributes( QgsAttributeList() << fieldIndex );
83 
84  QVariant max;
85  QgsFeatureIterator it = getFeatures( req );
86  QgsFeature f;
87  while ( it.nextFeature( f ) )
88  {
89  QVariant v = f.attribute( fieldIndex );
90  if ( !v.isNull() && ( qgsVariantGreaterThan( v, max ) || max.isNull() ) )
91  {
92  max = v;
93  }
94  }
95  return max;
96 }
97 
99 {
100  QgsRectangle r;
101 
102  QgsFeatureRequest req;
103  req.setNoAttributes();
104 
105  QgsFeatureIterator it = getFeatures( req );
106  QgsFeature f;
107  while ( it.nextFeature( f ) )
108  {
109  if ( f.hasGeometry() )
111  }
112  return r;
113 }
114 
116 {
118  .setFlags( QgsFeatureRequest::NoGeometry )
119  .setNoAttributes() );
120 
121  QgsFeatureIds ids;
122 
123  QgsFeature fet;
124  while ( fit.nextFeature( fet ) )
125  {
126  ids << fet.id();
127  }
128 
129  return ids;
130 }
131 
133 {
136 
137  QgsAttributeList requestedAttrs = request.subsetOfAttributes();
138 
139  QgsFields outFields;
141  {
142  int i = 0;
143  const QgsFields sourceFields = fields();
144  for ( const QgsField &field : sourceFields )
145  {
146  if ( requestedAttrs.contains( i ) )
147  outFields.append( field );
148  i++;
149  }
150  }
151  else
152  {
153  outFields = fields();
154  }
155 
156  std::unique_ptr< QgsVectorLayer > layer( QgsMemoryProviderUtils::createMemoryLayer(
157  sourceName(),
158  outFields,
159  outWkbType,
160  crs ) );
161  QgsFeature f;
162  QgsFeatureIterator it = getFeatures( request );
163  int fieldCount = fields().count();
164  while ( it.nextFeature( f ) )
165  {
166  if ( feedback && feedback->isCanceled() )
167  break;
168 
170  {
171  // remove unused attributes
172  QgsAttributes attrs;
173  for ( int i = 0; i < fieldCount; ++i )
174  {
175  if ( requestedAttrs.contains( i ) )
176  {
177  attrs.append( f.attributes().at( i ) );
178  }
179  }
180 
181  f.setAttributes( attrs );
182  }
183 
184  layer->dataProvider()->addFeature( f, QgsFeatureSink::FastInsert );
185  }
186 
187  return layer.release();
188 }
189 
QgsFeatureId id
Definition: qgsfeature.h:64
Wrapper for iterator of features from vector data provider or vector layer.
bool isCanceled() const
Tells whether the operation has been canceled already.
Definition: qgsfeedback.h:54
virtual QVariant maximumValue(int fieldIndex) const
Returns the maximum value for an attribute column or an invalid variant in case of error...
Use faster inserts, at the cost of updating the passed features to reflect changes made at the provid...
A rectangle specified with double values.
Definition: qgsrectangle.h:40
const Flags & flags() const
QSet< QgsFeatureId > QgsFeatureIds
Definition: qgsfeatureid.h:34
virtual QgsFields fields() const =0
Returns the fields associated with features in the source.
FeatureAvailability
Possible return value for hasFeatures() to determine if a source is empty.
virtual QgsWkbTypes::Type wkbType() const =0
Returns the geometry type for features returned by this source.
QgsAttributeList subsetOfAttributes() const
Returns the subset of attributes which at least need to be fetched.
QgsRectangle boundingBox() const
Returns the bounding box of the geometry.
QgsFeatureRequest & setSubsetOfAttributes(const QgsAttributeList &attrs)
Set a subset of attributes that will be fetched.
Container of fields for a vector layer.
Definition: qgsfields.h:42
void setAttributes(const QgsAttributes &attrs)
Sets the feature&#39;s attributes.
Definition: qgsfeature.cpp:127
virtual QgsFeatureIds allFeatureIds() const
Returns a list of all feature IDs for features present in the source.
The feature class encapsulates a single feature including its id, geometry and a list of field/values...
Definition: qgsfeature.h:55
const QgsCoordinateReferenceSystem & crs
QgsVectorLayer * materialize(const QgsFeatureRequest &request, QgsFeedback *feedback=nullptr)
Materializes a request (query) made against this feature source, by running it over the source and re...
bool qgsVariantGreaterThan(const QVariant &lhs, const QVariant &rhs)
Compares two QVariant values and returns whether the first is greater than the second.
Definition: qgis.cpp:221
bool qgsVariantLessThan(const QVariant &lhs, const QVariant &rhs)
Compares two QVariant values and returns whether the first is less than the second.
Definition: qgis.cpp:153
Base class for feedback objects to be used for cancellation of something running in a worker thread...
Definition: qgsfeedback.h:44
virtual QSet< QVariant > uniqueValues(int fieldIndex, int limit=-1) const
Returns the set of unique values contained within the specified fieldIndex from this source...
Type
The WKB type describes the number of dimensions a geometry has.
Definition: qgswkbtypes.h:68
QgsFeatureRequest & setNoAttributes()
Set that no attributes will be fetched.
virtual QgsRectangle sourceExtent() const
Returns the extent of all geometries from the source.
This class wraps a request for features to a vector layer (or directly its vector data provider)...
bool append(const QgsField &field, FieldOrigin origin=OriginProvider, int originIndex=-1)
Appends a field. The field must have unique name, otherwise it is rejected (returns false) ...
Definition: qgsfields.cpp:59
int count() const
Returns number of items.
Definition: qgsfields.cpp:133
Encapsulate a field in an attribute table or data source.
Definition: qgsfield.h:48
Fetch only a subset of attributes (setSubsetOfAttributes sets this flag)
virtual QgsCoordinateReferenceSystem sourceCrs() const =0
Returns the coordinate reference system for features in the source.
void combineExtentWith(const QgsRectangle &rect)
Expands the rectangle so that it covers both the original rectangle and the given rectangle...
Definition: qgsrectangle.h:358
bool isValid() const
Returns whether this CRS is correctly initialized and usable.
QVariant attribute(const QString &name) const
Lookup attribute value from attribute name.
Definition: qgsfeature.cpp:262
virtual QVariant minimumValue(int fieldIndex) const
Returns the minimum value for an attribute column or an invalid variant in case of error...
This class represents a coordinate reference system (CRS).
bool hasGeometry() const
Returns true if the feature has an associated geometry.
Definition: qgsfeature.cpp:197
QgsGeometry geometry
Definition: qgsfeature.h:67
static QgsVectorLayer * createMemoryLayer(const QString &name, const QgsFields &fields, QgsWkbTypes::Type geometryType=QgsWkbTypes::NoGeometry, const QgsCoordinateReferenceSystem &crs=QgsCoordinateReferenceSystem())
Creates a new memory layer using the specified parameters.
There may be features available in this source.
QList< int > QgsAttributeList
Definition: qgsfield.h:27
bool nextFeature(QgsFeature &f)
virtual QString sourceName() const =0
Returns a friendly display name for the source.
Geometry is not required. It may still be returned if e.g. required for a filter condition.
A vector of attributes.
Definition: qgsattributes.h:57
Represents a vector layer which manages a vector based data sets.
QgsCoordinateReferenceSystem destinationCrs() const
Returns the destination coordinate reference system for feature&#39;s geometries, or an invalid QgsCoordi...
virtual FeatureAvailability hasFeatures() const
Determines if there are any features available in the source.
QgsAttributes attributes
Definition: qgsfeature.h:65
virtual QgsFeatureIterator getFeatures(const QgsFeatureRequest &request=QgsFeatureRequest()) const =0
Returns an iterator for the features in the source.
QgsFeatureRequest & setFlags(QgsFeatureRequest::Flags flags)
Sets flags that affect how features will be fetched.