diff --git a/src/providers/wms/qgswmscapabilities.cpp b/src/providers/wms/qgswmscapabilities.cpp index 015f1123c03c..af415f3a4a16 100644 --- a/src/providers/wms/qgswmscapabilities.cpp +++ b/src/providers/wms/qgswmscapabilities.cpp @@ -1868,6 +1868,8 @@ void QgsWmsCapabilities::parseWMTSContents( const QDomElement &element ) } mTileMatrixSets.insert( set.identifier, set ); + if ( mFirstTileMatrixSetId.isEmpty() ) + mFirstTileMatrixSetId = set.identifier; } // diff --git a/src/providers/wms/qgswmscapabilities.h b/src/providers/wms/qgswmscapabilities.h index 2c3cc6bc9215..dadfe89bc711 100644 --- a/src/providers/wms/qgswmscapabilities.h +++ b/src/providers/wms/qgswmscapabilities.h @@ -1051,6 +1051,12 @@ class QgsWmsCapabilities */ QHash mTileMatrixSets; + /** + * ID of the first tile matrix returned in the capabilities, to be used as the default + * if no specific tile matrix is specified. + */ + QString mFirstTileMatrixSetId; + //temporarily caches invert axis setting for each crs QHash mCrsInvertAxis; diff --git a/src/providers/wms/qgswmsprovider.cpp b/src/providers/wms/qgswmsprovider.cpp index ffb24619601a..44cd29086498 100644 --- a/src/providers/wms/qgswmsprovider.cpp +++ b/src/providers/wms/qgswmsprovider.cpp @@ -593,6 +593,22 @@ bool QgsWmsProvider::setImageCrs( QString const &crs ) } mNativeResolutions.clear(); + + if ( mSettings.mTileMatrixSetId.isEmpty() && !mCaps.mFirstTileMatrixSetId.isEmpty() ) + { + // if no explicit tile matrix set specified, use first listed + mSettings.mTileMatrixSetId = mCaps.mFirstTileMatrixSetId; + for ( int i = 0; i < mCaps.mTileLayersSupported.size(); i++ ) + { + QgsWmtsTileLayer *tl = &mCaps.mTileLayersSupported[i]; + if ( tl->identifier != mSettings.mActiveSubLayers[0] ) + continue; + + mTileLayer = tl; + break; + } + } + if ( mCaps.mTileMatrixSets.contains( mSettings.mTileMatrixSetId ) ) { mTileMatrixSet = &mCaps.mTileMatrixSets[ mSettings.mTileMatrixSetId ]; diff --git a/tests/src/providers/testqgswmsprovider.cpp b/tests/src/providers/testqgswmsprovider.cpp index eaf73d97b45e..830cec4d3539 100644 --- a/tests/src/providers/testqgswmsprovider.cpp +++ b/tests/src/providers/testqgswmsprovider.cpp @@ -157,12 +157,21 @@ class TestQgsWmsProvider: public QgsTest // explicitly state crs and format { QgsWmsProvider provider( "contextualWMSLegend=0&crs=EPSG:4326&dpiMode=7&featureCount=10&format=image/jpg&layers=CountryGroup&styles=default&tileMatrixSet=standard&tilePixelRatio=0&url=http://localhost:8380/mapserv?xxx", QgsDataProvider::ProviderOptions(), &cap ); + QCOMPARE( provider.mSettings.mTileMatrixSetId, QStringLiteral( "standard" ) ); QCOMPARE( provider.crs().authid(), QStringLiteral( "EPSG:4326" ) ); QCOMPARE( provider.mSettings.mImageMimeType, QStringLiteral( "image/jpg" ) ); } // no crs or format specified, should use tile matrix crs { QgsWmsProvider provider( "contextualWMSLegend=0&dpiMode=7&featureCount=10&layers=CountryGroup&styles=default&tileMatrixSet=standard&tilePixelRatio=0&url=http://localhost:8380/mapserv?xxx", QgsDataProvider::ProviderOptions(), &cap ); + QCOMPARE( provider.mSettings.mTileMatrixSetId, QStringLiteral( "standard" ) ); + QCOMPARE( provider.crs().authid(), QStringLiteral( "EPSG:3857" ) ); + QCOMPARE( provider.mSettings.mImageMimeType, QStringLiteral( "image/png" ) ); + } + // no tileMatrixSet specified, should use first listed + { + QgsWmsProvider provider( "layers=CountryGroup&styles=default&tileDimensions=&url=http://localhost:8380/mapserv?xxx", QgsDataProvider::ProviderOptions(), &cap ); + QCOMPARE( provider.mSettings.mTileMatrixSetId, QStringLiteral( "standard" ) ); QCOMPARE( provider.crs().authid(), QStringLiteral( "EPSG:3857" ) ); QCOMPARE( provider.mSettings.mImageMimeType, QStringLiteral( "image/png" ) ); }