diff --git a/src/providers/wms/qgswmsprovider.cpp b/src/providers/wms/qgswmsprovider.cpp index b643e3cc906c..b0d6dbebed24 100644 --- a/src/providers/wms/qgswmsprovider.cpp +++ b/src/providers/wms/qgswmsprovider.cpp @@ -152,7 +152,10 @@ QgsWmsProvider::QgsWmsProvider( QString const &uri, const ProviderOptions &optio // we are working with XYZ tiles // no need to get capabilities, the whole definition is in URI // so we just generate a dummy WMTS definition - setupXyzCapabilities( uri ); + if ( !setupXyzCapabilities( uri ) ) + { + return; + } } else { @@ -1760,7 +1763,7 @@ bool QgsWmsProvider::retrieveServerCapabilities( bool forceRefresh ) } -void QgsWmsProvider::setupXyzCapabilities( const QString &uri, const QgsRectangle &sourceExtent, int sourceMinZoom, int sourceMaxZoom, double sourceTilePixelRatio ) +bool QgsWmsProvider::setupXyzCapabilities( const QString &uri, const QgsRectangle &sourceExtent, int sourceMinZoom, int sourceMaxZoom, double sourceTilePixelRatio ) { QgsDataSourceUri parsedUri; parsedUri.setEncodedUri( uri ); @@ -1773,8 +1776,18 @@ void QgsWmsProvider::setupXyzCapabilities( const QString &uri, const QgsRectangl // Y going from ~85 N to ~85 S (=atan(sinh(pi)) ... to get a square) QgsPointXY topLeftLonLat( -180, 180.0 / M_PI * std::atan( std::sinh( M_PI ) ) ); QgsPointXY bottomRightLonLat( 180, 180.0 / M_PI * std::atan( std::sinh( -M_PI ) ) ); - QgsPointXY topLeft = ct.transform( topLeftLonLat ); - QgsPointXY bottomRight = ct.transform( bottomRightLonLat ); + QgsPointXY topLeft; + QgsPointXY bottomRight; + try + { + topLeft = ct.transform( topLeftLonLat ); + bottomRight = ct.transform( bottomRightLonLat ); + } + catch ( const QgsCsException & ) + { + QgsDebugError( QStringLiteral( "setupXyzCapabilities: failed to reproject corner coordinates" ) ); + return false; + } double xspan = ( bottomRight.x() - topLeft.x() ); QgsWmsBoundingBoxProperty bbox; @@ -1877,6 +1890,7 @@ void QgsWmsProvider::setupXyzCapabilities( const QString &uri, const QgsRectangl tmsLinkRef.limits[tm.identifier] = limits; } } + return true; } bool QgsWmsProvider::setupMBTilesCapabilities( const QString &uri ) @@ -1925,8 +1939,7 @@ bool QgsWmsProvider::setupMBTilesCapabilities( const QString &uri ) // MBTiles spec does not say anything about resolutions... double sourceTilePixelRatio = 1; - setupXyzCapabilities( uri, sourceExtent, sourceMinZoom, sourceMaxZoom, sourceTilePixelRatio ); - return true; + return setupXyzCapabilities( uri, sourceExtent, sourceMinZoom, sourceMaxZoom, sourceTilePixelRatio ); } diff --git a/src/providers/wms/qgswmsprovider.h b/src/providers/wms/qgswmsprovider.h index 175a8d99376c..8cc6fdfbe8cd 100644 --- a/src/providers/wms/qgswmsprovider.h +++ b/src/providers/wms/qgswmsprovider.h @@ -384,7 +384,7 @@ class QgsWmsProvider final: public QgsRasterDataProvider private: //! In case of XYZ tile layer, setup capabilities from its URI - void setupXyzCapabilities( const QString &uri, const QgsRectangle &sourceExtent = QgsRectangle(), int sourceMinZoom = -1, int sourceMaxZoom = -1, double sourceTilePixelRatio = 0. ); + bool setupXyzCapabilities( const QString &uri, const QgsRectangle &sourceExtent = QgsRectangle(), int sourceMinZoom = -1, int sourceMaxZoom = -1, double sourceTilePixelRatio = 0. ); //! In case of MBTiles layer, setup capabilities from its metadata bool setupMBTilesCapabilities( const QString &uri );