diff --git a/src/providers/wms/qgswmscapabilities.cpp b/src/providers/wms/qgswmscapabilities.cpp index f00c3496caae..ab5898b54031 100644 --- a/src/providers/wms/qgswmscapabilities.cpp +++ b/src/providers/wms/qgswmscapabilities.cpp @@ -61,6 +61,7 @@ bool QgsWmsSettings::parseUri( const QString &uriString ) mInterpretation = uri.param( QStringLiteral( "interpretation" ) ); } + mTiled = false; if ( uri.param( QStringLiteral( "type" ) ) == QLatin1String( "xyz" ) || uri.param( QStringLiteral( "type" ) ) == QLatin1String( "mbtiles" ) ) { @@ -89,8 +90,7 @@ bool QgsWmsSettings::parseUri( const QString &uriString ) return true; } - - if ( uri.param( QStringLiteral( "type" ) ) == QLatin1String( "wmst" ) ) + else if ( uri.param( QStringLiteral( "type" ) ) == QLatin1String( "wmst" ) ) { mIsTemporal = true; mTemporalExtent = uri.param( QStringLiteral( "timeDimensionExtent" ) ); @@ -161,8 +161,11 @@ bool QgsWmsSettings::parseUri( const QString &uriString ) mIsBiTemporal = true; } } + else if ( uri.param( QStringLiteral( "type" ) ) == QLatin1String( "wmts" ) ) + { + mTiled = true; + } - mTiled = false; mTileDimensionValues.clear(); mHttpUri = uri.param( QStringLiteral( "url" ) ); @@ -1852,6 +1855,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 f56a5126d103..873e9e61b99a 100644 --- a/src/providers/wms/qgswmscapabilities.h +++ b/src/providers/wms/qgswmscapabilities.h @@ -1049,6 +1049,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 d94074e1e90e..8dafeaf3e109 100644 --- a/src/providers/wms/qgswmsprovider.cpp +++ b/src/providers/wms/qgswmsprovider.cpp @@ -590,6 +590,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..23826264ebdd 100644 --- a/tests/src/providers/testqgswmsprovider.cpp +++ b/tests/src/providers/testqgswmsprovider.cpp @@ -157,12 +157,32 @@ 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 ); + QVERIFY( provider.mSettings.mTiled ); + 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 ); + QVERIFY( provider.mSettings.mTiled ); + 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 ); + QVERIFY( provider.mSettings.mTiled ); + QCOMPARE( provider.mSettings.mTileMatrixSetId, QStringLiteral( "standard" ) ); + QCOMPARE( provider.crs().authid(), QStringLiteral( "EPSG:3857" ) ); + QCOMPARE( provider.mSettings.mImageMimeType, QStringLiteral( "image/png" ) ); + } + // no tileMatrixSet specified, using type=wmts to request wmts + { + QgsWmsProvider provider( "layers=CountryGroup&styles=default&type=wmts&url=http://localhost:8380/mapserv?xxx", QgsDataProvider::ProviderOptions(), &cap ); + QVERIFY( provider.mSettings.mTiled ); + QCOMPARE( provider.mSettings.mTileMatrixSetId, QStringLiteral( "standard" ) ); QCOMPARE( provider.crs().authid(), QStringLiteral( "EPSG:3857" ) ); QCOMPARE( provider.mSettings.mImageMimeType, QStringLiteral( "image/png" ) ); }