Skip to content

Commit f7559d3

Browse files
committedFeb 20, 2018
[afs] Auto populate layer metadata from provider metadata
1 parent 6a9f986 commit f7559d3

File tree

2 files changed

+55
-18
lines changed

2 files changed

+55
-18
lines changed
 

‎src/providers/arcgisrest/qgsafsprovider.cpp

Lines changed: 52 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -73,25 +73,43 @@ QgsAfsProvider::QgsAfsProvider( const QString &uri )
7373
if ( !xminOk || !yminOk || !xmaxOk || !ymaxOk )
7474
mSharedData->mExtent = QgsRectangle();
7575
}
76+
77+
QVariantMap layerExtentMap = layerData[QStringLiteral( "extent" )].toMap();
78+
bool xminOk = false, yminOk = false, xmaxOk = false, ymaxOk = false;
79+
QgsRectangle originalExtent;
80+
originalExtent.setXMinimum( layerExtentMap[QStringLiteral( "xmin" )].toDouble( &xminOk ) );
81+
originalExtent.setYMinimum( layerExtentMap[QStringLiteral( "ymin" )].toDouble( &yminOk ) );
82+
originalExtent.setXMaximum( layerExtentMap[QStringLiteral( "xmax" )].toDouble( &xmaxOk ) );
83+
originalExtent.setYMaximum( layerExtentMap[QStringLiteral( "ymax" )].toDouble( &ymaxOk ) );
84+
if ( mSharedData->mExtent.isEmpty() && ( !xminOk || !yminOk || !xmaxOk || !ymaxOk ) )
85+
{
86+
appendError( QgsErrorMessage( tr( "Could not retrieve layer extent" ), QStringLiteral( "AFSProvider" ) ) );
87+
return;
88+
}
89+
QgsCoordinateReferenceSystem extentCrs = QgsArcGisRestUtils::parseSpatialReference( layerExtentMap[QStringLiteral( "spatialReference" )].toMap() );
90+
if ( mSharedData->mExtent.isEmpty() && !extentCrs.isValid() )
91+
{
92+
appendError( QgsErrorMessage( tr( "Could not parse spatial reference" ), QStringLiteral( "AFSProvider" ) ) );
93+
return;
94+
}
95+
96+
if ( xminOk && yminOk && xmaxOk && ymaxOk )
97+
{
98+
QgsLayerMetadata::SpatialExtent spatialExtent;
99+
spatialExtent.bounds = QgsBox3d( originalExtent );
100+
spatialExtent.extentCrs = extentCrs;
101+
QgsLayerMetadata::Extent metadataExtent;
102+
metadataExtent.setSpatialExtents( QList< QgsLayerMetadata::SpatialExtent >() << spatialExtent );
103+
mLayerMetadata.setExtent( metadataExtent );
104+
}
105+
if ( extentCrs.isValid() )
106+
{
107+
mLayerMetadata.setCrs( extentCrs );
108+
}
109+
76110
if ( mSharedData->mExtent.isEmpty() )
77111
{
78-
QVariantMap layerExtentMap = layerData[QStringLiteral( "extent" )].toMap();
79-
bool xminOk = false, yminOk = false, xmaxOk = false, ymaxOk = false;
80-
mSharedData->mExtent.setXMinimum( layerExtentMap[QStringLiteral( "xmin" )].toDouble( &xminOk ) );
81-
mSharedData->mExtent.setYMinimum( layerExtentMap[QStringLiteral( "ymin" )].toDouble( &yminOk ) );
82-
mSharedData->mExtent.setXMaximum( layerExtentMap[QStringLiteral( "xmax" )].toDouble( &xmaxOk ) );
83-
mSharedData->mExtent.setYMaximum( layerExtentMap[QStringLiteral( "ymax" )].toDouble( &ymaxOk ) );
84-
if ( !xminOk || !yminOk || !xmaxOk || !ymaxOk )
85-
{
86-
appendError( QgsErrorMessage( tr( "Could not retrieve layer extent" ), QStringLiteral( "AFSProvider" ) ) );
87-
return;
88-
}
89-
QgsCoordinateReferenceSystem extentCrs = QgsArcGisRestUtils::parseSpatialReference( layerExtentMap[QStringLiteral( "spatialReference" )].toMap() );
90-
if ( !extentCrs.isValid() )
91-
{
92-
appendError( QgsErrorMessage( tr( "Could not parse spatial reference" ), QStringLiteral( "AFSProvider" ) ) );
93-
return;
94-
}
112+
mSharedData->mExtent = originalExtent;
95113
Q_NOWARN_DEPRECATED_PUSH
96114
mSharedData->mExtent = QgsCoordinateTransform( extentCrs, mSharedData->mSourceCRS ).transformBoundingBox( mSharedData->mExtent );
97115
Q_NOWARN_DEPRECATED_POP
@@ -172,6 +190,17 @@ QgsAfsProvider::QgsAfsProvider( const QString &uri )
172190
mSharedData->mObjectIds.append( objectId.toInt() );
173191
}
174192

