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

Lines changed: 170 additions & 25 deletions

‎python/core/qgsfeatureiterator.sip‎

Lines changed: 1 addition & 0 deletions
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‎

Lines changed: 11 additions & 1 deletion
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‎

Lines changed: 21 additions & 2 deletions
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‎

Lines changed: 1 addition & 9 deletions
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‎

Lines changed: 1 addition & 0 deletions
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‎

Lines changed: 11 additions & 1 deletion
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‎

Lines changed: 11 additions & 2 deletions
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‎

Lines changed: 11 additions & 1 deletion
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‎

Lines changed: 10 additions & 1 deletion
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‎

Lines changed: 11 additions & 1 deletion
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
}

0 commit comments

Comments
 (0)