Skip to content

Commit 7cb8ff7

Browse files
ahuarte47m-kuhn
authored andcommittedJan 15, 2014
#8275-R: simplification on a per-iterator basis
1 parent 61c8cad commit 7cb8ff7

9 files changed

+75
-45
lines changed
 

‎src/core/qgsfeatureiterator.cpp

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ QgsAbstractFeatureIterator::QgsAbstractFeatureIterator( const QgsFeatureRequest&
2323
, mClosed( false )
2424
, refs( 0 )
2525
, mGeometrySimplifier( NULL )
26+
, mLocalSimplification( false )
2627
{
2728
}
2829

@@ -52,7 +53,7 @@ bool QgsAbstractFeatureIterator::nextFeature( QgsFeature& f )
5253
}
5354

5455
// simplify the geometry using the simplifier configured
55-
if ( dataOk )
56+
if ( dataOk && mLocalSimplification )
5657
{
5758
QgsGeometry* geometry = f.geometry();
5859
if ( geometry ) simplify( f );
@@ -82,6 +83,11 @@ bool QgsAbstractFeatureIterator::nextFeatureFilterFids( QgsFeature& f )
8283

8384
void QgsAbstractFeatureIterator::ref()
8485
{
86+
// prepare if required the simplification of geometries to fetch
87+
if ( refs == 0 )
88+
{
89+
prepareSimplification( mRequest.simplifyMethod() );
90+
}
8591
refs++;
8692
}
8793

@@ -94,18 +100,26 @@ void QgsAbstractFeatureIterator::deref()
94100

95101
bool QgsAbstractFeatureIterator::prepareSimplification( const QgsSimplifyMethod& simplifyMethod )
96102
{
103+
mLocalSimplification = false;
104+
97105
delete mGeometrySimplifier;
98106
mGeometrySimplifier = NULL;
99107

100-
// setup the local simplification of geometries to fetch
101-
if ( simplifyMethod.methodType() != QgsSimplifyMethod::NoSimplification && simplifyMethod.forceLocalOptimization() && !( mRequest.flags() & QgsFeatureRequest::NoGeometry ) )
108+
// setup the simplification of geometries to fetch
109+
if ( !( mRequest.flags() & QgsFeatureRequest::NoGeometry ) && simplifyMethod.methodType() != QgsSimplifyMethod::NoSimplification && ( simplifyMethod.forceLocalOptimization() || !providerCanSimplify( simplifyMethod.methodType() ) ) )
102110
{
103111
mGeometrySimplifier = QgsSimplifyMethod::createGeometrySimplifier( simplifyMethod );
104-
return mGeometrySimplifier != NULL;
112+
mLocalSimplification = mGeometrySimplifier != NULL;
113+
return mLocalSimplification;
105114
}
106115
return false;
107116
}
108117

118+
bool QgsAbstractFeatureIterator::providerCanSimplify( QgsSimplifyMethod::MethodType methodType ) const
119+
{
120+
return false;
121+
}
122+
109123
bool QgsAbstractFeatureIterator::simplify( QgsFeature& feature )
110124
{
111125
// simplify locally the geometry using the configured simplifier

‎src/core/qgsfeatureiterator.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,11 @@ class CORE_EXPORT QgsAbstractFeatureIterator
9393
private:
9494
//! optional object to locally simplify geometries fetched by this feature iterator
9595
QgsAbstractGeometrySimplifier* mGeometrySimplifier;
96+
//! this iterator runs local simplification
97+
bool mLocalSimplification;
98+
99+
//! returns whether the iterator can simplify on provider side the geometries to fetch using the specified method type
100+
virtual bool providerCanSimplify( QgsSimplifyMethod::MethodType methodType ) const;
96101

97102
//! simplify the specified geometry if it was configured
98103
virtual bool simplify( QgsFeature& feature );

‎src/core/qgsvectorlayer.cpp

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -737,13 +737,6 @@ bool QgsVectorLayer::draw( QgsRenderContext& rendererContext )
737737
simplifyMethod.setTolerance( map2pixelTol );
738738
simplifyMethod.setForceLocalOptimization( mSimplifyMethod.forceLocalOptimization() );
739739

740-
// fix simplification non supported on server side
741-
if ( !simplifyMethod.forceLocalOptimization() && !( mDataProvider->capabilities() & QgsVectorDataProvider::SimplifyGeometries ) )
742-
{
743-
QgsDebugMsg( "Data provider does not support geometry simplification on provider side" );
744-
simplifyMethod.setForceLocalOptimization( true );
745-
}
746-
747740
featureRequest.setSimplifyMethod( simplifyMethod );
748741
}
749742

‎src/core/qgsvectorlayerfeatureiterator.cpp

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -70,15 +70,6 @@ QgsVectorLayerFeatureIterator::QgsVectorLayerFeatureIterator( QgsVectorLayer* la
7070
}
7171
else // no filter or filter by rect
7272
{
73-
QgsSimplifyMethod simplifyMethod = request.simplifyMethod();
74-
75-
// if required, local simplification will be configured for all providers, then avoid simplify twice (this iterator and provider iterator)
76-
if ( simplifyMethod.methodType() != QgsSimplifyMethod::NoSimplification && simplifyMethod.forceLocalOptimization() )
77-
{
78-
simplifyMethod.setMethodType( QgsSimplifyMethod::NoSimplification );
79-
if ( L->editBuffer() ) mChangedFeaturesRequest.setSimplifyMethod( simplifyMethod ); else mProviderRequest.setSimplifyMethod( simplifyMethod );
80-
}
81-
8273
if ( L->editBuffer() )
8374
{
8475
mChangedFeaturesIterator = L->dataProvider()->getFeatures( mChangedFeaturesRequest );
@@ -95,9 +86,6 @@ QgsVectorLayerFeatureIterator::QgsVectorLayerFeatureIterator( QgsVectorLayer* la
9586
{
9687
mRequest.filterExpression()->prepare( L->pendingFields() );
9788
}
98-
99-
// prepare if required the local simplification of geometries to fetch
100-
prepareSimplification( request.simplifyMethod() );
10189
}
10290

10391

@@ -466,13 +454,34 @@ bool QgsVectorLayerFeatureIterator::prepareSimplification( const QgsSimplifyMeth
466454
delete mEditGeometrySimplifier;
467455
mEditGeometrySimplifier = NULL;
468456

469-
// setup the simplification of edited geometries to fetch
470-
if ( simplifyMethod.methodType() != QgsSimplifyMethod::NoSimplification && !( mRequest.flags() & QgsFeatureRequest::NoGeometry ) )
457+
// setup simplification for edited geometries to fetch
458+
if ( !( mRequest.flags() & QgsFeatureRequest::NoGeometry ) && simplifyMethod.methodType() != QgsSimplifyMethod::NoSimplification )
471459
{
472460
mEditGeometrySimplifier = QgsSimplifyMethod::createGeometrySimplifier( simplifyMethod );
461+
return mEditGeometrySimplifier != NULL;
473462
}
463+
return false;
464+
}
465+
466+
bool QgsVectorLayerFeatureIterator::providerCanSimplify( QgsSimplifyMethod::MethodType methodType ) const
467+
{
468+
QgsVectorDataProvider* provider = L->dataProvider();
474469

475-
return QgsAbstractFeatureIterator::prepareSimplification( simplifyMethod );
470+
if ( provider && methodType != QgsSimplifyMethod::NoSimplification )
471+
{
472+
int capabilities = provider->capabilities();
473+
474+
if ( methodType == QgsSimplifyMethod::OptimizeForRendering )
475+
{
476+
return ( capabilities & QgsVectorDataProvider::SimplifyGeometries );
477+
}
478+
else
479+
if ( methodType == QgsSimplifyMethod::PreserveTopology )
480+
{
481+
return ( capabilities & QgsVectorDataProvider::SimplifyGeometriesWithTopologicalValidation );
482+
}
483+
}
484+
return false;
476485
}
477486

478487

‎src/core/qgsvectorlayerfeatureiterator.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,9 @@ class CORE_EXPORT QgsVectorLayerFeatureIterator : public QgsAbstractFeatureItera
121121
private:
122122
//! optional object to locally simplify edited (changed or added) geometries fetched by this feature iterator
123123
QgsAbstractGeometrySimplifier* mEditGeometrySimplifier;
124+
125+
//! returns whether the iterator can simplify on provider side the geometries to fetch using the specified method type
126+
virtual bool providerCanSimplify( QgsSimplifyMethod::MethodType methodType ) const;
124127
};
125128

126129
#endif // QGSVECTORLAYERFEATUREITERATOR_H

‎src/providers/ogr/qgsogrfeatureiterator.cpp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -80,9 +80,6 @@ QgsOgrFeatureIterator::QgsOgrFeatureIterator( QgsOgrProvider* p, const QgsFeatur
8080
OGR_L_SetSpatialFilter( ogrLayer, 0 );
8181
}
8282

83-
//setup if required the simplification of OGR-geometries fetched
84-
prepareSimplification( request.simplifyMethod() );
85-
8683
//start with first feature
8784
rewind();
8885
}
@@ -105,34 +102,37 @@ void QgsOgrFeatureIterator::ensureRelevantFields()
105102

106103
bool QgsOgrFeatureIterator::prepareSimplification( const QgsSimplifyMethod& simplifyMethod )
107104
{
108-
bool providerSimplification = false;
109-
110105
delete mGeometrySimplifier;
111106
mGeometrySimplifier = NULL;
112107

113-
// setup if required the simplification of OGR-geometries fetched
114-
if ( simplifyMethod.methodType() != QgsSimplifyMethod::NoSimplification && !simplifyMethod.forceLocalOptimization() && !( mRequest.flags() & QgsFeatureRequest::NoGeometry ) )
108+
// setup simplification of OGR-geometries fetched
109+
if ( !( mRequest.flags() & QgsFeatureRequest::NoGeometry ) && simplifyMethod.methodType() != QgsSimplifyMethod::NoSimplification && !simplifyMethod.forceLocalOptimization() )
115110
{
116111
QgsSimplifyMethod::MethodType methodType = simplifyMethod.methodType();
117112

118113
if ( methodType == QgsSimplifyMethod::OptimizeForRendering )
119114
{
120115
int simplifyFlags = QgsMapToPixelSimplifier::SimplifyGeometry | QgsMapToPixelSimplifier::SimplifyEnvelope;
121116
mGeometrySimplifier = new QgsOgrMapToPixelSimplifier( simplifyFlags, simplifyMethod.tolerance() );
122-
providerSimplification = true;
117+
return true;
123118
}
124119
else
125120
if ( methodType == QgsSimplifyMethod::PreserveTopology )
126121
{
127122
mGeometrySimplifier = new QgsOgrTopologyPreservingSimplifier( simplifyMethod.tolerance() );
128-
providerSimplification = true;
123+
return true;
129124
}
130125
else
131126
{
132127
QgsDebugMsg( QString( "Simplification method type (%1) is not recognised by OgrFeatureIterator class" ).arg( methodType ) );
133128
}
134129
}
135-
return QgsAbstractFeatureIterator::prepareSimplification( simplifyMethod ) || providerSimplification;
130+
return QgsAbstractFeatureIterator::prepareSimplification( simplifyMethod );
131+
}
132+
133+
bool QgsOgrFeatureIterator::providerCanSimplify( QgsSimplifyMethod::MethodType methodType ) const
134+
{
135+
return methodType == QgsSimplifyMethod::OptimizeForRendering || methodType == QgsSimplifyMethod::PreserveTopology;
136136
}
137137

138138
bool QgsOgrFeatureIterator::fetchFeature( QgsFeature& feature )

‎src/providers/ogr/qgsogrfeatureiterator.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,9 @@ class QgsOgrFeatureIterator : public QgsAbstractFeatureIterator
6464
private:
6565
//! optional object to simplify OGR-geometries fecthed by this feature iterator
6666
QgsOgrAbstractGeometrySimplifier* mGeometrySimplifier;
67+
68+
//! returns whether the iterator can simplify on provider side the geometries to fetch using the specified method type
69+
virtual bool providerCanSimplify( QgsSimplifyMethod::MethodType methodType ) const;
6770
};
6871

