@@ -80,6 +80,9 @@ QgsPostgresFeatureIterator::QgsPostgresFeatureIterator( QgsPostgresProvider* p,
80
80
return ;
81
81
}
82
82
83
+ // setup if required the simplification of geometries to fetch
84
+ prepareProviderSimplification ();
85
+
83
86
mFetched = 0 ;
84
87
}
85
88
@@ -170,6 +173,26 @@ bool QgsPostgresFeatureIterator::fetchFeature( QgsFeature& feature )
170
173
return true ;
171
174
}
172
175
176
+ bool QgsPostgresFeatureIterator::prepareProviderSimplification ()
177
+ {
178
+ const QgsSimplifyMethod& simplifyMethod = mRequest .simplifyMethod ();
179
+
180
+ // validate settings of simplification of geometries to fetch
181
+ if ( simplifyMethod.methodType () != QgsSimplifyMethod::NoSimplification && !simplifyMethod.forceLocalOptimization () && !( mRequest .flags () & QgsFeatureRequest::NoGeometry ) )
182
+ {
183
+ QgsSimplifyMethod::MethodType methodType = simplifyMethod.methodType ();
184
+
185
+ if ( methodType == QgsSimplifyMethod::OptimizeForRendering || methodType == QgsSimplifyMethod::PreserveTopology )
186
+ {
187
+ return true ;
188
+ }
189
+ else
190
+ {
191
+ QgsDebugMsg ( QString ( " Simplification method type (%1) is not recognised by PostgresFeatureIterator" ).arg ( methodType ) );
192
+ }
193
+ }
194
+ return false ;
195
+ }
173
196
174
197
bool QgsPostgresFeatureIterator::rewind ()
175
198
{
@@ -272,8 +295,34 @@ bool QgsPostgresFeatureIterator::declareCursor( const QString& whereClause )
272
295
273
296
try
274
297
{
298
+ const QgsSimplifyMethod& simplifyMethod = mRequest .simplifyMethod ();
299
+
275
300
QString query = " SELECT " , delim = " " ;
276
301
302
+ if ( mFetchGeometry && !simplifyMethod.forceLocalOptimization () && simplifyMethod.methodType () != QgsSimplifyMethod::NoSimplification )
303
+ {
304
+ QString simplifyFunctionName = simplifyMethod.methodType () == QgsSimplifyMethod::OptimizeForRendering
305
+ ?
306
+ ( P->mConnectionRO ->majorVersion () < 2 ? " simplify" : " st_simplify" )
307
+ :
308
+ ( P->mConnectionRO ->majorVersion () < 2 ? " simplifypreservetopology" : " st_simplifypreservetopology" );
309
+
310
+ double tolerance = simplifyMethod.methodType () == QgsSimplifyMethod::OptimizeForRendering
311
+ ?
312
+ simplifyMethod.tolerance () / 5 .0f /* experimental */
313
+ :
314
+ simplifyMethod.tolerance ();
315
+
316
+ query += QString ( " %1(%5(%2%3,%6),'%4')" )
317
+ .arg ( P->mConnectionRO ->majorVersion () < 2 ? " asbinary" : " st_asbinary" )
318
+ .arg ( P->quotedIdentifier ( P->mGeometryColumn ) )
319
+ .arg ( P->mSpatialColType == sctGeography ? " ::geometry" : " " )
320
+ .arg ( P->endianString () )
321
+ .arg ( simplifyFunctionName )
322
+ .arg ( tolerance );
323
+ delim = " ," ;
324
+ }
325
+ else
277
326
if ( mFetchGeometry )
278
327
{
279
328
query += QString ( " %1(%2%3,'%4')" )
0 commit comments