QGIS API Documentation  2.8.2-Wien
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
qgsfeatureiterator.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsfeatureiterator.cpp
3  ---------------------
4  begin : Juli 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 "qgsfeatureiterator.h"
16 #include "qgslogger.h"
17 
18 #include "qgsgeometrysimplifier.h"
19 #include "qgssimplifymethod.h"
20 
22  : mRequest( request )
23  , mClosed( false )
24  , refs( 0 )
25  , mGeometrySimplifier( NULL )
26  , mLocalSimplification( false )
27 {
28 }
29 
31 {
32  delete mGeometrySimplifier;
33  mGeometrySimplifier = NULL;
34 }
35 
37 {
38  bool dataOk = false;
39 
40  switch ( mRequest.filterType() )
41  {
43  dataOk = nextFeatureFilterExpression( f );
44  break;
45 
47  dataOk = nextFeatureFilterFids( f );
48  break;
49 
50  default:
51  dataOk = fetchFeature( f );
52  break;
53  }
54 
55  // simplify the geometry using the simplifier configured
56  if ( dataOk && mLocalSimplification )
57  {
58  QgsGeometry* geometry = f.geometry();
59  if ( geometry )
60  simplify( f );
61  }
62  return dataOk;
63 }
64 
66 {
67  while ( fetchFeature( f ) )
68  {
69  if ( mRequest.filterExpression()->evaluate( f ).toBool() )
70  return true;
71  }
72  return false;
73 }
74 
76 {
77  while ( fetchFeature( f ) )
78  {
79  if ( mRequest.filterFids().contains( f.id() ) )
80  return true;
81  }
82  return false;
83 }
84 
86 {
87  // Prepare if required the simplification of geometries to fetch:
88  // This code runs here because of 'prepareSimplification()' is virtual and it can be overrided
89  // in inherited iterators who change the default behavior.
90  // It would be better to call this method in the constructor enabling virtual-calls as it is described by example at:
91  // http://www.parashift.com/c%2B%2B-faq-lite/calling-virtuals-from-ctor-idiom.html
92  if ( refs == 0 )
93  {
95  }
96  refs++;
97 }
98 
100 {
101  refs--;
102  if ( !refs )
103  delete this;
104 }
105 
107 {
108  mLocalSimplification = false;
109 
110  delete mGeometrySimplifier;
111  mGeometrySimplifier = NULL;
112 
113  // setup the simplification of geometries to fetch
114  if ( !( mRequest.flags() & QgsFeatureRequest::NoGeometry ) && simplifyMethod.methodType() != QgsSimplifyMethod::NoSimplification && ( simplifyMethod.forceLocalOptimization() || !providerCanSimplify( simplifyMethod.methodType() ) ) )
115  {
116  mGeometrySimplifier = QgsSimplifyMethod::createGeometrySimplifier( simplifyMethod );
117  mLocalSimplification = mGeometrySimplifier != NULL;
118  return mLocalSimplification;
119  }
120  return false;
121 }
122 
123 bool QgsAbstractFeatureIterator::providerCanSimplify( QgsSimplifyMethod::MethodType methodType ) const
124 {
125  Q_UNUSED( methodType )
126  return false;
127 }
128 
129 bool QgsAbstractFeatureIterator::simplify( QgsFeature& feature )
130 {
131  // simplify locally the geometry using the configured simplifier
132  if ( mGeometrySimplifier )
133  {
134  QgsGeometry* geometry = feature.geometry();
135 
136  QGis::GeometryType geometryType = geometry->type();
137  if ( geometryType == QGis::Line || geometryType == QGis::Polygon )
138  return mGeometrySimplifier->simplifyGeometry( geometry );
139  }
140  return false;
141 }
142 
144 
146 {
147  if ( this != &other )
148  {
149  if ( mIter )
150  mIter->deref();
151  mIter = other.mIter;
152  if ( mIter )
153  mIter->ref();
154  }
155  return *this;
156 }