From 7aebfeec852bc0b695ac1248e4f9e0a3e19fe7b3 Mon Sep 17 00:00:00 2001 From: Alessandro Pasotti Date: Mon, 24 May 2021 15:10:17 +0200 Subject: [PATCH 1/2] Server: add loggig handlers for CRS grid issues Fixes #43072 --- well, not really a fix, but without this information in the logs life is harder. --- src/server/qgsserver.cpp | 67 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/src/server/qgsserver.cpp b/src/server/qgsserver.cpp index 130f026fe286..696ee846e631 100644 --- a/src/server/qgsserver.cpp +++ b/src/server/qgsserver.cpp @@ -216,6 +216,73 @@ bool QgsServer::init() QgsServerLogger::instance()->setLogStderr(); } + // Logging handlers for CRS grid issues + QgsCoordinateTransform::setCustomMissingRequiredGridHandler( [ = ]( const QgsCoordinateReferenceSystem & sourceCrs, + const QgsCoordinateReferenceSystem & destinationCrs, + const QgsDatumTransform::GridDetails & grid ) + { + QgsServerLogger::instance()->logMessage( QStringLiteral( "Cannot use project transform between %1 and %2 - missing grid %3" ) + .arg( sourceCrs.userFriendlyIdentifier( QgsCoordinateReferenceSystem::ShortString ), + destinationCrs.userFriendlyIdentifier( QgsCoordinateReferenceSystem::ShortString ), + grid.shortName ), + QStringLiteral( "QGIS Server" ), Qgis::MessageLevel::Warning ); + } ); + + + QgsCoordinateTransform::setCustomMissingGridUsedByContextHandler( [ = ]( const QgsCoordinateReferenceSystem & sourceCrs, + const QgsCoordinateReferenceSystem & destinationCrs, + const QgsDatumTransform::TransformDetails & details ) + { + QgsServerLogger::instance()->logMessage( QStringLiteral( "Cannot use project transform between %1 and %2 - %3" ) + .arg( sourceCrs.userFriendlyIdentifier( QgsCoordinateReferenceSystem::ShortString ), + destinationCrs.userFriendlyIdentifier( QgsCoordinateReferenceSystem::ShortString ), + details.name ), + QStringLiteral( "QGIS Server" ), Qgis::MessageLevel::Warning ); + } ); + + + QgsCoordinateTransform::setCustomMissingPreferredGridHandler( [ = ]( const QgsCoordinateReferenceSystem & sourceCrs, + const QgsCoordinateReferenceSystem & destinationCrs, + const QgsDatumTransform::TransformDetails & preferredOperation, + const QgsDatumTransform::TransformDetails & availableOperation ) + { + + QString gridMessage; + for ( const QgsDatumTransform::GridDetails &grid : preferredOperation.grids ) + { + if ( !grid.isAvailable ) + { + gridMessage.append( QStringLiteral( "This transformation requires the grid file '%1', which is not available for use on the system.\n" ).arg( grid.shortName ) ); + if ( !grid.url.isEmpty() ) + { + if ( !grid.packageName.isEmpty() ) + { + gridMessage.append( QStringLiteral( "This grid is part of the '%1' package, available for download from %2.\n" ).arg( grid.packageName, grid.url ) ); + } + else + { + gridMessage.append( QStringLiteral( "This grid is available for download from %1.\n" ).arg( grid.url ) ); + } + } + } + } + + QString accuracyMessage; + if ( availableOperation.accuracy >= 0 && preferredOperation.accuracy >= 0 ) + accuracyMessage = QStringLiteral( "Current transform '%1' has an accuracy of %2 meters, while the preferred transformation '%3' has accuracy %4 meters.\n" ).arg( availableOperation.name ) + .arg( availableOperation.accuracy ).arg( preferredOperation.name ).arg( preferredOperation.accuracy ); + else if ( preferredOperation.accuracy >= 0 ) + accuracyMessage = QStringLiteral( "Current transform '%1' has an unknown accuracy, while the preferred transformation '%2' has accuracy %3 meters.\n" ).arg( availableOperation.name ) + .arg( preferredOperation.name ).arg( preferredOperation.accuracy ); + + const QString longMessage = QStringLiteral( "The preferred transform between '%1' and '%2' is not available for use on the system.\n" ).arg( sourceCrs.userFriendlyIdentifier(), + destinationCrs.userFriendlyIdentifier() ) + + gridMessage + accuracyMessage; + + QgsServerLogger::instance()->logMessage( longMessage, QStringLiteral( "QGIS Server" ), Qgis::MessageLevel::Warning ); + + } ); + // Configure locale initLocale(); From 4a62feac61cca58701ea95b3535c5782767b6914 Mon Sep 17 00:00:00 2001 From: Alessandro Pasotti Date: Tue, 25 May 2021 10:29:40 +0200 Subject: [PATCH 2/2] More server warnings on transformation errors --- src/server/qgsserver.cpp | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/src/server/qgsserver.cpp b/src/server/qgsserver.cpp index 696ee846e631..74058db2b866 100644 --- a/src/server/qgsserver.cpp +++ b/src/server/qgsserver.cpp @@ -233,10 +233,19 @@ bool QgsServer::init() const QgsCoordinateReferenceSystem & destinationCrs, const QgsDatumTransform::TransformDetails & details ) { - QgsServerLogger::instance()->logMessage( QStringLiteral( "Cannot use project transform between %1 and %2 - %3" ) + QString gridMessage; + for ( const QgsDatumTransform::GridDetails &grid : details.grids ) + { + if ( !grid.isAvailable ) + { + gridMessage.append( QStringLiteral( "This transformation requires the grid file '%1', which is not available for use on the system.\n" ).arg( grid.shortName ) ); + } + } + QgsServerLogger::instance()->logMessage( QStringLiteral( "Cannot use project transform between %1 and %2 - %3.\n%4" ) .arg( sourceCrs.userFriendlyIdentifier( QgsCoordinateReferenceSystem::ShortString ), destinationCrs.userFriendlyIdentifier( QgsCoordinateReferenceSystem::ShortString ), - details.name ), + details.name, + gridMessage ), QStringLiteral( "QGIS Server" ), Qgis::MessageLevel::Warning ); } ); @@ -272,8 +281,9 @@ bool QgsServer::init() accuracyMessage = QStringLiteral( "Current transform '%1' has an accuracy of %2 meters, while the preferred transformation '%3' has accuracy %4 meters.\n" ).arg( availableOperation.name ) .arg( availableOperation.accuracy ).arg( preferredOperation.name ).arg( preferredOperation.accuracy ); else if ( preferredOperation.accuracy >= 0 ) - accuracyMessage = QStringLiteral( "Current transform '%1' has an unknown accuracy, while the preferred transformation '%2' has accuracy %3 meters.\n" ).arg( availableOperation.name ) - .arg( preferredOperation.name ).arg( preferredOperation.accuracy ); + accuracyMessage = QStringLiteral( "Current transform '%1' has an unknown accuracy, while the preferred transformation '%2' has accuracy %3 meters.\n" ) + .arg( availableOperation.name, preferredOperation.name ) + .arg( preferredOperation.accuracy ); const QString longMessage = QStringLiteral( "The preferred transform between '%1' and '%2' is not available for use on the system.\n" ).arg( sourceCrs.userFriendlyIdentifier(), destinationCrs.userFriendlyIdentifier() ) @@ -283,6 +293,13 @@ bool QgsServer::init() } ); + QgsCoordinateTransform::setCustomCoordinateOperationCreationErrorHandler( [ = ]( const QgsCoordinateReferenceSystem & sourceCrs, const QgsCoordinateReferenceSystem & destinationCrs, const QString & error ) + { + const QString longMessage = QStringLiteral( "No transform is available between %1 and %2: %3" ) + .arg( sourceCrs.userFriendlyIdentifier(), destinationCrs.userFriendlyIdentifier(), error ); + QgsServerLogger::instance()->logMessage( longMessage, QStringLiteral( "QGIS Server" ), Qgis::MessageLevel::Warning ); + } ); + // Configure locale initLocale();