Skip to content

Commit e437812

Browse files
committed
Return an invalid iterator if a transform exception occurs
when projecting filter rects from destination crs
1 parent 7d847bf commit e437812

18 files changed

+170
-25
lines changed

python/core/qgsfeatureiterator.sip

+1
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ end of iterating: free the resources / lock
120120
the requested filterRect() transformed to the source's coordinate reference system.
121121
Iterators should call this method and use the returned rectangle for filtering
122122
features to ensure that any QgsFeatureRequest.destinationCrs() set on the request is respected.
123+
Will throw a QgsCsException if the rect cannot be transformed from the destination CRS.
123124
.. versionadded:: 3.0
124125
:rtype: QgsRectangle
125126
%End

src/core/providers/memory/qgsmemoryfeatureiterator.cpp

+11-1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include "qgsspatialindex.h"
2222
#include "qgsmessagelog.h"
2323
#include "qgsproject.h"
24+
#include "qgscsexception.h"
2425

2526
///@cond PRIVATE
2627

@@ -31,7 +32,16 @@ QgsMemoryFeatureIterator::QgsMemoryFeatureIterator( QgsMemoryFeatureSource *sour
3132
{
3233
mTransform = QgsCoordinateTransform( mSource->mCrs, mRequest.destinationCrs() );
3334
}
34-
mFilterRect = filterRectToSourceCrs( mTransform );
35+
try
36+
{
37+
mFilterRect = filterRectToSourceCrs( mTransform );
38+
}
39+
catch ( QgsCsException & )
40+
{
41+
// can't reproject mFilterRect
42+
mClosed = true;
43+
return;
44+
}
3545

3646
if ( !mSource->mSubsetString.isEmpty() )
3747
{

src/core/qgscachedfeatureiterator.cpp

+21-2
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
#include "qgscachedfeatureiterator.h"
1717
#include "qgsvectorlayercache.h"
18+
#include "qgscsexception.h"
1819

1920
QgsCachedFeatureIterator::QgsCachedFeatureIterator( QgsVectorLayerCache *vlCache, const QgsFeatureRequest &featureRequest )
2021
: QgsAbstractFeatureIterator( featureRequest )
@@ -24,7 +25,16 @@ QgsCachedFeatureIterator::QgsCachedFeatureIterator( QgsVectorLayerCache *vlCache
2425
{
2526
mTransform = QgsCoordinateTransform( mVectorLayerCache->sourceCrs(), mRequest.destinationCrs() );
2627
}
27-
mFilterRect = filterRectToSourceCrs( mTransform );
28+
try
29+
{
30+
mFilterRect = filterRectToSourceCrs( mTransform );
31+
}
32+
catch ( QgsCsException & )
33+
{
34+
// can't reproject mFilterRect
35+
mClosed = true;
36+
return;
37+
}
2838
if ( !mFilterRect.isNull() )
2939
{
3040
// update request to be the unprojected filter rect
@@ -101,7 +111,16 @@ QgsCachedFeatureWriterIterator::QgsCachedFeatureWriterIterator( QgsVectorLayerCa
101111
{
102112
mTransform = QgsCoordinateTransform( mVectorLayerCache->sourceCrs(), mRequest.destinationCrs() );
103113
}
104-
mFilterRect = filterRectToSourceCrs( mTransform );
114+
try
115+
{
116+
mFilterRect = filterRectToSourceCrs( mTransform );
117+
}
118+
catch ( QgsCsException & )
119+
{
120+
// can't reproject mFilterRect
121+
mClosed = true;
122+
return;
123+
}
105124
if ( !mFilterRect.isNull() )
106125
{
107126
// update request to be the unprojected filter rect

src/core/qgsfeatureiterator.cpp

+1-9
Original file line numberDiff line numberDiff line change
@@ -124,15 +124,7 @@ QgsRectangle QgsAbstractFeatureIterator::filterRectToSourceCrs( const QgsCoordin
124124
if ( mRequest.filterRect().isNull() )
125125
return QgsRectangle();
126126

127-
try
128-
{
129-
return transform.transformBoundingBox( mRequest.filterRect(), QgsCoordinateTransform::ReverseTransform );
130-
}
131-
catch ( QgsCsException & )
132-
{
133-
// can't reproject mFilterRect
134-
return mRequest.filterRect();
135-
}
127+
return transform.transformBoundingBox( mRequest.filterRect(), QgsCoordinateTransform::ReverseTransform );
136128
}
137129

138130
void QgsAbstractFeatureIterator::ref()

src/core/qgsfeatureiterator.h

+1
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ class CORE_EXPORT QgsAbstractFeatureIterator
131131
* the requested filterRect() transformed to the source's coordinate reference system.
132132
* Iterators should call this method and use the returned rectangle for filtering
133133
* features to ensure that any QgsFeatureRequest::destinationCrs() set on the request is respected.
134+
* Will throw a QgsCsException if the rect cannot be transformed from the destination CRS.
134135
* \since QGIS 3.0
135136
*/
136137
QgsRectangle filterRectToSourceCrs( const QgsCoordinateTransform &transform ) const;

src/core/qgsvectorlayerfeatureiterator.cpp

+11-1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include "qgsdistancearea.h"
2626
#include "qgsproject.h"
2727
#include "qgsmessagelog.h"
28+
#include "qgscsexception.h"
2829

2930
QgsVectorLayerFeatureSource::QgsVectorLayerFeatureSource( const QgsVectorLayer *layer )
3031
{
@@ -113,7 +114,16 @@ QgsVectorLayerFeatureIterator::QgsVectorLayerFeatureIterator( QgsVectorLayerFeat
113114
{
114115
mTransform = QgsCoordinateTransform( mSource->mCrs, mRequest.destinationCrs() );
115116
}
116-
mFilterRect = filterRectToSourceCrs( mTransform );
117+
try
118+
{
119+
mFilterRect = filterRectToSourceCrs( mTransform );
120+
}
121+
catch ( QgsCsException & )
122+
{
123+
// can't reproject mFilterRect
124+
mClosed = true;
125+
return;
126+
}
117127
if ( !mFilterRect.isNull() )
118128
{
119129
// update request to be the unprojected filter rect

src/providers/arcgisrest/qgsafsfeatureiterator.cpp

+11-2
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
#include "qgsafsprovider.h"
1818
#include "qgsmessagelog.h"
1919
#include "geometry/qgsgeometry.h"
20-
20+
#include "qgscsexception.h"
2121

2222
QgsAfsFeatureSource::QgsAfsFeatureSource( const QgsAfsProvider *provider )
2323
// FIXME: ugly const_cast...
@@ -45,7 +45,16 @@ QgsAfsFeatureIterator::QgsAfsFeatureIterator( QgsAfsFeatureSource *source, bool
4545
{
4646
mTransform = QgsCoordinateTransform( mSource->mCrs, mRequest.destinationCrs() );
4747
}
48-
mFilterRect = filterRectToSourceCrs( mTransform );
48+
try
49+
{
50+
mFilterRect = filterRectToSourceCrs( mTransform );
51+
}
52+
catch ( QgsCsException & )
53+
{
54+
// can't reproject mFilterRect
55+
mClosed = true;
56+
return;
57+
}
4958
}
5059

5160
QgsAfsFeatureIterator::~QgsAfsFeatureIterator()

src/providers/db2/qgsdb2featureiterator.cpp

+11-1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "qgssettings.h"
2323
#include "qgslogger.h"
2424
#include "qgsgeometry.h"
25+
#include "qgscsexception.h"
2526

2627
#include <QObject>
2728
#include <QTextStream>
@@ -37,7 +38,16 @@ QgsDb2FeatureIterator::QgsDb2FeatureIterator( QgsDb2FeatureSource *source, bool
3738
{
3839
mTransform = QgsCoordinateTransform( mSource->mCrs, mRequest.destinationCrs() );
3940
}
40-
mFilterRect = filterRectToSourceCrs( mTransform );
41+
try
42+
{
43+
mFilterRect = filterRectToSourceCrs( mTransform );
44+
}
45+
catch ( QgsCsException & )
46+
{
47+
// can't reproject mFilterRect
48+
mClosed = true;
49+
return;
50+
}
4151

4252
BuildStatement( request );
4353

src/providers/delimitedtext/qgsdelimitedtextfeatureiterator.cpp

+10-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,16 @@ QgsDelimitedTextFeatureIterator::QgsDelimitedTextFeatureIterator( QgsDelimitedTe
4343
{
4444
mTransform = QgsCoordinateTransform( mSource->mCrs, mRequest.destinationCrs() );
4545
}
46-
mFilterRect = filterRectToSourceCrs( mTransform );
46+
try
47+
{
48+
mFilterRect = filterRectToSourceCrs( mTransform );
49+
}
50+
catch ( QgsCsException & )
51+
{
52+
// can't reproject mFilterRect
53+
mClosed = true;
54+
return;
55+
}
4756

4857
if ( !mFilterRect.isNull() && hasGeometry )
4958
{

src/providers/gpx/qgsgpxfeatureiterator.cpp

+11-1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include "qgsgeometry.h"
2121
#include "qgslogger.h"
2222
#include "qgsmessagelog.h"
23+
#include "qgscsexception.h"
2324

2425
#include <limits>
2526
#include <cstring>
@@ -32,7 +33,16 @@ QgsGPXFeatureIterator::QgsGPXFeatureIterator( QgsGPXFeatureSource *source, bool
3233
{
3334
mTransform = QgsCoordinateTransform( mSource->mCrs, mRequest.destinationCrs() );
3435
}
35-
mFilterRect = filterRectToSourceCrs( mTransform );
36+
try
37+
{
38+
mFilterRect = filterRectToSourceCrs( mTransform );
39+
}
40+
catch ( QgsCsException & )
41+
{
42+
// can't reproject mFilterRect
43+
mClosed = true;
44+
return;
45+
}
3646

3747
rewind();
3848
}

src/providers/mssql/qgsmssqlfeatureiterator.cpp

+11-1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include "qgsmssqlprovider.h"
2121
#include "qgslogger.h"
2222
#include "qgssettings.h"
23+
#include "qgscsexception.h"
2324

2425
#include <QObject>
2526
#include <QTextStream>
@@ -37,7 +38,16 @@ QgsMssqlFeatureIterator::QgsMssqlFeatureIterator( QgsMssqlFeatureSource *source,
3738
{
3839
mTransform = QgsCoordinateTransform( mSource->mCrs, mRequest.destinationCrs() );
3940
}
40-
mFilterRect = filterRectToSourceCrs( mTransform );
41+
try
42+
{
43+
mFilterRect = filterRectToSourceCrs( mTransform );
44+
}
45+
catch ( QgsCsException & )
46+
{
47+
// can't reproject mFilterRect
48+
mClosed = true;
49+
return;
50+
}
4151

4252
BuildStatement( request );
4353

src/providers/ogr/qgsogrfeatureiterator.cpp

+10-1
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,16 @@ QgsOgrFeatureIterator::QgsOgrFeatureIterator( QgsOgrFeatureSource *source, bool
8080
{
8181
mTransform = QgsCoordinateTransform( mSource->mCrs, mRequest.destinationCrs() );
8282
}
83-
mFilterRect = filterRectToSourceCrs( mTransform );
83+
try
84+
{
85+
mFilterRect = filterRectToSourceCrs( mTransform );
86+
}
87+
catch ( QgsCsException & )
88+
{
89+
// can't reproject mFilterRect
90+
mClosed = true;
91+
return;
92+
}
8493

8594
mFetchGeometry = ( !mFilterRect.isNull() ) || !( mRequest.flags() & QgsFeatureRequest::NoGeometry );
8695
QgsAttributeList attrs = ( mRequest.flags() & QgsFeatureRequest::SubsetOfAttributes ) ? mRequest.subsetOfAttributes() : mSource->mFields.allAttributesList();

src/providers/oracle/qgsoraclefeatureiterator.cpp

+11-1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "qgsmessagelog.h"
2323
#include "qgsgeometry.h"
2424
#include "qgssettings.h"
25+
#include "qgscsexception.h"
2526

2627
#include <QObject>
2728

@@ -42,7 +43,16 @@ QgsOracleFeatureIterator::QgsOracleFeatureIterator( QgsOracleFeatureSource *sour
4243
{
4344
mTransform = QgsCoordinateTransform( mSource->mCrs, mRequest.destinationCrs() );
4445
}
45-
mFilterRect = filterRectToSourceCrs( mTransform );
46+
try
47+
{
48+
mFilterRect = filterRectToSourceCrs( mTransform );
49+
}
50+
catch ( QgsCsException & )
51+
{
52+
// can't reproject mFilterRect
53+
mClosed = true;
54+
return;
55+
}
4656

4757
QVariantList args;
4858
mQry = QSqlQuery( *mConnection );

src/providers/postgres/qgspostgresfeatureiterator.cpp

+11-1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include "qgslogger.h"
2222
#include "qgsmessagelog.h"
2323
#include "qgssettings.h"
24+
#include "qgscsexception.h"
2425

2526
#include <QElapsedTimer>
2627
#include <QObject>
@@ -57,7 +58,16 @@ QgsPostgresFeatureIterator::QgsPostgresFeatureIterator( QgsPostgresFeatureSource
5758
{
5859
mTransform = QgsCoordinateTransform( mSource->mCrs, mRequest.destinationCrs() );
5960
}
60-
mFilterRect = filterRectToSourceCrs( mTransform );
61+
try
62+
{
63+
mFilterRect = filterRectToSourceCrs( mTransform );
64+
}
65+
catch ( QgsCsException & )
66+
{
67+
// can't reproject mFilterRect
68+
mClosed = true;
69+
return;
70+
}
6171

6272
mCursorName = mConn->uniqueCursorName();
6373
QString whereClause;

src/providers/spatialite/qgsspatialitefeatureiterator.cpp

+10-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,16 @@ QgsSpatiaLiteFeatureIterator::QgsSpatiaLiteFeatureIterator( QgsSpatiaLiteFeature
4747
{
4848
mTransform = QgsCoordinateTransform( mSource->mCrs, mRequest.destinationCrs() );
4949
}
50-
mFilterRect = filterRectToSourceCrs( mTransform );
50+
try
51+
{
52+
mFilterRect = filterRectToSourceCrs( mTransform );
53+
}
54+
catch ( QgsCsException & )
55+
{
56+
// can't reproject mFilterRect
57+
mClosed = true;
58+
return;
59+
}
5160

5261
//beware - limitAtProvider needs to be set to false if the request cannot be completely handled
5362
//by the provider (e.g., utilising QGIS expression filters)

src/providers/virtual/qgsvirtuallayerfeatureiterator.cpp

+11-1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ email : hugo dot mercier at oslandia dot com
1919
#include "qgsmessagelog.h"
2020
#include "qgsgeometry.h"
2121
#include "qgsvirtuallayerblob.h"
22+
#include "qgscsexception.h"
2223

2324
#include <stdexcept>
2425

@@ -46,7 +47,16 @@ QgsVirtualLayerFeatureIterator::QgsVirtualLayerFeatureIterator( QgsVirtualLayerF
4647
{
4748
mTransform = QgsCoordinateTransform( mSource->mCrs, mRequest.destinationCrs() );
4849
}
49-
mFilterRect = filterRectToSourceCrs( mTransform );
50+
try
51+
{
52+
mFilterRect = filterRectToSourceCrs( mTransform );
53+
}
54+
catch ( QgsCsException & )
55+
{
56+
// can't reproject mFilterRect
57+
mClosed = true;
58+
return;
59+
}
5060

5161
try
5262
{

src/providers/wfs/qgswfsfeatureiterator.cpp

+11-1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include "qgswfsutils.h"
2727
#include "qgslogger.h"
2828
#include "qgssettings.h"
29+
#include "qgscsexception.h"
2930

3031
#include <QDir>
3132
#include <QProgressDialog>
@@ -793,7 +794,16 @@ QgsWFSFeatureIterator::QgsWFSFeatureIterator( QgsWFSFeatureSource *source,
793794
{
794795
mTransform = QgsCoordinateTransform( mSource->mCrs, mRequest.destinationCrs() );
795796
}
796-
mFilterRect = filterRectToSourceCrs( mTransform );
797+
try
798+
{
799+
mFilterRect = filterRectToSourceCrs( mTransform );
800+
}
801+
catch ( QgsCsException & )
802+
{
803+
// can't reproject mFilterRect
804+
mClosed = true;
805+
return;
806+
}
797807

798808
// Configurable for the purpose of unit tests
799809
QString threshold( getenv( "QGIS_WFS_ITERATOR_TRANSFER_THRESHOLD" ) );

0 commit comments

Comments
 (0)