6972
#endif // QGSOGRFEATUREITERATOR_H

‎src/providers/postgres/qgspostgresfeatureiterator.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -80,9 +80,6 @@ QgsPostgresFeatureIterator::QgsPostgresFeatureIterator( QgsPostgresProvider* p,
8080
return;
8181
}
8282

83-
//setup if required the simplification of geometries to fetch
84-
prepareSimplification( request.simplifyMethod() );
85-
8683
mFetched = 0;
8784
}
8885

@@ -175,23 +172,26 @@ bool QgsPostgresFeatureIterator::fetchFeature( QgsFeature& feature )
175172

176173
bool QgsPostgresFeatureIterator::prepareSimplification( const QgsSimplifyMethod& simplifyMethod )
177174
{
178-
bool providerSimplification = false;
179-
180-
// validate settings of simplification of geometries to fetch
181-
if ( simplifyMethod.methodType() != QgsSimplifyMethod::NoSimplification && !simplifyMethod.forceLocalOptimization() && !( mRequest.flags() & QgsFeatureRequest::NoGeometry ) )
175+
// setup simplification of geometries to fetch
176+
if ( !( mRequest.flags() & QgsFeatureRequest::NoGeometry ) && simplifyMethod.methodType() != QgsSimplifyMethod::NoSimplification && !simplifyMethod.forceLocalOptimization() )
182177
{
183178
QgsSimplifyMethod::MethodType methodType = simplifyMethod.methodType();
184179

185180
if ( methodType == QgsSimplifyMethod::OptimizeForRendering || methodType == QgsSimplifyMethod::PreserveTopology )
186181
{
187-
providerSimplification = true;
182+
return true;
188183
}
189184
else
190185
{
191186
QgsDebugMsg( QString( "Simplification method type (%1) is not recognised by PostgresFeatureIterator" ).arg( methodType ) );
192187
}
193188
}
194-
return QgsAbstractFeatureIterator::prepareSimplification( simplifyMethod ) || providerSimplification;
189+
return QgsAbstractFeatureIterator::prepareSimplification( simplifyMethod );
190+
}
191+
192+
bool QgsPostgresFeatureIterator::providerCanSimplify( QgsSimplifyMethod::MethodType methodType ) const
193+
{
194+
return methodType == QgsSimplifyMethod::OptimizeForRendering || methodType == QgsSimplifyMethod::PreserveTopology;
195195
}
196196

197197
bool QgsPostgresFeatureIterator::rewind()

‎src/providers/postgres/qgspostgresfeatureiterator.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,9 @@ class QgsPostgresFeatureIterator : public QgsAbstractFeatureIterator
6969

7070
static const int sFeatureQueueSize;
7171

72+
private:
73+
//! returns whether the iterator can simplify on provider side the geometries to fetch using the specified method type
74+
virtual bool providerCanSimplify( QgsSimplifyMethod::MethodType methodType ) const;
7275
};
7376

7477
#endif // QGSPOSTGRESFEATUREITERATOR_H

0 commit comments

Comments
 (0)
Please sign in to comment.