Skip to content

Commit

Permalink
Merge pull request #58216 from qgis/backport-58211-to-queued_ltr_back…
Browse files Browse the repository at this point in the history
…ports

[Backport queued_ltr_backports] Don't require an explicit tileMatrixSet URI param for WMTS
  • Loading branch information
alexbruy committed Jul 24, 2024
2 parents 378414e + af224f1 commit 698e23b
Show file tree
Hide file tree
Showing 4 changed files with 50 additions and 3 deletions.
11 changes: 8 additions & 3 deletions src/providers/wms/qgswmscapabilities.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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" ) )
{
Expand Down Expand Up @@ -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" ) );
Expand Down Expand Up @@ -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" ) );
Expand Down Expand Up @@ -1852,6 +1855,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 @@ -1049,6 +1049,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 @@ -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 ];
Expand Down
20 changes: 20 additions & 0 deletions tests/src/providers/testqgswmsprovider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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" ) );
}
Expand Down

0 comments on commit 698e23b

Please sign in to comment.