From 2f7550d1a22ad9813786e78c5a23767f253065e7 Mon Sep 17 00:00:00 2001 From: Alexander Bruy Date: Mon, 28 Jan 2019 12:09:31 +0200 Subject: [PATCH 1/3] [wcs] improve CRS handling when parsing DescribeCoverage responce (refs #21045) --- src/providers/wcs/qgswcscapabilities.cpp | 9 ++++++++- src/providers/wcs/qgswcssourceselect.cpp | 1 - 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/providers/wcs/qgswcscapabilities.cpp b/src/providers/wcs/qgswcscapabilities.cpp index 8d4d272572a..1513ac61e61 100644 --- a/src/providers/wcs/qgswcscapabilities.cpp +++ b/src/providers/wcs/qgswcscapabilities.cpp @@ -794,9 +794,16 @@ bool QgsWcsCapabilities::parseDescribeCoverageDom10( QByteArray const &xml, QgsW QDomElement supportedCRSsElement = firstChild( coverageOfferingElement, QStringLiteral( "supportedCRSs" ) ); // requestResponseCRSs and requestCRSs + responseCRSs are alternatives + // we try to parse one or the other coverage->supportedCrs = domElementsTexts( coverageOfferingElement, QStringLiteral( "supportedCRSs.requestResponseCRSs" ) ); + if ( coverage->supportedCrs.isEmpty() ) + { + coverage->supportedCrs = domElementsTexts( coverageOfferingElement, QStringLiteral( "supportedCRSs.requestCRSs" ) ); + coverage->supportedCrs << domElementsTexts( coverageOfferingElement, QStringLiteral( "supportedCRSs.responseCRSs" ) ); + } + // TODO: requestCRSs, responseCRSs - must be then implemented also in provider - //QgsDebugMsg( "supportedCrs = " + coverage->supportedCrs.join( "," ) ); + QgsDebugMsg( "supportedCrs = " + coverage->supportedCrs.join( "," ) ); coverage->nativeCrs = domElementText( coverageOfferingElement, QStringLiteral( "supportedCRSs.nativeCRSs" ) ); diff --git a/src/providers/wcs/qgswcssourceselect.cpp b/src/providers/wcs/qgswcssourceselect.cpp index 254bd5db24d..5e50ad93b76 100644 --- a/src/providers/wcs/qgswcssourceselect.cpp +++ b/src/providers/wcs/qgswcssourceselect.cpp @@ -226,7 +226,6 @@ QStringList QgsWCSSourceSelect::selectedLayersFormats() QStringList QgsWCSSourceSelect::selectedLayersCrses() { - QString identifier = selectedIdentifier(); if ( identifier.isEmpty() ) { return QStringList(); } From 650f4d780ce59dc915419b7a7eb47df5feb2bd52 Mon Sep 17 00:00:00 2001 From: Alexander Bruy Date: Mon, 28 Jan 2019 14:42:58 +0200 Subject: [PATCH 2/3] [wcs] exclude invalid CRSs from the coverage metadata --- src/providers/wcs/qgswcscapabilities.cpp | 26 ++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/src/providers/wcs/qgswcscapabilities.cpp b/src/providers/wcs/qgswcscapabilities.cpp index 1513ac61e61..1c5f0dda5ba 100644 --- a/src/providers/wcs/qgswcscapabilities.cpp +++ b/src/providers/wcs/qgswcscapabilities.cpp @@ -795,15 +795,25 @@ bool QgsWcsCapabilities::parseDescribeCoverageDom10( QByteArray const &xml, QgsW // requestResponseCRSs and requestCRSs + responseCRSs are alternatives // we try to parse one or the other - coverage->supportedCrs = domElementsTexts( coverageOfferingElement, QStringLiteral( "supportedCRSs.requestResponseCRSs" ) ); - if ( coverage->supportedCrs.isEmpty() ) + QStringList crsList; + crsList = domElementsTexts( coverageOfferingElement, QStringLiteral( "supportedCRSs.requestResponseCRSs" ) ); + if ( crsList.isEmpty() ) { - coverage->supportedCrs = domElementsTexts( coverageOfferingElement, QStringLiteral( "supportedCRSs.requestCRSs" ) ); - coverage->supportedCrs << domElementsTexts( coverageOfferingElement, QStringLiteral( "supportedCRSs.responseCRSs" ) ); + crsList = domElementsTexts( coverageOfferingElement, QStringLiteral( "supportedCRSs.requestCRSs" ) ); + crsList << domElementsTexts( coverageOfferingElement, QStringLiteral( "supportedCRSs.responseCRSs" ) ); + } + + // exclude invalid CRSs from the lists + for ( const QString &crsid : crsList ) + { + if ( QgsCoordinateReferenceSystem::fromOgcWmsCrs( crsid ).isValid() ) + { + coverage->supportedCrs << crsid; + } } // TODO: requestCRSs, responseCRSs - must be then implemented also in provider - QgsDebugMsg( "supportedCrs = " + coverage->supportedCrs.join( "," ) ); + //QgsDebugMsg( "supportedCrs = " + coverage->supportedCrs.join( "," ) ); coverage->nativeCrs = domElementText( coverageOfferingElement, QStringLiteral( "supportedCRSs.nativeCRSs" ) ); @@ -824,7 +834,11 @@ bool QgsWcsCapabilities::parseDescribeCoverageDom10( QByteArray const &xml, QgsW // If supportedCRSs.nativeCRSs is not defined we try to get it from RectifiedGrid if ( coverage->nativeCrs.isEmpty() ) { - coverage->nativeCrs = gridElement.attribute( QStringLiteral( "srsName" ) ); + QString crs = gridElement.attribute( QStringLiteral( "srsName" ) ); + if ( QgsCoordinateReferenceSystem::fromOgcWmsCrs( crs ).isValid() ) + { + coverage->nativeCrs = crs; + } } if ( !gridElement.isNull() ) From 92f6eda13b7b0a7479a5fec3267a8bc783396189 Mon Sep 17 00:00:00 2001 From: Alexander Bruy Date: Tue, 29 Jan 2019 08:26:51 +0200 Subject: [PATCH 3/3] const correctness --- src/providers/wcs/qgswcscapabilities.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/providers/wcs/qgswcscapabilities.cpp b/src/providers/wcs/qgswcscapabilities.cpp index 1c5f0dda5ba..8b5c7b57e44 100644 --- a/src/providers/wcs/qgswcscapabilities.cpp +++ b/src/providers/wcs/qgswcscapabilities.cpp @@ -804,7 +804,7 @@ bool QgsWcsCapabilities::parseDescribeCoverageDom10( QByteArray const &xml, QgsW } // exclude invalid CRSs from the lists - for ( const QString &crsid : crsList ) + for ( const QString &crsid : qgis::as_const( crsList ) ) { if ( QgsCoordinateReferenceSystem::fromOgcWmsCrs( crsid ).isValid() ) {