Skip to content

Commit

Permalink
Automatically populate appropriate layer metadata when adding OpenStr…
Browse files Browse the repository at this point in the history
…eetMap tile layers

(cherry picked from commit ed4bb50)
  • Loading branch information
nyalldawson committed Jan 15, 2021
1 parent 7e4cdf4 commit be97dc0
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 0 deletions.
44 changes: 44 additions & 0 deletions src/providers/wms/qgswmsprovider.cpp
Expand Up @@ -1433,6 +1433,40 @@ void QgsWmsProvider::setupXyzCapabilities( const QString &uri, const QgsRectangl
bbox.crs = mSettings.mCrsId;
bbox.box = sourceExtent.isNull() ? QgsRectangle( topLeft.x(), bottomRight.y(), bottomRight.x(), topLeft.y() ) : sourceExtent;

// metadata
if ( mSettings.mXyz )
{
if ( parsedUri.param( QStringLiteral( "url" ) ).contains( QLatin1String( "openstreetmap" ), Qt::CaseInsensitive ) )
{
mLayerMetadata.setTitle( tr( "OpenStreetMap tiles" ) );
mLayerMetadata.setIdentifier( tr( "OpenStreetMap tiles" ) );
mLayerMetadata.setAbstract( tr( "OpenStreetMap is built by a community of mappers that contribute and maintain data about roads, trails, cafés, railway stations, and much more, all over the world." ) );

QStringList licenses;
licenses << tr( "Open Data Commons Open Database License (ODbL)" );
if ( parsedUri.param( QStringLiteral( "url" ) ).contains( QLatin1String( "tile.openstreetmap.org" ), Qt::CaseInsensitive ) )
{
// OSM tiles have a different attribution requirement to OpenStreetMap data - see https://www.openstreetmap.org/copyright
mLayerMetadata.setRights( QStringList() << tr( "Base map and data from OpenStreetMap and OpenStreetMap Foundation (CC-BY-SA). © https://www.openstreetmap.org and contributors." ) );
licenses << tr( "Creative Commons Attribution-ShareAlike (CC-BY-SA)" );
}
else
mLayerMetadata.setRights( QStringList() << tr( "© OpenStreetMap and contributors (https://www.openstreetmap.org/copyright)." ) );
mLayerMetadata.setLicenses( licenses );

QgsLayerMetadata::SpatialExtent spatialExtent;
spatialExtent.bounds = QgsBox3d( QgsRectangle( topLeftLonLat.x(), bottomRightLonLat.y(), bottomRightLonLat.x(), topLeftLonLat.y() ) );
spatialExtent.extentCrs = QgsCoordinateReferenceSystem( QStringLiteral( "EPSG:4326" ) );
QgsLayerMetadata::Extent metadataExtent;
metadataExtent.setSpatialExtents( QList< QgsLayerMetadata::SpatialExtent >() << spatialExtent );
mLayerMetadata.setExtent( metadataExtent );
mLayerMetadata.setCrs( QgsCoordinateReferenceSystem( "EPSG:3857" ) );

mLayerMetadata.addLink( QgsAbstractMetadataBase::Link( tr( "Source" ), QStringLiteral( "WWW:LINK" ), QStringLiteral( "https://www.openstreetmap.org/" ) ) );
}
}
mLayerMetadata.setType( QStringLiteral( "dataset" ) );

QgsWmtsTileLayer tl;
tl.tileMode = XYZ;
tl.identifier = QStringLiteral( "xyz" ); // as set in parseUri
Expand Down Expand Up @@ -3546,6 +3580,11 @@ QgsCoordinateReferenceSystem QgsWmsProvider::crs() const
return mCrs;
}

QgsRasterDataProvider::ProviderCapabilities QgsWmsProvider::providerCapabilities() const
{
return ProviderCapability::ReadLayerMetadata;
}

QString QgsWmsProvider::lastErrorTitle()
{
return mErrorCaption;
Expand Down Expand Up @@ -3590,6 +3629,11 @@ QList<double> QgsWmsProvider::nativeResolutions() const
return mNativeResolutions;
}

QgsLayerMetadata QgsWmsProvider::layerMetadata() const
{
return mLayerMetadata;
}

QVector<QgsWmsSupportedFormat> QgsWmsProvider::supportedFormats()
{
QVector<QgsWmsSupportedFormat> formats;
Expand Down
4 changes: 4 additions & 0 deletions src/providers/wms/qgswmsprovider.h
Expand Up @@ -136,6 +136,8 @@ class QgsWmsProvider final: public QgsRasterDataProvider

QgsCoordinateReferenceSystem crs() const override;

QgsRasterDataProvider::ProviderCapabilities providerCapabilities() const override;

/**
* Reorder the list of WMS layer names to be rendered by this server
* (in order from bottom to top)
Expand Down Expand Up @@ -215,6 +217,7 @@ class QgsWmsProvider final: public QgsRasterDataProvider
QString description() const override;
bool renderInPreview( const QgsDataProvider::PreviewContext &context ) override;
QList< double > nativeResolutions() const override;
QgsLayerMetadata layerMetadata() const override;

static QVector<QgsWmsSupportedFormat> supportedFormats();

Expand Down Expand Up @@ -476,6 +479,7 @@ class QgsWmsProvider final: public QgsRasterDataProvider
QStringList mSupportedGetFeatureFormats;

QgsCoordinateReferenceSystem mCrs;
QgsLayerMetadata mLayerMetadata;

//! Parsed response of server's capabilities - initially (or on error) may be invalid
QgsWmsCapabilities mCaps;
Expand Down
14 changes: 14 additions & 0 deletions tests/src/providers/testqgswmsprovider.cpp
Expand Up @@ -179,6 +179,20 @@ class TestQgsWmsProvider: public QObject
QCOMPARE( encodedUri, uriString );
}

void testOsmMetadata()
{
// test that we auto-populate openstreetmap tile metadata

// don't actually hit the osm server -- the url below uses "file" instead of "http"!
QgsWmsProvider provider( QStringLiteral( "type=xyz&url=file://tile.openstreetmap.org/%7Bz%7D/%7Bx%7D/%7By%7D.png&zmax=19&zmin=0" ), QgsDataProvider::ProviderOptions(), mCapabilities );
QCOMPARE( provider.layerMetadata().identifier(), QStringLiteral( "OpenStreetMap tiles" ) );
QCOMPARE( provider.layerMetadata().title(), QStringLiteral( "OpenStreetMap tiles" ) );
QVERIFY( !provider.layerMetadata().abstract().isEmpty() );
QCOMPARE( provider.layerMetadata().licenses().at( 0 ), QStringLiteral( "Open Data Commons Open Database License (ODbL)" ) );
QCOMPARE( provider.layerMetadata().licenses().at( 1 ), QStringLiteral( "Creative Commons Attribution-ShareAlike (CC-BY-SA)" ) );
QVERIFY( provider.layerMetadata().rights().at( 0 ).startsWith( "Base map and data from OpenStreetMap and OpenStreetMap Foundation" ) );
}

bool imageCheck( const QString &testType, QgsMapLayer *layer, const QgsRectangle &extent )
{
//use the QgsRenderChecker test utility class to
Expand Down

0 comments on commit be97dc0

Please sign in to comment.