Skip to content

Commit fa947ea

Browse files
committedMar 22, 2023
Use separate provider metadata for each vector tile data provider
1 parent 2a6d6c0 commit fa947ea

10 files changed

+599
-25
lines changed
 

‎src/core/providers/qgsproviderregistry.cpp

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@
3333
#include "providers/ogr/qgsogrprovider.h"
3434
#include "providers/meshmemory/qgsmeshmemorydataprovider.h"
3535

36+
#include "qgsmbtilesvectortiledataprovider.h"
37+
#include "qgsarcgisvectortileservicedataprovider.h"
38+
#include "qgsxyzvectortiledataprovider.h"
39+
#include "qgsvtpkvectortiledataprovider.h"
40+
3641
#ifdef HAVE_EPT
3742
#include "providers/ept/qgseptprovider.h"
3843
#endif
@@ -187,9 +192,17 @@ void QgsProviderRegistry::init()
187192
mProviders[ QgsOgrProvider::providerKey() ] = new QgsOgrProviderMetadata();
188193
}
189194
{
190-
const QgsScopedRuntimeProfile profile( QObject::tr( "Create vector tile provider" ) );
195+
const QgsScopedRuntimeProfile profile( QObject::tr( "Create vector tile providers" ) );
191196
QgsProviderMetadata *vt = new QgsVectorTileProviderMetadata();
192197
mProviders[ vt->key() ] = vt;
198+
vt = new QgsXyzVectorTileDataProviderMetadata();
199+
mProviders[ vt->key() ] = vt;
200+
vt = new QgsVtpkVectorTileDataProviderMetadata();
201+
mProviders[ vt->key() ] = vt;
202+
vt = new QgsArcGisVectorTileServiceDataProviderMetadata();
203+
mProviders[ vt->key() ] = vt;
204+
vt = new QgsMbTilesVectorTileDataProviderMetadata();
205+
mProviders[ vt->key() ] = vt;
193206
}
194207
#ifdef HAVE_EPT
195208
{

‎src/core/vectortile/qgsarcgisvectortileservicedataprovider.cpp

Lines changed: 113 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,15 @@
1515

1616
#include "qgsarcgisvectortileservicedataprovider.h"
1717
#include "qgsthreadingutils.h"
18+
#include "qgsapplication.h"
19+
#include <QIcon>
1820

1921
///@cond PRIVATE
2022

23+
QString QgsArcGisVectorTileServiceDataProvider::DATA_PROVIDER_KEY = QStringLiteral( "arcgisvectortileservice" );
24+
QString QgsArcGisVectorTileServiceDataProvider::DATA_PROVIDER_DESCRIPTION = QObject::tr( "ArcGIS Vector Tile Service data provider" );
25+
26+
2127
QgsArcGisVectorTileServiceDataProvider::QgsArcGisVectorTileServiceDataProvider( const QString &uri, const QString &sourcePath, const ProviderOptions &providerOptions, ReadFlags flags )
2228
: QgsXyzVectorTileDataProvider( uri, providerOptions, flags )
2329
, mSourcePath( sourcePath )
@@ -29,14 +35,14 @@ QString QgsArcGisVectorTileServiceDataProvider::name() const
2935
{
3036
QGIS_PROTECT_QOBJECT_THREAD_ACCESS
3137

32-
return QStringLiteral( "arcgisvectortileservice" );
38+
return DATA_PROVIDER_KEY;
3339
}
3440

3541
QString QgsArcGisVectorTileServiceDataProvider::description() const
3642
{
3743
QGIS_PROTECT_QOBJECT_THREAD_ACCESS
3844

39-
return tr( "ArcGIS Vector Tile Service" );
45+
return DATA_PROVIDER_DESCRIPTION;
4046
}
4147

4248
QgsVectorTileDataProvider *QgsArcGisVectorTileServiceDataProvider::clone() const
@@ -62,6 +68,111 @@ bool QgsArcGisVectorTileServiceDataProvider::isValid() const
6268
return true;
6369
}
6470

