From a37b96b4e9595bec409f88d03fcc49e2ba2418ea Mon Sep 17 00:00:00 2001 From: Alexander Bruy Date: Thu, 6 Feb 2025 08:06:29 +0000 Subject: [PATCH] when adding WMS/WFS layers from Browser use project CRS if it is supported by the server (fix #44325) --- src/providers/wfs/qgswfsdataitems.cpp | 23 +++++++++++++++++++-- src/providers/wms/qgswmsdataitems.cpp | 29 +++++++++++++++++---------- 2 files changed, 39 insertions(+), 13 deletions(-) diff --git a/src/providers/wfs/qgswfsdataitems.cpp b/src/providers/wfs/qgswfsdataitems.cpp index 1df9bd665433..71c30e5105a6 100644 --- a/src/providers/wfs/qgswfsdataitems.cpp +++ b/src/providers/wfs/qgswfsdataitems.cpp @@ -30,6 +30,7 @@ #include "qgswfsdatasourceuri.h" #include "qgswfsprovider.h" #include "qgssettings.h" +#include "qgsproject.h" #ifdef HAVE_GUI #include "qgswfssourceselect.h" @@ -123,13 +124,31 @@ QVector QgsWfsConnectionItem::createChildren() QVector layers; if ( capabilities.errorCode() == QgsWfsCapabilities::NoError ) { + const QString projectCrs = QgsProject::instance()->crs().authid(); const auto featureTypes = capabilities.capabilities().featureTypes; for ( const QgsWfsCapabilities::FeatureType &featureType : featureTypes ) { + // if project CRS is supported then use it, otherwise use first available CRS (which is the default CRS) + QString crs; + if ( !featureType.crslist.isEmpty() ) + { + for ( const QString &c : std::as_const( featureType.crslist ) ) + { + if ( c.compare( projectCrs, Qt::CaseInsensitive ) == 0 ) + { + crs = projectCrs; + break; + } + } + + if ( crs.isEmpty() ) + { + crs = featureType.crslist.first(); + } + } QgsWfsLayerItem *layer = new QgsWfsLayerItem( this, mName, uri, featureType.name, featureType.title, - !featureType.crslist.isEmpty() ? featureType.crslist.first() : QString(), - QgsWFSProvider::WFS_PROVIDER_KEY + crs, QgsWFSProvider::WFS_PROVIDER_KEY ); layers.append( layer ); } diff --git a/src/providers/wms/qgswmsdataitems.cpp b/src/providers/wms/qgswmsdataitems.cpp index 22ba17f9cc3f..346fe894c461 100644 --- a/src/providers/wms/qgswmsdataitems.cpp +++ b/src/providers/wms/qgswmsdataitems.cpp @@ -23,6 +23,7 @@ #include "qgswmscapabilities.h" #include "qgswmsconnection.h" #include "qgsxyzconnection.h" +#include "qgsproject.h" // --------------------------------------------------------------------------- @@ -455,22 +456,28 @@ QString QgsWMSItemBase::createUri( bool withStyle ) } mDataSourceUri.setParam( QStringLiteral( "format" ), format ); + const QString projectCrs = QgsProject::instance()->crs().authid(); QString crs; - // get first known if possible - QgsCoordinateReferenceSystem testCrs; - for ( const QString &c : std::as_const( mLayerProperty.crs ) ) + // if project CRS is supported then use it, otherwise use first available CRS + if ( !mLayerProperty.crs.isEmpty() ) { - testCrs = QgsCoordinateReferenceSystem::fromOgcWmsCrs( c ); - if ( testCrs.isValid() ) + QgsCoordinateReferenceSystem testCrs; + for ( const QString &c : std::as_const( mLayerProperty.crs ) ) { - crs = c; - break; + testCrs = QgsCoordinateReferenceSystem::fromOgcWmsCrs( c ); + if ( testCrs.authid().compare( projectCrs, Qt::CaseInsensitive ) == 0 ) + { + crs = projectCrs; + break; + } + } + + if ( crs.isEmpty() ) + { + crs = mLayerProperty.crs[0]; } } - if ( crs.isEmpty() && !mLayerProperty.crs.isEmpty() ) - { - crs = mLayerProperty.crs[0]; - } + mDataSourceUri.setParam( QStringLiteral( "crs" ), crs ); // Set default featureCount to 10, old connections might miss this