Skip to content

Commit

Permalink
[wms] Don't require an explicit tileMatrixSet URI param for WMTS
Browse files Browse the repository at this point in the history
When no explicit WMTS tileMatrixSet is specified, use the first
returned by the GetCapabilities request. This allows creation
of raster layers with no upfront knowledge of the available
tile matrix sets, and avoids the need for Python scripts to
manually retrieve and parse the GetCapabilities in advance in
order to determine available tile set IDs.
  • Loading branch information
nyalldawson committed Jul 23, 2024
1 parent 49a7e85 commit 3120d62
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 0 deletions.
2 changes: 2 additions & 0 deletions src/providers/wms/qgswmscapabilities.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1868,6 +1868,8 @@ void QgsWmsCapabilities::parseWMTSContents( const QDomElement &element )
}

mTileMatrixSets.insert( set.identifier, set );
if ( mFirstTileMatrixSetId.isEmpty() )
mFirstTileMatrixSetId = set.identifier;
}

//
Expand Down
6 changes: 6 additions & 0 deletions src/providers/wms/qgswmscapabilities.h
Original file line number Diff line number Diff line change
Expand Up @@ -1051,6 +1051,12 @@ class QgsWmsCapabilities
*/
QHash<QString, QgsWmtsTileMatrixSet> 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<QString, bool> mCrsInvertAxis;

Expand Down
16 changes: 16 additions & 0 deletions src/providers/wms/qgswmsprovider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 ];
Expand Down
9 changes: 9 additions & 0 deletions tests/src/providers/testqgswmsprovider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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" ) );
}
Expand Down

0 comments on commit 3120d62

Please sign in to comment.