71+
72+
//
73+
// QgsArcGisVectorTileServiceDataProviderMetadata
74+
//
75+
76+
QgsArcGisVectorTileServiceDataProviderMetadata::QgsArcGisVectorTileServiceDataProviderMetadata()
77+
: QgsProviderMetadata( QgsArcGisVectorTileServiceDataProvider::DATA_PROVIDER_KEY, QgsArcGisVectorTileServiceDataProvider::DATA_PROVIDER_DESCRIPTION )
78+
{
79+
}
80+
81+
QIcon QgsArcGisVectorTileServiceDataProviderMetadata::icon() const
82+
{
83+
return QgsApplication::getThemeIcon( QStringLiteral( "mIconVectorTileLayer.svg" ) );
84+
}
85+
86+
QgsProviderMetadata::ProviderCapabilities QgsArcGisVectorTileServiceDataProviderMetadata::providerCapabilities() const
87+
{
88+
return QgsProviderMetadata::ProviderCapabilities();
89+
}
90+
91+
QVariantMap QgsArcGisVectorTileServiceDataProviderMetadata::decodeUri( const QString &uri ) const
92+
{
93+
// TODO -- carefully thin out options which don't apply to arcgis vector tile services
94+
95+
QgsDataSourceUri dsUri;
96+
dsUri.setEncodedUri( uri );
97+
98+
QVariantMap uriComponents;
99+
uriComponents.insert( QStringLiteral( "type" ), dsUri.param( QStringLiteral( "type" ) ) );
100+
if ( dsUri.hasParam( QStringLiteral( "serviceType" ) ) )
101+
uriComponents.insert( QStringLiteral( "serviceType" ), dsUri.param( QStringLiteral( "serviceType" ) ) );
102+
103+
if ( uriComponents[ QStringLiteral( "type" ) ] == QLatin1String( "mbtiles" ) ||
104+
( uriComponents[ QStringLiteral( "type" ) ] == QLatin1String( "xyz" ) &&
105+
!dsUri.param( QStringLiteral( "url" ) ).startsWith( QLatin1String( "http" ) ) ) )
106+
{
107+
uriComponents.insert( QStringLiteral( "path" ), dsUri.param( QStringLiteral( "url" ) ) );
108+
}
109+
else
110+
{
111+
uriComponents.insert( QStringLiteral( "url" ), dsUri.param( QStringLiteral( "url" ) ) );
112+
}
113+
114+
if ( dsUri.hasParam( QStringLiteral( "zmin" ) ) )
115+
uriComponents.insert( QStringLiteral( "zmin" ), dsUri.param( QStringLiteral( "zmin" ) ) );
116+
if ( dsUri.hasParam( QStringLiteral( "zmax" ) ) )
117+
uriComponents.insert( QStringLiteral( "zmax" ), dsUri.param( QStringLiteral( "zmax" ) ) );
118+
119+
dsUri.httpHeaders().updateMap( uriComponents );
120+
121+
if ( dsUri.hasParam( QStringLiteral( "styleUrl" ) ) )
122+
uriComponents.insert( QStringLiteral( "styleUrl" ), dsUri.param( QStringLiteral( "styleUrl" ) ) );
123+
124+
const QString authcfg = dsUri.authConfigId();
125+
if ( !authcfg.isEmpty() )
126+
uriComponents.insert( QStringLiteral( "authcfg" ), authcfg );
127+
128+
return uriComponents;
129+
}
130+
131+
QString QgsArcGisVectorTileServiceDataProviderMetadata::encodeUri( const QVariantMap &parts ) const
132+
{
133+
// TODO -- carefully thin out options which don't apply to arcgis vector tile services
134+
135+
QgsDataSourceUri dsUri;
136+
dsUri.setParam( QStringLiteral( "type" ), parts.value( QStringLiteral( "type" ) ).toString() );
137+
if ( parts.contains( QStringLiteral( "serviceType" ) ) )
138+
dsUri.setParam( QStringLiteral( "serviceType" ), parts[ QStringLiteral( "serviceType" ) ].toString() );
139+
dsUri.setParam( QStringLiteral( "url" ), parts.value( parts.contains( QStringLiteral( "path" ) ) ? QStringLiteral( "path" ) : QStringLiteral( "url" ) ).toString() );
140+
141+
if ( parts.contains( QStringLiteral( "zmin" ) ) )
142+
dsUri.setParam( QStringLiteral( "zmin" ), parts[ QStringLiteral( "zmin" ) ].toString() );
143+
if ( parts.contains( QStringLiteral( "zmax" ) ) )
144+
dsUri.setParam( QStringLiteral( "zmax" ), parts[ QStringLiteral( "zmax" ) ].toString() );
145+
146+
dsUri.httpHeaders().setFromMap( parts );
147+
148+
if ( parts.contains( QStringLiteral( "styleUrl" ) ) )
149+
dsUri.setParam( QStringLiteral( "styleUrl" ), parts[ QStringLiteral( "styleUrl" ) ].toString() );
150+
151+
if ( parts.contains( QStringLiteral( "authcfg" ) ) )
152+
dsUri.setAuthConfigId( parts[ QStringLiteral( "authcfg" ) ].toString() );
153+
154+
return dsUri.encodedUri();
155+
}
156+
157+
QString QgsArcGisVectorTileServiceDataProviderMetadata::absoluteToRelativeUri( const QString &uri, const QgsReadWriteContext & ) const
158+
{
159+
QgsDataSourceUri dsUri;
160+
dsUri.setEncodedUri( uri );
161+
return uri;
162+
}
163+
164+
QString QgsArcGisVectorTileServiceDataProviderMetadata::relativeToAbsoluteUri( const QString &uri, const QgsReadWriteContext & ) const
165+
{
166+
QgsDataSourceUri dsUri;
167+
dsUri.setEncodedUri( uri );
168+
return uri;
169+
}
170+
171+
QList<Qgis::LayerType> QgsArcGisVectorTileServiceDataProviderMetadata::supportedLayerTypes() const
172+
{
173+
return { Qgis::LayerType::VectorTile };
174+
}
175+
65176
///@endcond
66177

67178

‎src/core/vectortile/qgsarcgisvectortileservicedataprovider.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "qgis_core.h"
2020
#include "qgis_sip.h"
2121
#include "qgsxyzvectortiledataprovider.h"
22+
#include "qgsprovidermetadata.h"
2223

2324
#define SIP_NO_FILE
2425

@@ -34,15 +35,34 @@ class CORE_EXPORT QgsArcGisVectorTileServiceDataProvider : public QgsXyzVectorTi
3435
const QgsDataProvider::ProviderOptions &providerOptions,
3536
QgsDataProvider::ReadFlags flags );
3637
QString name() const override;
38+
QString description() const override;
3739
QgsVectorTileDataProvider *clone() const override;
3840
QString sourcePath() const override;
3941
bool isValid() const override;
4042

43+
static QString DATA_PROVIDER_KEY;
44+
static QString DATA_PROVIDER_DESCRIPTION;
45+
4146
private:
4247

4348
QString mSourcePath;
4449
};
4550

51+
52+
class QgsArcGisVectorTileServiceDataProviderMetadata : public QgsProviderMetadata
53+
{
54+
Q_OBJECT
55+
public:
56+
QgsArcGisVectorTileServiceDataProviderMetadata();
57+
QIcon icon() const override;
58+
ProviderCapabilities providerCapabilities() const override;
59+
QVariantMap decodeUri( const QString &uri ) const override;
60+
QString encodeUri( const QVariantMap &parts ) const override;
61+
QString absoluteToRelativeUri( const QString &uri, const QgsReadWriteContext &context ) const override;
62+
QString relativeToAbsoluteUri( const QString &uri, const QgsReadWriteContext &context ) const override;
63+
QList< Qgis::LayerType > supportedLayerTypes() const override;
64+
};
65+
4666
///@endcond
4767

