Skip to content

Commit

Permalink
Populate metadata from mapserver providers
Browse files Browse the repository at this point in the history
  • Loading branch information
nyalldawson committed Jun 6, 2019
1 parent ec271ae commit 94bc003
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 4 deletions.
54 changes: 52 additions & 2 deletions src/providers/arcgisrest/qgsamsprovider.cpp
Expand Up @@ -170,8 +170,10 @@ QgsAmsProvider::QgsAmsProvider( const QString &uri, const ProviderOptions &optio

const QString authcfg = dataSource.authConfigId();

mServiceInfo = QgsArcGisRestUtils::getServiceInfo( dataSource.param( QStringLiteral( "url" ) ), authcfg, mErrorTitle, mError, mRequestHeaders );
mLayerInfo = QgsArcGisRestUtils::getLayerInfo( dataSource.param( QStringLiteral( "url" ) ) + "/" + dataSource.param( QStringLiteral( "layer" ) ), authcfg, mErrorTitle, mError, mRequestHeaders );
const QString serviceUrl = dataSource.param( QStringLiteral( "url" ) );
mServiceInfo = QgsArcGisRestUtils::getServiceInfo( serviceUrl, authcfg, mErrorTitle, mError, mRequestHeaders );
const QString layerUrl = dataSource.param( QStringLiteral( "url" ) ) + "/" + dataSource.param( QStringLiteral( "layer" ) );
mLayerInfo = QgsArcGisRestUtils::getLayerInfo( layerUrl, authcfg, mErrorTitle, mError, mRequestHeaders );

const QVariantMap extentData = mLayerInfo.value( QStringLiteral( "extent" ) ).toMap();
mExtent.setXMinimum( extentData[QStringLiteral( "xmin" )].toDouble() );
Expand All @@ -184,6 +186,15 @@ QgsAmsProvider::QgsAmsProvider( const QString &uri, const ProviderOptions &optio
appendError( QgsErrorMessage( tr( "Could not parse spatial reference" ), QStringLiteral( "AMSProvider" ) ) );
return;
}

QgsLayerMetadata::SpatialExtent spatialExtent;
spatialExtent.bounds = QgsBox3d( mExtent );
spatialExtent.extentCrs = mCrs;
QgsLayerMetadata::Extent metadataExtent;
metadataExtent.setSpatialExtents( QList< QgsLayerMetadata::SpatialExtent >() << spatialExtent );
mLayerMetadata.setExtent( metadataExtent );
mLayerMetadata.setCrs( mCrs );

mTiled = mServiceInfo.value( QStringLiteral( "singleFusedMapCache" ) ).toBool() && mCrs.mapUnits() == QgsUnitTypes::DistanceMeters;

const QVariantList subLayersList = mLayerInfo.value( QStringLiteral( "subLayers" ) ).toList();
Expand All @@ -196,6 +207,34 @@ QgsAmsProvider::QgsAmsProvider( const QString &uri, const ProviderOptions &optio

mTimestamp = QDateTime::currentDateTime();
mValid = true;

// layer metadata

mLayerMetadata.setIdentifier( layerUrl );
mLayerMetadata.setParentIdentifier( serviceUrl );
mLayerMetadata.setType( QStringLiteral( "dataset" ) );
mLayerMetadata.setTitle( mLayerInfo.value( QStringLiteral( "name" ) ).toString() );
mLayerMetadata.setAbstract( mLayerInfo.value( QStringLiteral( "description" ) ).toString() );
const QString copyright = mLayerInfo.value( QStringLiteral( "copyrightText" ) ).toString();
if ( !copyright.isEmpty() )
mLayerMetadata.setRights( QStringList() << copyright );
mLayerMetadata.addLink( QgsAbstractMetadataBase::Link( tr( "Source" ), QStringLiteral( "WWW:LINK" ), layerUrl ) );
const QVariantMap docInfo = mServiceInfo.value( QStringLiteral( "documentInfo" ) ).toMap();
const QStringList keywords = docInfo.value( QStringLiteral( "Keywords" ) ).toString().split( ',' );
if ( !keywords.empty() )
{
mLayerMetadata.addKeywords( QStringLiteral( "keywords" ), keywords );
}
const QString category = docInfo.value( QStringLiteral( "Category" ) ).toString();
if ( !category.isEmpty() )
mLayerMetadata.setCategories( QStringList() << category );
const QString author = docInfo.value( QStringLiteral( "Author" ) ).toString();
if ( !author.isEmpty() )
{
QgsAbstractMetadataBase::Contact contact( author );
contact.role = QStringLiteral( "author" );
mLayerMetadata.addContact( contact );
}
}

QgsAmsProvider::QgsAmsProvider( const QgsAmsProvider &other, const QgsDataProvider::ProviderOptions &providerOptions )
Expand All @@ -211,6 +250,7 @@ QgsAmsProvider::QgsAmsProvider( const QgsAmsProvider &other, const QgsDataProvid
, mSubLayerVisibilities( other.mSubLayerVisibilities )
, mRequestHeaders( other.mRequestHeaders )
, mTiled( other.mTiled )
, mLayerMetadata( other.mLayerMetadata )
// intentionally omitted:
// - mErrorTitle
// - mError
Expand All @@ -223,6 +263,11 @@ QgsAmsProvider::QgsAmsProvider( const QgsAmsProvider &other, const QgsDataProvid
mTimestamp = QDateTime::currentDateTime();
}

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

QStringList QgsAmsProvider::subLayerStyles() const
{
QStringList styles;
Expand Down Expand Up @@ -285,6 +330,11 @@ bool QgsAmsProvider::renderInPreview( const QgsDataProvider::PreviewContext &con
return QgsRasterDataProvider::renderInPreview( context );
}

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

QgsRasterInterface *QgsAmsProvider::clone() const
{
QgsDataProvider::ProviderOptions options;
Expand Down
6 changes: 4 additions & 2 deletions src/providers/arcgisrest/qgsamsprovider.h
Expand Up @@ -50,6 +50,7 @@ class QgsAmsLegendFetcher : public QgsImageFetcher
QImage mLegendImage;
QString mErrorTitle;
QString mError;

};

class QgsAmsProvider : public QgsRasterDataProvider
Expand All @@ -60,7 +61,7 @@ class QgsAmsProvider : public QgsRasterDataProvider
QgsAmsProvider( const QString &uri, const QgsDataProvider::ProviderOptions &providerOptions );

explicit QgsAmsProvider( const QgsAmsProvider &other, const QgsDataProvider::ProviderOptions &providerOptions );

QgsRasterDataProvider::ProviderCapabilities providerCapabilities() const;
/* Inherited from QgsDataProvider */
bool isValid() const override { return mValid; }
QString name() const override { return QStringLiteral( "mapserver" ); }
Expand All @@ -73,7 +74,7 @@ class QgsAmsProvider : public QgsRasterDataProvider
void setSubLayerVisibility( const QString &name, bool vis ) override;
void reloadData() override;
bool renderInPreview( const QgsDataProvider::PreviewContext &context ) override;

QgsLayerMetadata layerMetadata() const override;

/* Inherited from QgsRasterInterface */
int bandCount() const override { return 1; }
Expand Down Expand Up @@ -137,6 +138,7 @@ class QgsAmsProvider : public QgsRasterDataProvider
QgsStringMap mRequestHeaders;
int mTileReqNo = 0;
bool mTiled = false;
QgsLayerMetadata mLayerMetadata;
};

//! Handler for tiled MapServer requests, the data are written to the given image
Expand Down

0 comments on commit 94bc003

Please sign in to comment.