193+
// layer metadata
194+
195+
mLayerMetadata.setIdentifier( mSharedData->mDataSource.param( QStringLiteral( "url" ) ) );
196+
mLayerMetadata.setType( QStringLiteral( "dataset" ) );
197+
mLayerMetadata.setAbstract( mLayerDescription );
198+
mLayerMetadata.setTitle( mLayerName );
199+
QString copyright = layerData[QStringLiteral( "copyrightText" )].toString();
200+
if ( !copyright.isEmpty() )
201+
mLayerMetadata.setRights( QStringList() << copyright );
202+
mLayerMetadata.addLink( QgsLayerMetadata::Link( tr( "Source" ), QStringLiteral( "WWW:LINK" ), mSharedData->mDataSource.param( QStringLiteral( "url" ) ) ) );
203+
175204
mValid = true;
176205
}
177206

@@ -200,9 +229,14 @@ QgsFields QgsAfsProvider::fields() const
200229
return mSharedData->mFields;
201230
}
202231

232+
QgsLayerMetadata QgsAfsProvider::layerMetadata() const
233+
{
234+
return mLayerMetadata;
235+
}
236+
203237
QgsVectorDataProvider::Capabilities QgsAfsProvider::capabilities() const
204238
{
205-
return QgsVectorDataProvider::SelectAtId;
239+
return QgsVectorDataProvider::SelectAtId | QgsVectorDataProvider::ReadLayerMetadata;
206240
}
207241

208242
void QgsAfsProvider::setDataSourceUri( const QString &uri )

‎src/providers/arcgisrest/qgsafsprovider.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include "qgscoordinatereferencesystem.h"
2626
#include "geometry/qgswkbtypes.h"
2727
#include "qgsfields.h"
28+
#include "qgslayermetadata.h"
2829

2930
/**
3031
* \brief A provider reading features from a ArcGIS Feature Service
@@ -44,6 +45,7 @@ class QgsAfsProvider : public QgsVectorDataProvider
4445
QgsWkbTypes::Type wkbType() const override;
4546
long featureCount() const override;
4647
QgsFields fields() const override;
48+
QgsLayerMetadata layerMetadata() const override;
4749
/* Read only for the moment
4850
bool addFeatures( QgsFeatureList &flist ) override{ return false; }
4951
bool deleteFeatures( const QgsFeatureIds &id ) override{ return false; }
@@ -75,6 +77,7 @@ class QgsAfsProvider : public QgsVectorDataProvider
7577
int mObjectIdFieldIdx;
7678
QString mLayerName;
7779
QString mLayerDescription;
80+
QgsLayerMetadata mLayerMetadata;
7881
};
7982

8083
#endif // QGSAFSPROVIDER_H

0 commit comments

Comments
 (0)
Please sign in to comment.