4868
#endif // QGSARCGISVECTORTILESERVICEDATAPROVIDER_H

‎src/core/vectortile/qgsmbtilesvectortiledataprovider.cpp

Lines changed: 127 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,14 @@
2020
#include "qgsvectortileloader.h"
2121
#include "qgsziputils.h"
2222
#include "qgslogger.h"
23+
#include "qgsapplication.h"
24+
#include <QIcon>
2325

2426
///@cond PRIVATE
2527

28+
QString QgsMbTilesVectorTileDataProvider::MB_TILES_VECTOR_TILE_DATA_PROVIDER_KEY = QStringLiteral( "mbtilesvectortiles" );
29+
QString QgsMbTilesVectorTileDataProvider::MB_TILES_VECTOR_TILE_DATA_PROVIDER_DESCRIPTION = QObject::tr( "MBTile Vector Tiles data provider" );
30+
2631
QgsMbTilesVectorTileDataProvider::QgsMbTilesVectorTileDataProvider( const QString &uri, const ProviderOptions &providerOptions, ReadFlags flags )
2732
: QgsVectorTileDataProvider( uri, providerOptions, flags )
2833
{
@@ -33,14 +38,14 @@ QString QgsMbTilesVectorTileDataProvider::name() const
3338
{
3439
QGIS_PROTECT_QOBJECT_THREAD_ACCESS
3540

36-
return QStringLiteral( "mbtilesvectortiles" );
41+
return MB_TILES_VECTOR_TILE_DATA_PROVIDER_KEY;
3742
}
3843

3944
QString QgsMbTilesVectorTileDataProvider::description() const
4045
{
4146
QGIS_PROTECT_QOBJECT_THREAD_ACCESS
4247

43-
return tr( "MBTile Vector Tiles data provider" );
48+
return MB_TILES_VECTOR_TILE_DATA_PROVIDER_DESCRIPTION;
4449
}
4550

4651
QgsVectorTileDataProvider *QgsMbTilesVectorTileDataProvider::clone() const
@@ -136,6 +141,126 @@ QByteArray QgsMbTilesVectorTileDataProvider::loadFromMBTiles( QgsMbTiles &mbTile
136141
QgsDebugMsgLevel( QStringLiteral( "Tile blob size %1 -> uncompressed size %2" ).arg( gzippedTileData.size() ).arg( data.size() ), 2 );
137142
return data;
138143
}
144+
145+
146+
//
147+
// QgsMbTilesVectorTileDataProviderMetadata
148+
//
149+
150+
QgsMbTilesVectorTileDataProviderMetadata::QgsMbTilesVectorTileDataProviderMetadata()
151+
: QgsProviderMetadata( QgsMbTilesVectorTileDataProvider::MB_TILES_VECTOR_TILE_DATA_PROVIDER_KEY,
152+
QgsMbTilesVectorTileDataProvider::MB_TILES_VECTOR_TILE_DATA_PROVIDER_DESCRIPTION )
153+
{
154+
}
155+
156+
QIcon QgsMbTilesVectorTileDataProviderMetadata::icon() const
157+
{
158+
return QgsApplication::getThemeIcon( QStringLiteral( "mIconVectorTileLayer.svg" ) );
159+
}
160+
161+
QgsProviderMetadata::ProviderCapabilities QgsMbTilesVectorTileDataProviderMetadata::providerCapabilities() const
162+
{
163+
return FileBasedUris;
164+
}
165+
166+
QVariantMap QgsMbTilesVectorTileDataProviderMetadata::decodeUri( const QString &uri ) const
167+
{
168+
// TODO -- carefully thin out options which don't apply to mbtiles
169+
170+
QgsDataSourceUri dsUri;
171+
dsUri.setEncodedUri( uri );
172+
173+
QVariantMap uriComponents;
174+
uriComponents.insert( QStringLiteral( "type" ), dsUri.param( QStringLiteral( "type" ) ) );
175+
if ( dsUri.hasParam( QStringLiteral( "serviceType" ) ) )
176+
uriComponents.insert( QStringLiteral( "serviceType" ), dsUri.param( QStringLiteral( "serviceType" ) ) );
177+
178+
if ( uriComponents[ QStringLiteral( "type" ) ] == QLatin1String( "mbtiles" ) ||
179+
( uriComponents[ QStringLiteral( "type" ) ] == QLatin1String( "xyz" ) &&
180+
!dsUri.param( QStringLiteral( "url" ) ).startsWith( QLatin1String( "http" ) ) ) )
181+
{
182+
uriComponents.insert( QStringLiteral( "path" ), dsUri.param( QStringLiteral( "url" ) ) );
183+
}
184+
else
185+
{
186+
uriComponents.insert( QStringLiteral( "url" ), dsUri.param( QStringLiteral( "url" ) ) );
187+
}
188+
189+
if ( dsUri.hasParam( QStringLiteral( "zmin" ) ) )
190+
uriComponents.insert( QStringLiteral( "zmin" ), dsUri.param( QStringLiteral( "zmin" ) ) );
191+
if ( dsUri.hasParam( QStringLiteral( "zmax" ) ) )
192+
uriComponents.insert( QStringLiteral( "zmax" ), dsUri.param( QStringLiteral( "zmax" ) ) );
193+
194+
dsUri.httpHeaders().updateMap( uriComponents );
195+
196+
if ( dsUri.hasParam( QStringLiteral( "styleUrl" ) ) )
197+
uriComponents.insert( QStringLiteral( "styleUrl" ), dsUri.param( QStringLiteral( "styleUrl" ) ) );
198+
199+
const QString authcfg = dsUri.authConfigId();
200+
if ( !authcfg.isEmpty() )
201+
uriComponents.insert( QStringLiteral( "authcfg" ), authcfg );
202+
203+
return uriComponents;
204+
}
205+
206+
QString QgsMbTilesVectorTileDataProviderMetadata::encodeUri( const QVariantMap &parts ) const
207+
{
208+
// TODO -- carefully thin out options which don't apply to mbtiles
209+
210+
QgsDataSourceUri dsUri;
211+
dsUri.setParam( QStringLiteral( "type" ), parts.value( QStringLiteral( "type" ) ).toString() );
212+
if ( parts.contains( QStringLiteral( "serviceType" ) ) )
213+
dsUri.setParam( QStringLiteral( "serviceType" ), parts[ QStringLiteral( "serviceType" ) ].toString() );
214+
dsUri.setParam( QStringLiteral( "url" ), parts.value( parts.contains( QStringLiteral( "path" ) ) ? QStringLiteral( "path" ) : QStringLiteral( "url" ) ).toString() );
215+
216+
if ( parts.contains( QStringLiteral( "zmin" ) ) )
217+
dsUri.setParam( QStringLiteral( "zmin" ), parts[ QStringLiteral( "zmin" ) ].toString() );
218+
if ( parts.contains( QStringLiteral( "zmax" ) ) )
219+
dsUri.setParam( QStringLiteral( "zmax" ), parts[ QStringLiteral( "zmax" ) ].toString() );
220+
221+
dsUri.httpHeaders().setFromMap( parts );
222+
223+
if ( parts.contains( QStringLiteral( "styleUrl" ) ) )
224+
dsUri.setParam( QStringLiteral( "styleUrl" ), parts[ QStringLiteral( "styleUrl" ) ].toString() );
225+
226+
if ( parts.contains( QStringLiteral( "authcfg" ) ) )
227+
dsUri.setAuthConfigId( parts[ QStringLiteral( "authcfg" ) ].toString() );
228+
229+
return dsUri.encodedUri();
230+
}
231+
232+
QString QgsMbTilesVectorTileDataProviderMetadata::absoluteToRelativeUri( const QString &uri, const QgsReadWriteContext &context ) const
233+
{
234+
QgsDataSourceUri dsUri;
235+
dsUri.setEncodedUri( uri );
236+
237+
QString sourcePath = dsUri.param( QStringLiteral( "url" ) );
238+
239+
sourcePath = context.pathResolver().writePath( sourcePath );
240+
dsUri.removeParam( QStringLiteral( "url" ) ); // needed because setParam() would insert second "url" key
241+
dsUri.setParam( QStringLiteral( "url" ), sourcePath );
242+
return dsUri.encodedUri();
243+
}
244+
245+
QString QgsMbTilesVectorTileDataProviderMetadata::relativeToAbsoluteUri( const QString &uri, const QgsReadWriteContext &context ) const
246+
{
247+
QgsDataSourceUri dsUri;
248+
dsUri.setEncodedUri( uri );
249+
250+
QString sourcePath = dsUri.param( QStringLiteral( "url" ) );
251+
252+
sourcePath = context.pathResolver().readPath( sourcePath );
253+
dsUri.removeParam( QStringLiteral( "url" ) ); // needed because setParam() would insert second "url" key
254+
dsUri.setParam( QStringLiteral( "url" ), sourcePath );
255+
return dsUri.encodedUri();
256+
}
257+
258+
QList<Qgis::LayerType> QgsMbTilesVectorTileDataProviderMetadata::supportedLayerTypes() const
259+
{
260+
return { Qgis::LayerType::VectorTile };
261+
}
262+
263+
139264
///@endcond
140265

141266

‎src/core/vectortile/qgsmbtilesvectortiledataprovider.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "qgis_core.h"
2020
#include "qgis_sip.h"
2121
#include "qgsvectortiledataprovider.h"
22+
#include "qgsprovidermetadata.h"
2223

2324
class QgsMbTiles;
2425

@@ -44,13 +45,31 @@ class CORE_EXPORT QgsMbTilesVectorTileDataProvider : public QgsVectorTileDataPro
4445
QByteArray readTile( const QgsTileMatrix &tileMatrix, const QgsTileXYZ &id, QgsFeedback *feedback = nullptr ) const override;
4546
QList<QgsVectorTileRawData> readTiles( const QgsTileMatrix &, const QVector<QgsTileXYZ> &tiles, QgsFeedback *feedback = nullptr ) const override;
4647

48+
static QString MB_TILES_VECTOR_TILE_DATA_PROVIDER_KEY;
49+
static QString MB_TILES_VECTOR_TILE_DATA_PROVIDER_DESCRIPTION;
50+
4751
private:
4852

4953
//! Returns raw tile data for a single tile loaded from MBTiles file
5054
static QByteArray loadFromMBTiles( QgsMbTiles &mbTileReader, const QgsTileXYZ &id, QgsFeedback *feedback = nullptr );
5155

5256
};
5357

