From 705416c4896007b3a32fd2c847a00bd5eb2fbfa5 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Sun, 19 Nov 2017 16:17:30 +1000 Subject: [PATCH] More consistent exception throwing in QgsCoordinateTransform::transformBoundingBox Depending on the os and proj versions, we weren't always getting an exception when a bad bounding box transform was made. So now we explicitly check the result, and if everything was invalid then we also throw an exception. This makes the behavior consistent across different platforms, and fixes running the provider tests on non Travis platforms (highly likely also fixes various issues encountered while running QGIS) --- src/core/qgscoordinatetransform.cpp | 6 ++++++ tests/src/core/testqgscoordinatetransform.cpp | 15 +++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/src/core/qgscoordinatetransform.cpp b/src/core/qgscoordinatetransform.cpp index d07fc2953b1..fd08c905018 100644 --- a/src/core/qgscoordinatetransform.cpp +++ b/src/core/qgscoordinatetransform.cpp @@ -426,6 +426,12 @@ QgsRectangle QgsCoordinateTransform::transformBoundingBox( const QgsRectangle &r } } + if ( bb_rect.isNull() ) + { + // something bad happened when reprojecting the filter rect... no finite points were left! + throw QgsCsException( QObject::tr( "Could not transform bounding box to target CRS" ) ); + } + if ( handle180Crossover ) { //subtract temporary addition of 360 degrees from longitudes diff --git a/tests/src/core/testqgscoordinatetransform.cpp b/tests/src/core/testqgscoordinatetransform.cpp index b0e28bcee4f..b9d554b4230 100644 --- a/tests/src/core/testqgscoordinatetransform.cpp +++ b/tests/src/core/testqgscoordinatetransform.cpp @@ -19,6 +19,7 @@ #include "qgsrectangle.h" #include #include "qgstest.h" +#include "qgsexception.h" class TestQgsCoordinateTransform: public QObject { @@ -204,6 +205,20 @@ void TestQgsCoordinateTransform::transformBoundingBox() QGSCOMPARENEAR( resultRect.yMinimum(), expectedRect.yMinimum(), 0.001 ); QGSCOMPARENEAR( resultRect.xMaximum(), expectedRect.xMaximum(), 0.001 ); QGSCOMPARENEAR( resultRect.yMaximum(), expectedRect.yMaximum(), 0.001 ); + + // test transforming a bounding box, resulting in an invalid transform - exception must be thrown + tr = QgsCoordinateTransform( QgsCoordinateReferenceSystem( 4326 ), QgsCoordinateReferenceSystem( QStringLiteral( "EPSG:28356" ) ) ); + QgsRectangle rect( -99999999999, 99999999999, -99999999998, 99999999998 ); + bool errorObtained = false; + try + { + resultRect = tr.transformBoundingBox( rect ); + } + catch ( QgsCsException & ) + { + errorObtained = true; + } + QVERIFY( errorObtained ); } QGSTEST_MAIN( TestQgsCoordinateTransform )