From 202ff1f0f67488ef9dcf0cbc5271cd3c8132534f Mon Sep 17 00:00:00 2001 From: Mathieu Pellerin Date: Tue, 21 Jan 2025 19:25:03 +0700 Subject: [PATCH] [processing] Guard QGIS from crashing due to erroneous extent / invalid CRS in XYZ creation algorithms --- .../processing/qgsalgorithmxyztiles.cpp | 30 ++++++++++++++++--- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/src/analysis/processing/qgsalgorithmxyztiles.cpp b/src/analysis/processing/qgsalgorithmxyztiles.cpp index 3f73218fdccf..ee215f57ed82 100644 --- a/src/analysis/processing/qgsalgorithmxyztiles.cpp +++ b/src/analysis/processing/qgsalgorithmxyztiles.cpp @@ -149,7 +149,15 @@ bool QgsXyzTilesBaseAlgorithm::prepareAlgorithm( const QVariantMap ¶meters, QgsRectangle extent = parameterAsExtent( parameters, QStringLiteral( "EXTENT" ), context ); QgsCoordinateReferenceSystem extentCrs = parameterAsExtentCrs( parameters, QStringLiteral( "EXTENT" ), context ); QgsCoordinateTransform ct( extentCrs, project->crs(), context.transformContext() ); - mExtent = ct.transformBoundingBox( extent ); + try + { + mExtent = ct.transformBoundingBox( extent ); + } + catch ( QgsCsException & ) + { + feedback->reportError( QObject::tr( "Could not transform the extent into the project CRS" ), true ); + return false; + } mMinZoom = parameterAsInt( parameters, QStringLiteral( "ZOOM_MIN" ), context ); mMaxZoom = parameterAsInt( parameters, QStringLiteral( "ZOOM_MAX" ), context ); @@ -167,8 +175,15 @@ bool QgsXyzTilesBaseAlgorithm::prepareAlgorithm( const QVariantMap ¶meters, mMercatorCrs = QgsCoordinateReferenceSystem( "EPSG:3857" ); mSrc2Wgs = QgsCoordinateTransform( project->crs(), mWgs84Crs, context.transformContext() ); mWgs2Mercator = QgsCoordinateTransform( mWgs84Crs, mMercatorCrs, context.transformContext() ); - - mWgs84Extent = mSrc2Wgs.transformBoundingBox( mExtent ); + try + { + mWgs84Extent = mSrc2Wgs.transformBoundingBox( mExtent ); + } + catch ( QgsCsException & ) + { + feedback->reportError( QObject::tr( "Could not transform the extent into WGS84" ), true ); + return false; + } if ( parameters.contains( QStringLiteral( "TILE_WIDTH" ) ) ) { @@ -212,7 +227,14 @@ void QgsXyzTilesBaseAlgorithm::startJobs() MetaTile metaTile = mMetaTiles.takeFirst(); QgsMapSettings settings; - settings.setExtent( mWgs2Mercator.transformBoundingBox( metaTile.extent() ) ); + try + { + settings.setExtent( mWgs2Mercator.transformBoundingBox( metaTile.extent() ) ); + } + catch ( QgsCsException & ) + { + continue; + } settings.setOutputImageFormat( QImage::Format_ARGB32_Premultiplied ); settings.setTransformContext( mTransformContext ); settings.setDestinationCrs( mMercatorCrs );