58+
class QgsMbTilesVectorTileDataProviderMetadata : public QgsProviderMetadata
59+
{
60+
Q_OBJECT
61+
public:
62+
QgsMbTilesVectorTileDataProviderMetadata();
63+
QIcon icon() const override;
64+
ProviderCapabilities providerCapabilities() const override;
65+
QVariantMap decodeUri( const QString &uri ) const override;
66+
QString encodeUri( const QVariantMap &parts ) const override;
67+
QString absoluteToRelativeUri( const QString &uri, const QgsReadWriteContext &context ) const override;
68+
QString relativeToAbsoluteUri( const QString &uri, const QgsReadWriteContext &context ) const override;
69+
QList< Qgis::LayerType > supportedLayerTypes() const override;
70+
};
71+
72+
5473
///@endcond
5574

5675
#endif // QGSMBTILESVECTORTILEDATAPROVIDER_H

‎src/core/vectortile/qgsvectortiledataprovider.cpp

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -25,20 +25,6 @@ QgsVectorTileDataProvider::QgsVectorTileDataProvider(
2525
: QgsDataProvider( uri, options, flags )
2626
{}
2727

28-
QString QgsVectorTileDataProvider::name() const
29-
{
30-
QGIS_PROTECT_QOBJECT_THREAD_ACCESS
31-
32-
return QStringLiteral( "vectortile" );
33-
}
34-
35-
QString QgsVectorTileDataProvider::description() const
36-
{
37-
QGIS_PROTECT_QOBJECT_THREAD_ACCESS
38-
39-
return QString();
40-
}
41-
4228
QgsRectangle QgsVectorTileDataProvider::extent() const
4329
{
4430
QGIS_PROTECT_QOBJECT_THREAD_ACCESS

‎src/core/vectortile/qgsvtpkvectortiledataprovider.cpp

Lines changed: 128 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,17 @@
1717
#include "qgsthreadingutils.h"
1818
#include "qgsvtpktiles.h"
1919
#include "qgsvectortileloader.h"
20+
#include "qgsapplication.h"
21+
22+
#include <QIcon>
2023

2124
///@cond PRIVATE
2225

26+
27+
QString QgsVtpkVectorTileDataProvider::DATA_PROVIDER_KEY = QStringLiteral( "vtpkvectortiles" );
28+
QString QgsVtpkVectorTileDataProvider::DATA_PROVIDER_DESCRIPTION = QObject::tr( "VTPK Vector Tiles data provider" );
29+
30+
2331
QgsVtpkVectorTileDataProvider::QgsVtpkVectorTileDataProvider( const QString &uri, const ProviderOptions &providerOptions, ReadFlags flags )
2432
: QgsVectorTileDataProvider( uri, providerOptions, flags )
2533
{
@@ -30,14 +38,14 @@ QString QgsVtpkVectorTileDataProvider::name() const
3038
{
3139
QGIS_PROTECT_QOBJECT_THREAD_ACCESS
3240

33-
return QStringLiteral( "vtpkvectortiles" );
41+
return DATA_PROVIDER_KEY;
3442
}
3543

3644
QString QgsVtpkVectorTileDataProvider::description() const
3745
{
3846
QGIS_PROTECT_QOBJECT_THREAD_ACCESS
3947

40-
return tr( "VTPK Vector Tiles data provider" );
48+
return DATA_PROVIDER_DESCRIPTION;
4149
}
4250

4351
QgsVectorTileDataProvider *QgsVtpkVectorTileDataProvider::clone() const
@@ -119,6 +127,124 @@ QByteArray QgsVtpkVectorTileDataProvider::loadFromVtpk( QgsVtpkTiles &vtpkTileRe
119127
return tileData;
120128
}
121129

130+
131+
//
132+
// QgsVtpkVectorTileDataProviderMetadata
133+
//
134+
135+
QgsVtpkVectorTileDataProviderMetadata::QgsVtpkVectorTileDataProviderMetadata()
136+
: QgsProviderMetadata( QgsVtpkVectorTileDataProvider::DATA_PROVIDER_KEY, QgsVtpkVectorTileDataProvider::DATA_PROVIDER_DESCRIPTION )
137+
{
138+
}
139+
140+
QIcon QgsVtpkVectorTileDataProviderMetadata::icon() const
141+
{
142+
return QgsApplication::getThemeIcon( QStringLiteral( "mIconVectorTileLayer.svg" ) );
143+
}
144+
145+
QgsProviderMetadata::ProviderCapabilities QgsVtpkVectorTileDataProviderMetadata::providerCapabilities() const
146+
{
147+
return FileBasedUris;
148+
}
149+
150+
QVariantMap QgsVtpkVectorTileDataProviderMetadata::decodeUri( const QString &uri ) const
151+
{
152+
// TODO -- carefully thin out options which don't apply to vtpk
153+
154+
QgsDataSourceUri dsUri;
155+
dsUri.setEncodedUri( uri );
156+
157+
QVariantMap uriComponents;
158+
uriComponents.insert( QStringLiteral( "type" ), dsUri.param( QStringLiteral( "type" ) ) );
159+
if ( dsUri.hasParam( QStringLiteral( "serviceType" ) ) )
160+
uriComponents.insert( QStringLiteral( "serviceType" ), dsUri.param( QStringLiteral( "serviceType" ) ) );
161+
162+
if ( uriComponents[ QStringLiteral( "type" ) ] == QLatin1String( "mbtiles" ) ||
163+
( uriComponents[ QStringLiteral( "type" ) ] == QLatin1String( "xyz" ) &&
164+
!dsUri.param( QStringLiteral( "url" ) ).startsWith( QLatin1String( "http" ) ) ) )
165+
{
166+
uriComponents.insert( QStringLiteral( "path" ), dsUri.param( QStringLiteral( "url" ) ) );
167+
}
168+
else
169+
{
170+
uriComponents.insert( QStringLiteral( "url" ), dsUri.param( QStringLiteral( "url" ) ) );
171+
}
172+
173+
if ( dsUri.hasParam( QStringLiteral( "zmin" ) ) )
174+
uriComponents.insert( QStringLiteral( "zmin" ), dsUri.param( QStringLiteral( "zmin" ) ) );
175+
if ( dsUri.hasParam( QStringLiteral( "zmax" ) ) )
176+
uriComponents.insert( QStringLiteral( "zmax" ), dsUri.param( QStringLiteral( "zmax" ) ) );
177+
178+
dsUri.httpHeaders().updateMap( uriComponents );
179+
180+
if ( dsUri.hasParam( QStringLiteral( "styleUrl" ) ) )
181+
uriComponents.insert( QStringLiteral( "styleUrl" ), dsUri.param( QStringLiteral( "styleUrl" ) ) );
182+
183+
const QString authcfg = dsUri.authConfigId();
184+
if ( !authcfg.isEmpty() )
185+
uriComponents.insert( QStringLiteral( "authcfg" ), authcfg );
186+
187+
return uriComponents;
188+
}
189+
190+
QString QgsVtpkVectorTileDataProviderMetadata::encodeUri( const QVariantMap &parts ) const
191+
{
192+
// TODO -- carefully thin out options which don't apply to vtpk
193+
194+
QgsDataSourceUri dsUri;
195+
dsUri.setParam( QStringLiteral( "type" ), parts.value( QStringLiteral( "type" ) ).toString() );
196+
if ( parts.contains( QStringLiteral( "serviceType" ) ) )
197+
dsUri.setParam( QStringLiteral( "serviceType" ), parts[ QStringLiteral( "serviceType" ) ].toString() );
198+
dsUri.setParam( QStringLiteral( "url" ), parts.value( parts.contains( QStringLiteral( "path" ) ) ? QStringLiteral( "path" ) : QStringLiteral( "url" ) ).toString() );
199+
200+
if ( parts.contains( QStringLiteral( "zmin" ) ) )
201+
dsUri.setParam( QStringLiteral( "zmin" ), parts[ QStringLiteral( "zmin" ) ].toString() );
202+
if ( parts.contains( QStringLiteral( "zmax" ) ) )
203+
dsUri.setParam( QStringLiteral( "zmax" ), parts[ QStringLiteral( "zmax" ) ].toString() );
204+
205+
dsUri.httpHeaders().setFromMap( parts );
206+
207+
if ( parts.contains( QStringLiteral( "styleUrl" ) ) )
208+
dsUri.setParam( QStringLiteral( "styleUrl" ), parts[ QStringLiteral( "styleUrl" ) ].toString() );
209+
210+
if ( parts.contains( QStringLiteral( "authcfg" ) ) )
211+
dsUri.setAuthConfigId( parts[ QStringLiteral( "authcfg" ) ].toString() );
212+
213+
return dsUri.encodedUri();
214+
}
215+
216+
QString QgsVtpkVectorTileDataProviderMetadata::absoluteToRelativeUri( const QString &uri, const QgsReadWriteContext &context ) const
217+
{
218+
QgsDataSourceUri dsUri;
219+
dsUri.setEncodedUri( uri );
220+
221+
QString sourcePath = dsUri.param( QStringLiteral( "url" ) );
222+
223+
sourcePath = context.pathResolver().writePath( sourcePath );
224+
dsUri.removeParam( QStringLiteral( "url" ) ); // needed because setParam() would insert second "url" key
225+
dsUri.setParam( QStringLiteral( "url" ), sourcePath );
226+
return dsUri.encodedUri();
227+
}
228+
229+
QString QgsVtpkVectorTileDataProviderMetadata::relativeToAbsoluteUri( const QString &uri, const QgsReadWriteContext &context ) const
230+
{
231+
QgsDataSourceUri dsUri;
232+
dsUri.setEncodedUri( uri );
233+
234+
QString sourcePath = dsUri.param( QStringLiteral( "url" ) );
235+
236+
sourcePath = context.pathResolver().readPath( sourcePath );
237+
dsUri.removeParam( QStringLiteral( "url" ) ); // needed because setParam() would insert second "url" key
238+
dsUri.setParam( QStringLiteral( "url" ), sourcePath );
239+
return dsUri.encodedUri();
240+
}
241+
242+
QList<Qgis::LayerType> QgsVtpkVectorTileDataProviderMetadata::supportedLayerTypes() const
243+
{
244+
return { Qgis::LayerType::VectorTile };
245+
}
246+
247+
122248
///@endcond
123249

124250

‎src/core/vectortile/qgsvtpkvectortiledataprovider.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "qgis_core.h"
2020
#include "qgis_sip.h"
2121
#include "qgsvectortiledataprovider.h"
22+
#include "qgsprovidermetadata.h"
2223

2324
#define SIP_NO_FILE
2425

@@ -36,20 +37,40 @@ class CORE_EXPORT QgsVtpkVectorTileDataProvider : public QgsVectorTileDataProvid
3637
QgsDataProvider::ReadFlags flags );
3738

3839
QString name() const override;
40+
QString description() const override;
3941
QgsVectorTileDataProvider *clone() const override;
4042
QString sourcePath() const override;
4143
bool isValid() const override;
4244
QgsCoordinateReferenceSystem crs() const override;
4345
QByteArray readTile( const QgsTileMatrix &tileMatrix, const QgsTileXYZ &id, QgsFeedback *feedback = nullptr ) const override;
4446
QList<QgsVectorTileRawData> readTiles( const QgsTileMatrix &, const QVector<QgsTileXYZ> &tiles, QgsFeedback *feedback = nullptr ) const override;
4547

48+
static QString DATA_PROVIDER_KEY;
49+
static QString DATA_PROVIDER_DESCRIPTION;
50+
4651
private:
4752

4853
//! Returns raw tile data for a single tile loaded from VTPK file
4954
static QByteArray loadFromVtpk( QgsVtpkTiles &vtpkTileReader, const QgsTileXYZ &id, QgsFeedback *feedback = nullptr );
5055

5156
};
5257

58+
59+
class QgsVtpkVectorTileDataProviderMetadata : public QgsProviderMetadata
60+
{
61+
Q_OBJECT
62+
public:
63+
QgsVtpkVectorTileDataProviderMetadata();
64+
QIcon icon() const override;
65+
ProviderCapabilities providerCapabilities() const override;
66+
QVariantMap decodeUri( const QString &uri ) const override;
67+
QString encodeUri( const QVariantMap &parts ) const override;
68+
QString absoluteToRelativeUri( const QString &uri, const QgsReadWriteContext &context ) const override;
69+
QString relativeToAbsoluteUri( const QString &uri, const QgsReadWriteContext &context ) const override;
70+
QList< Qgis::LayerType > supportedLayerTypes() const override;
71+
};
72+
73+
5374
///@endcond
5475

5576
#endif // QGSVTPKVECTORTILEDATAPROVIDER_H

‎src/core/vectortile/qgsxyzvectortiledataprovider.cpp

Lines changed: 136 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,14 @@
2424
#include "qgsmessagelog.h"
2525
#include "qgsblockingnetworkrequest.h"
2626
#include "qgslogger.h"
27-
27+
#include <QIcon>
2828
#include <QNetworkRequest>
2929

3030
///@cond PRIVATE
3131

32+
QString QgsXyzVectorTileDataProvider::DATA_PROVIDER_KEY = QStringLiteral( "xyzvectortiles" );
33+
QString QgsXyzVectorTileDataProvider::DATA_PROVIDER_DESCRIPTION = QObject::tr( "XYZ Vector Tiles data provider" );
34+
3235
QgsXyzVectorTileDataProvider::QgsXyzVectorTileDataProvider( const QString &uri, const ProviderOptions &providerOptions, ReadFlags flags )
3336
: QgsVectorTileDataProvider( uri, providerOptions, flags )
3437
{
@@ -43,15 +46,14 @@ QString QgsXyzVectorTileDataProvider::name() const
4346
{
4447
QGIS_PROTECT_QOBJECT_THREAD_ACCESS
4548

46-
return QStringLiteral( "xyzvectortiles" );
49+
return DATA_PROVIDER_KEY;
4750
}
4851

4952
QString QgsXyzVectorTileDataProvider::description() const
5053
{
5154
QGIS_PROTECT_QOBJECT_THREAD_ACCESS
5255

53-
return tr( "XYZ Vector Tiles data provider" );
54-
56+
return DATA_PROVIDER_DESCRIPTION;
5557
}
5658

5759
QgsVectorTileDataProvider *QgsXyzVectorTileDataProvider::clone() const
@@ -180,6 +182,136 @@ QByteArray QgsXyzVectorTileDataProvider::loadFromNetwork( const QgsTileXYZ &id,
180182
return reply.content();
181183
}
182184

185+
186+
//
187+
// QgsXyzVectorTileDataProviderMetadata
188+
//
189+
190+
191+
QgsXyzVectorTileDataProviderMetadata::QgsXyzVectorTileDataProviderMetadata()
192+
: QgsProviderMetadata( QgsXyzVectorTileDataProvider::DATA_PROVIDER_KEY, QgsXyzVectorTileDataProvider::DATA_PROVIDER_DESCRIPTION )
193+
{
194+
}
195+
196+
QIcon QgsXyzVectorTileDataProviderMetadata::icon() const
197+
{
198+
return QgsApplication::getThemeIcon( QStringLiteral( "mIconVectorTileLayer.svg" ) );
199+
}
200+
201+
QgsProviderMetadata::ProviderCapabilities QgsXyzVectorTileDataProviderMetadata::providerCapabilities() const
202+
{
203+
return FileBasedUris;
204+
}
205+
206+
QVariantMap QgsXyzVectorTileDataProviderMetadata::decodeUri( const QString &uri ) const
207+
{
208+
// TODO -- carefully thin out options which don't apply to xyz vector tile services
209+
210+
QgsDataSourceUri dsUri;
211+
dsUri.setEncodedUri( uri );
212+
213+
QVariantMap uriComponents;
214+
uriComponents.insert( QStringLiteral( "type" ), dsUri.param( QStringLiteral( "type" ) ) );
215+
if ( dsUri.hasParam( QStringLiteral( "serviceType" ) ) )
216+
uriComponents.insert( QStringLiteral( "serviceType" ), dsUri.param( QStringLiteral( "serviceType" ) ) );
217+
218+
if ( uriComponents[ QStringLiteral( "type" ) ] == QLatin1String( "mbtiles" ) ||
219+
( uriComponents[ QStringLiteral( "type" ) ] == QLatin1String( "xyz" ) &&
220+
!dsUri.param( QStringLiteral( "url" ) ).startsWith( QLatin1String( "http" ) ) ) )
221+
{
222+
uriComponents.insert( QStringLiteral( "path" ), dsUri.param( QStringLiteral( "url" ) ) );
223+
}
224+
else
225+
{
226+
uriComponents.insert( QStringLiteral( "url" ), dsUri.param( QStringLiteral( "url" ) ) );
227+
}
228+
229+
if ( dsUri.hasParam( QStringLiteral( "zmin" ) ) )
230+
uriComponents.insert( QStringLiteral( "zmin" ), dsUri.param( QStringLiteral( "zmin" ) ) );
231+
if ( dsUri.hasParam( QStringLiteral( "zmax" ) ) )
232+
uriComponents.insert( QStringLiteral( "zmax" ), dsUri.param( QStringLiteral( "zmax" ) ) );
233+
234+
dsUri.httpHeaders().updateMap( uriComponents );
235+
236+
if ( dsUri.hasParam( QStringLiteral( "styleUrl" ) ) )
237+
uriComponents.insert( QStringLiteral( "styleUrl" ), dsUri.param( QStringLiteral( "styleUrl" ) ) );
238+
239+
const QString authcfg = dsUri.authConfigId();
240+
if ( !authcfg.isEmpty() )
241+
uriComponents.insert( QStringLiteral( "authcfg" ), authcfg );
242+
243+
return uriComponents;
244+
}
245+
246+
QString QgsXyzVectorTileDataProviderMetadata::encodeUri( const QVariantMap &parts ) const
247+
{
248+
// TODO -- carefully thin out options which don't apply to xyz vector tile services
249+
250+
QgsDataSourceUri dsUri;
251+
dsUri.setParam( QStringLiteral( "type" ), parts.value( QStringLiteral( "type" ) ).toString() );
252+
if ( parts.contains( QStringLiteral( "serviceType" ) ) )
253+
dsUri.setParam( QStringLiteral( "serviceType" ), parts[ QStringLiteral( "serviceType" ) ].toString() );
254+
dsUri.setParam( QStringLiteral( "url" ), parts.value( parts.contains( QStringLiteral( "path" ) ) ? QStringLiteral( "path" ) : QStringLiteral( "url" ) ).toString() );
255+
256+
if ( parts.contains( QStringLiteral( "zmin" ) ) )
257+
dsUri.setParam( QStringLiteral( "zmin" ), parts[ QStringLiteral( "zmin" ) ].toString() );
258+
if ( parts.contains( QStringLiteral( "zmax" ) ) )
259+
dsUri.setParam( QStringLiteral( "zmax" ), parts[ QStringLiteral( "zmax" ) ].toString() );
260+
261+
dsUri.httpHeaders().setFromMap( parts );
262+
263+
if ( parts.contains( QStringLiteral( "styleUrl" ) ) )
264+
dsUri.setParam( QStringLiteral( "styleUrl" ), parts[ QStringLiteral( "styleUrl" ) ].toString() );
265+
266+
if ( parts.contains( QStringLiteral( "authcfg" ) ) )
267+
dsUri.setAuthConfigId( parts[ QStringLiteral( "authcfg" ) ].toString() );
268+
269+
return dsUri.encodedUri();
270+
}
271+
272+
QString QgsXyzVectorTileDataProviderMetadata::absoluteToRelativeUri( const QString &uri, const QgsReadWriteContext &context ) const
273+
{
274+
QgsDataSourceUri dsUri;
275+
dsUri.setEncodedUri( uri );
276+
277+
QString sourcePath = dsUri.param( QStringLiteral( "url" ) );
278+
279+
const QUrl sourceUrl( sourcePath );
280+
if ( sourceUrl.isLocalFile() )
281+
{
282+
// relative path will become "file:./x.txt"
283+
const QString relSrcUrl = context.pathResolver().writePath( sourceUrl.toLocalFile() );
284+
dsUri.removeParam( QStringLiteral( "url" ) ); // needed because setParam() would insert second "url" key
285+
dsUri.setParam( QStringLiteral( "url" ), QUrl::fromLocalFile( relSrcUrl ).toString() );
286+
return dsUri.encodedUri();
287+
}
288+
289+
return uri;
290+
}
291+
292+
QString QgsXyzVectorTileDataProviderMetadata::relativeToAbsoluteUri( const QString &uri, const QgsReadWriteContext &context ) const
293+
{
294+
QgsDataSourceUri dsUri;
295+
dsUri.setEncodedUri( uri );
296+
297+
QString sourcePath = dsUri.param( QStringLiteral( "url" ) );
298+
299+
const QUrl sourceUrl( sourcePath );
300+
if ( sourceUrl.isLocalFile() ) // file-based URL? convert to relative path
301+
{
302+
const QString absSrcUrl = context.pathResolver().readPath( sourceUrl.toLocalFile() );
303+
dsUri.removeParam( QStringLiteral( "url" ) ); // needed because setParam() would insert second "url" key
304+
dsUri.setParam( QStringLiteral( "url" ), QUrl::fromLocalFile( absSrcUrl ).toString() );
305+
return dsUri.encodedUri();
306+
}
307+
308+
return uri;
309+
}
310+
311+
QList<Qgis::LayerType> QgsXyzVectorTileDataProviderMetadata::supportedLayerTypes() const
312+
{
313+
return { Qgis::LayerType::VectorTile };
314+
}
183315
///@endcond
184316

185317

‎src/core/vectortile/qgsxyzvectortiledataprovider.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "qgis_core.h"
2020
#include "qgis_sip.h"
2121
#include "qgsvectortiledataprovider.h"
22+
#include "qgsprovidermetadata.h"
2223

2324
#define SIP_NO_FILE
2425

@@ -33,6 +34,7 @@ class CORE_EXPORT QgsXyzVectorTileDataProvider : public QgsVectorTileDataProvide
3334
QgsDataProvider::ReadFlags flags );
3435

3536
QString name() const override;
37+
QString description() const override;
3638
QgsVectorTileDataProvider *clone() const override;
3739
QString sourcePath() const override;
3840
bool isValid() const override;
@@ -42,6 +44,9 @@ class CORE_EXPORT QgsXyzVectorTileDataProvider : public QgsVectorTileDataProvide
4244
QList<QgsVectorTileRawData> readTiles( const QgsTileMatrix &, const QVector<QgsTileXYZ> &tiles, QgsFeedback *feedback = nullptr ) const override;
4345
QNetworkRequest tileRequest( const QgsTileMatrix &tileMatrix, const QgsTileXYZ &id, Qgis::RendererUsage usage ) const override;
4446

47+
static QString DATA_PROVIDER_KEY;
48+
static QString DATA_PROVIDER_DESCRIPTION;
49+
4550
protected:
4651

4752
QString mAuthCfg;
@@ -59,6 +64,22 @@ class CORE_EXPORT QgsXyzVectorTileDataProvider : public QgsVectorTileDataProvide
5964

6065
};
6166

67+
68+
class QgsXyzVectorTileDataProviderMetadata : public QgsProviderMetadata
69+
{
70+
Q_OBJECT
71+
public:
72+
QgsXyzVectorTileDataProviderMetadata();
73+
QIcon icon() const override;
74+
ProviderCapabilities providerCapabilities() const override;
75+
QVariantMap decodeUri( const QString &uri ) const override;
76+
QString encodeUri( const QVariantMap &parts ) const override;
77+
QString absoluteToRelativeUri( const QString &uri, const QgsReadWriteContext &context ) const override;
78+
QString relativeToAbsoluteUri( const QString &uri, const QgsReadWriteContext &context ) const override;
79+
QList< Qgis::LayerType > supportedLayerTypes() const override;
80+
};
81+
82+
6283
///@endcond
6384

6485
#endif // QGSXYZVECTORTILEDATAPROVIDER_H

0 commit comments

Comments
 (0)
Please sign in to comment.