Skip to content

Commit aadfbab

Browse files
committedMar 20, 2023
Split vector tile classes into separate files
1 parent 50f3420 commit aadfbab

18 files changed

+874
-608
lines changed
 

‎python/core/auto_generated/vectortile/qgsvectortilelayer.sip.in

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@
99

1010

1111

12-
13-
1412
class QgsVectorTileLayer : QgsMapLayer
1513
{
1614
%Docstring(signature="appended")
@@ -281,8 +279,6 @@ Emitted whenever the selected features in the layer are changed.
281279

282280
};
283281

284-
285-
286282
/************************************************************************
287283
* This file has been generated automatically from *
288284
* *

‎src/core/CMakeLists.txt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -890,11 +890,14 @@ set(QGIS_CORE_SRCS
890890
vector/qgsvectorlayerundopassthroughcommand.cpp
891891
vector/qgsvectorlayerutils.cpp
892892

893+
vectortile/qgsarcgisvectortileservicedataprovider.cpp
893894
vectortile/qgsmapboxglstyleconverter.cpp
895+
vectortile/qgsmbtilesvectortiledataprovider.cpp
894896
vectortile/qgsvectortilebasiclabeling.cpp
895897
vectortile/qgsvectortilebasicrenderer.cpp
896898
vectortile/qgsvectortileconnection.cpp
897899
vectortile/qgsvectortiledataitems.cpp
900+
vectortile/qgsvectortiledataprovider.cpp
898901
vectortile/qgsvectortilelabeling.cpp
899902
vectortile/qgsvectortilelayer.cpp
900903
vectortile/qgsvectortilelayerrenderer.cpp
@@ -907,6 +910,8 @@ set(QGIS_CORE_SRCS
907910
vectortile/qgsvectortileutils.cpp
908911
vectortile/qgsvectortilewriter.cpp
909912
vectortile/qgsvtpktiles.cpp
913+
vectortile/qgsvtpkvectortiledataprovider.cpp
914+
vectortile/qgsxyzvectortiledataprovider.cpp
910915

911916
${CMAKE_CURRENT_BINARY_DIR}/qgsexpression_texts.cpp
912917

@@ -1899,11 +1904,14 @@ set(QGIS_CORE_HDRS
18991904
vector/qgsvectorlayerundopassthroughcommand.h
19001905
vector/qgsvectorlayerutils.h
19011906

1907+
vectortile/qgsarcgisvectortileservicedataprovider.h
19021908
vectortile/qgsmapboxglstyleconverter.h
1909+
vectortile/qgsmbtilesvectortiledataprovider.h
19031910
vectortile/qgsvectortilebasiclabeling.h
19041911
vectortile/qgsvectortilebasicrenderer.h
19051912
vectortile/qgsvectortileconnection.h
19061913
vectortile/qgsvectortiledataitems.h
1914+
vectortile/qgsvectortiledataprovider.h
19071915
vectortile/qgsvectortilelabeling.h
19081916
vectortile/qgsvectortilelayer.h
19091917
vectortile/qgsvectortilelayerrenderer.h
@@ -1917,6 +1925,8 @@ set(QGIS_CORE_HDRS
19171925
vectortile/qgsvectortileutils.h
19181926
vectortile/qgsvectortilewriter.h
19191927
vectortile/qgsvtpktiles.h
1928+
vectortile/qgsvtpkvectortiledataprovider.h
1929+
vectortile/qgsxyzvectortiledataprovider.h
19201930
)
19211931

19221932
set(QGIS_CORE_PRIVATE_HDRS
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
/***************************************************************************
2+
qgsarcgisvectortileservicedataprovider.cpp
3+
--------------------------------------
4+
Date : March 2020
5+
Copyright : (C) 2020 by Martin Dobias
6+
Email : wonder dot sk at gmail dot com
7+
***************************************************************************
8+
* *
9+
* This program is free software; you can redistribute it and/or modify *
10+
* it under the terms of the GNU General Public License as published by *
11+
* the Free Software Foundation; either version 2 of the License, or *
12+
* (at your option) any later version. *
13+
* *
14+
***************************************************************************/
15+
16+
#include "qgsarcgisvectortileservicedataprovider.h"
17+
#include "qgsthreadingutils.h"
18+
19+
///@cond PRIVATE
20+
21+
QgsArcGisVectorTileServiceDataProvider::QgsArcGisVectorTileServiceDataProvider( const QString &uri, const QString &sourcePath, const ProviderOptions &providerOptions, ReadFlags flags )
22+
: QgsXyzVectorTileDataProvider( uri, providerOptions, flags )
23+
, mSourcePath( sourcePath )
24+
{
25+
26+
}
27+
28+
QgsVectorTileDataProvider *QgsArcGisVectorTileServiceDataProvider::clone() const
29+
{
30+
QGIS_PROTECT_QOBJECT_THREAD_ACCESS
31+
32+
ProviderOptions options;
33+
options.transformContext = transformContext();
34+
return new QgsArcGisVectorTileServiceDataProvider( dataSourceUri(), mSourcePath, options, mReadFlags );
35+
}
36+
37+
QString QgsArcGisVectorTileServiceDataProvider::sourcePath() const
38+
{
39+
QGIS_PROTECT_QOBJECT_THREAD_ACCESS
40+
41+
return mSourcePath;
42+
}
43+
44+
bool QgsArcGisVectorTileServiceDataProvider::isValid() const
45+
{
46+
QGIS_PROTECT_QOBJECT_THREAD_ACCESS
47+
48+
return true;
49+
}
50+
51+
///@endcond
52+
53+
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/***************************************************************************
2+
qgsarcgisvectortileservicedataprovider.h
3+
--------------------------------------
4+
Date : March 2020
5+
Copyright : (C) 2020 by Martin Dobias
6+
Email : wonder dot sk at gmail dot com
7+
***************************************************************************
8+
* *
9+
* This program is free software; you can redistribute it and/or modify *
10+
* it under the terms of the GNU General Public License as published by *
11+
* the Free Software Foundation; either version 2 of the License, or *
12+
* (at your option) any later version. *
13+
* *
14+
***************************************************************************/
15+
16+
#ifndef QGSARCGISVECTORTILESERVICEDATAPROVIDER_H
17+
#define QGSARCGISVECTORTILESERVICEDATAPROVIDER_H
18+
19+
#include "qgis_core.h"
20+
#include "qgis_sip.h"
21+
#include "qgsxyzvectortiledataprovider.h"
22+
23+
#define SIP_NO_FILE
24+
25+
///@cond PRIVATE
26+
27+
class CORE_EXPORT QgsArcGisVectorTileServiceDataProvider : public QgsXyzVectorTileDataProvider
28+
{
29+
Q_OBJECT
30+
31+
public:
32+
QgsArcGisVectorTileServiceDataProvider( const QString &uri,
33+
const QString &sourcePath,
34+
const QgsDataProvider::ProviderOptions &providerOptions,
35+
QgsDataProvider::ReadFlags flags );
36+
QgsVectorTileDataProvider *clone() const override;
37+
QString sourcePath() const override;
38+
bool isValid() const override;
39+
40+
private:
41+
42+
QString mSourcePath;
43+
};
44+
45+
///@endcond
46+
47+
#endif // QGSARCGISVECTORTILESERVICEDATAPROVIDER_H
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
/***************************************************************************
2+
qgsmbtilesvectortiledataprovider.cpp
3+
--------------------------------------
4+
Date : March 2020
5+
Copyright : (C) 2020 by Martin Dobias
6+
Email : wonder dot sk at gmail dot com
7+
***************************************************************************
8+
* *
9+
* This program is free software; you can redistribute it and/or modify *
10+
* it under the terms of the GNU General Public License as published by *
11+
* the Free Software Foundation; either version 2 of the License, or *
12+
* (at your option) any later version. *
13+
* *
14+
***************************************************************************/
15+
16+
#include "qgsmbtilesvectortiledataprovider.h"
17+
#include "qgsthreadingutils.h"
18+
#include "qgsmbtiles.h"
19+
#include "qgstiles.h"
20+
#include "qgsvectortileloader.h"
21+
#include "qgsziputils.h"
22+
#include "qgslogger.h"
23+
24+
///@cond PRIVATE
25+
26+
QgsMbTilesVectorTileDataProvider::QgsMbTilesVectorTileDataProvider( const QString &uri, const ProviderOptions &providerOptions, ReadFlags flags )
27+
: QgsVectorTileDataProvider( uri, providerOptions, flags )
28+
{
29+
30+
}
31+
32+
QgsVectorTileDataProvider *QgsMbTilesVectorTileDataProvider::clone() const
33+
{
34+
QGIS_PROTECT_QOBJECT_THREAD_ACCESS
35+
36+
ProviderOptions options;
37+
options.transformContext = transformContext();
38+
return new QgsMbTilesVectorTileDataProvider( dataSourceUri(), options, mReadFlags );
39+
}
40+
41+
QString QgsMbTilesVectorTileDataProvider::sourcePath() const
42+
{
43+
QGIS_PROTECT_QOBJECT_THREAD_ACCESS
44+
45+
QgsDataSourceUri dsUri;
46+
dsUri.setEncodedUri( dataSourceUri() );
47+
return dsUri.param( QStringLiteral( "url" ) );
48+
}
49+
50+
bool QgsMbTilesVectorTileDataProvider::isValid() const
51+
{
52+
QGIS_PROTECT_QOBJECT_THREAD_ACCESS
53+
54+
return true;
55+
}
56+
57+
QgsCoordinateReferenceSystem QgsMbTilesVectorTileDataProvider::crs() const
58+
{
59+
QGIS_PROTECT_QOBJECT_THREAD_ACCESS
60+
61+
return QgsCoordinateReferenceSystem( QStringLiteral( "EPSG:3857" ) );
62+
}
63+
64+
QByteArray QgsMbTilesVectorTileDataProvider::readTile( const QgsTileMatrix &, const QgsTileXYZ &id, QgsFeedback *feedback ) const
65+
{
66+
QGIS_PROTECT_QOBJECT_THREAD_ACCESS
67+
68+
QgsDataSourceUri dsUri;
69+
dsUri.setEncodedUri( dataSourceUri() );
70+
71+
QgsMbTiles mbReader( dsUri.param( QStringLiteral( "url" ) ) );
72+
mbReader.open();
73+
return loadFromMBTiles( mbReader, id, feedback );
74+
}
75+
76+
QList<QgsVectorTileRawData> QgsMbTilesVectorTileDataProvider::readTiles( const QgsTileMatrix &, const QVector<QgsTileXYZ> &tiles, QgsFeedback *feedback ) const
77+
{
78+
QGIS_PROTECT_QOBJECT_THREAD_ACCESS
79+
80+
QgsDataSourceUri dsUri;
81+
dsUri.setEncodedUri( dataSourceUri() );
82+
83+
QgsMbTiles mbReader( dsUri.param( QStringLiteral( "url" ) ) );
84+
mbReader.open();
85+
86+
QList<QgsVectorTileRawData> rawTiles;
87+
rawTiles.reserve( tiles.size() );
88+
for ( QgsTileXYZ id : std::as_const( tiles ) )
89+
{
90+
if ( feedback && feedback->isCanceled() )
91+
break;
92+
93+
const QByteArray rawData = loadFromMBTiles( mbReader, id, feedback );
94+
if ( !rawData.isEmpty() )
95+
{
96+
rawTiles.append( QgsVectorTileRawData( id, rawData ) );
97+
}
98+
}
99+
return rawTiles;
100+
}
101+
102+
QByteArray QgsMbTilesVectorTileDataProvider::loadFromMBTiles( QgsMbTiles &mbTileReader, const QgsTileXYZ &id, QgsFeedback *feedback )
103+
{
104+
// MBTiles uses TMS specs with Y starting at the bottom while XYZ uses Y starting at the top
105+
const int rowTMS = static_cast<int>( pow( 2, id.zoomLevel() ) - id.row() - 1 );
106+
QByteArray gzippedTileData = mbTileReader.tileData( id.zoomLevel(), id.column(), rowTMS );
107+
if ( gzippedTileData.isEmpty() )
108+
{
109+
return QByteArray();
110+
}
111+
112+
if ( feedback && feedback->isCanceled() )
113+
return QByteArray();
114+
115+
QByteArray data;
116+
if ( !QgsZipUtils::decodeGzip( gzippedTileData, data ) )
117+
{
118+
QgsDebugMsg( QStringLiteral( "Failed to decompress tile " ) + id.toString() );
119+
return QByteArray();
120+
}
121+
122+
QgsDebugMsgLevel( QStringLiteral( "Tile blob size %1 -> uncompressed size %2" ).arg( gzippedTileData.size() ).arg( data.size() ), 2 );
123+
return data;
124+
}
125+
///@endcond
126+
127+
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
/***************************************************************************
2+
qgsmbtilesvectortiledataprovider.h
3+
--------------------------------------
4+
Date : March 2020
5+
Copyright : (C) 2020 by Martin Dobias
6+
Email : wonder dot sk at gmail dot com
7+
***************************************************************************
8+
* *
9+
* This program is free software; you can redistribute it and/or modify *
10+
* it under the terms of the GNU General Public License as published by *
11+
* the Free Software Foundation; either version 2 of the License, or *
12+
* (at your option) any later version. *
13+
* *
14+
***************************************************************************/
15+
16+
#ifndef QGSMBTILESVECTORTILEDATAPROVIDER_H
17+
#define QGSMBTILESVECTORTILEDATAPROVIDER_H
18+
19+
#include "qgis_core.h"
20+
#include "qgis_sip.h"
21+
#include "qgsvectortiledataprovider.h"
22+
23+
class QgsMbTiles;
24+
25+
#define SIP_NO_FILE
26+
27+
///@cond PRIVATE
28+
29+
class CORE_EXPORT QgsMbTilesVectorTileDataProvider : public QgsVectorTileDataProvider
30+
{
31+
Q_OBJECT
32+
33+
public:
34+
QgsMbTilesVectorTileDataProvider( const QString &uri,
35+
const QgsDataProvider::ProviderOptions &providerOptions,
36+
QgsDataProvider::ReadFlags flags );
37+
38+
QgsVectorTileDataProvider *clone() const override;
39+
QString sourcePath() const override;
40+
bool isValid() const override;
41+
QgsCoordinateReferenceSystem crs() const override;
42+
QByteArray readTile( const QgsTileMatrix &tileMatrix, const QgsTileXYZ &id, QgsFeedback *feedback = nullptr ) const override;
43+
QList<QgsVectorTileRawData> readTiles( const QgsTileMatrix &, const QVector<QgsTileXYZ> &tiles, QgsFeedback *feedback = nullptr ) const override;
44+
45+
private:
46+
47+
//! Returns raw tile data for a single tile loaded from MBTiles file
48+
static QByteArray loadFromMBTiles( QgsMbTiles &mbTileReader, const QgsTileXYZ &id, QgsFeedback *feedback = nullptr );
49+
50+
};
51+
52+
///@endcond
53+
54+
#endif // QGSMBTILESVECTORTILEDATAPROVIDER_H
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
/***************************************************************************
2+
qgsvectortiledataprovider.cpp
3+
--------------------------------------
4+
Date : March 2020
5+
Copyright : (C) 2020 by Martin Dobias
6+
Email : wonder dot sk at gmail dot com
7+
***************************************************************************
8+
* *
9+
* This program is free software; you can redistribute it and/or modify *
10+
* it under the terms of the GNU General Public License as published by *
11+
* the Free Software Foundation; either version 2 of the License, or *
12+
* (at your option) any later version. *
13+
* *
14+
***************************************************************************/
15+
16+
#include "qgsvectortiledataprovider.h"
17+
#include "qgsthreadingutils.h"
18+
19+
#include <QNetworkRequest>
20+
21+
QgsVectorTileDataProvider::QgsVectorTileDataProvider(
22+
const QString &uri,
23+
const ProviderOptions &options,
24+
QgsDataProvider::ReadFlags flags )
25+
: QgsDataProvider( uri, options, flags )
26+
{}
27+
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+
42+
QgsRectangle QgsVectorTileDataProvider::extent() const
43+
{
44+
QGIS_PROTECT_QOBJECT_THREAD_ACCESS
45+
46+
return QgsRectangle();
47+
}
48+
49+
bool QgsVectorTileDataProvider::renderInPreview( const PreviewContext &context )
50+
{
51+
QGIS_PROTECT_QOBJECT_THREAD_ACCESS
52+
53+
// Vector tiles by design are very CPU light to render, so we are much more permissive here compared
54+
// with other layer types. (Generally if a vector tile layer has taken more than a few milliseconds to render it's
55+
// a result of network requests, and the tile manager class handles these gracefully for us)
56+
return context.lastRenderingTimeMs <= 1000;
57+
}
58+
59+
bool QgsVectorTileDataProvider::supportsAsync() const
60+
{
61+
QGIS_PROTECT_QOBJECT_THREAD_ACCESS
62+
63+
return false;
64+
}
65+
66+
QNetworkRequest QgsVectorTileDataProvider::tileRequest( const QgsTileMatrix &, const QgsTileXYZ &, Qgis::RendererUsage ) const
67+
{
68+
QGIS_PROTECT_QOBJECT_THREAD_ACCESS
69+
70+
return QNetworkRequest();
71+
}
72+
73+
///@endcond
74+
75+
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
/***************************************************************************
2+
qgsvectortiledataprovider.h
3+
--------------------------------------
4+
Date : March 2020
5+
Copyright : (C) 2020 by Martin Dobias
6+
Email : wonder dot sk at gmail dot com
7+
***************************************************************************
8+
* *
9+
* This program is free software; you can redistribute it and/or modify *
10+
* it under the terms of the GNU General Public License as published by *
11+
* the Free Software Foundation; either version 2 of the License, or *
12+
* (at your option) any later version. *
13+
* *
14+
***************************************************************************/
15+
16+
#ifndef QGSVECTORTILEDATAPROVIDER_H
17+
#define QGSVECTORTILEDATAPROVIDER_H
18+
19+
#include "qgis_core.h"
20+
#include "qgis_sip.h"
21+
#include "qgsdataprovider.h"
22+
23+
class QgsTileMatrix;
24+
class QgsTileXYZ;
25+
class QgsVectorTileRawData;
26+
27+
#define SIP_NO_FILE
28+
29+
/**
30+
* Base class for vector tile layer data providers.
31+
*
32+
* \note Not available in Python bindings
33+
*
34+
* \since QGIS 3.22
35+
*/
36+
class CORE_EXPORT QgsVectorTileDataProvider : public QgsDataProvider
37+
{
38+
Q_OBJECT
39+
40+
public:
41+
42+
/**
43+
* Constructor for QgsVectorTileDataProvider, with the specified \a uri.
44+
*/
45+
QgsVectorTileDataProvider( const QString &uri,
46+
const QgsDataProvider::ProviderOptions &providerOptions,
47+
QgsDataProvider::ReadFlags flags );
48+
49+
QString name() const override;
50+
QString description() const override;
51+
QgsRectangle extent() const override;
52+
bool renderInPreview( const QgsDataProvider::PreviewContext &context ) override;
53+
54+
/**
55+
* Returns the source path for the data.
56+
*/
57+
virtual QString sourcePath() const = 0;
58+
59+
/**
60+
* Returns a clone of the data provider.
61+
*/
62+
virtual QgsVectorTileDataProvider *clone() const = 0 SIP_FACTORY;
63+
64+
/**
65+
* Returns TRUE if the provider supports async tile reading.
66+
*
67+
* The default implementation returns FALSE.
68+
*/
69+
virtual bool supportsAsync() const;
70+
71+
/**
72+
* Returns raw tile data for a single tile.
73+
*/
74+
virtual QByteArray readTile( const QgsTileMatrix &tileMatrix, const QgsTileXYZ &id, QgsFeedback *feedback = nullptr ) const = 0;
75+
76+
/**
77+
* Returns raw tile data for a range of tiles.
78+
*/
79+
virtual QList<QgsVectorTileRawData> readTiles( const QgsTileMatrix &tileMatrix, const QVector<QgsTileXYZ> &tiles, QgsFeedback *feedback = nullptr ) const = 0;
80+
81+
/**
82+
* Returns a network request for a tile.
83+
*
84+
* The default implementation returns an invalid request.
85+
*/
86+
virtual QNetworkRequest tileRequest( const QgsTileMatrix &tileMatrix, const QgsTileXYZ &id, Qgis::RendererUsage usage ) const;
87+
};
88+
89+
#endif // QGSVECTORTILEDATAPROVIDER_H

‎src/core/vectortile/qgsvectortilelayer.cpp

Lines changed: 5 additions & 419 deletions
Large diffs are not rendered by default.

‎src/core/vectortile/qgsvectortilelayer.h

Lines changed: 1 addition & 161 deletions
Original file line numberDiff line numberDiff line change
@@ -18,21 +18,15 @@
1818

1919
#include "qgis_core.h"
2020
#include "qgis_sip.h"
21-
2221
#include "qgsmaplayer.h"
2322
#include "qgsvectortilematrixset.h"
2423
#include "qgsfeatureid.h"
2524

26-
class QgsVectorTileLabeling;
2725
class QgsVectorTileRenderer;
28-
class QgsVectorTileRawData;
29-
class QgsVectorTileDataProvider;
30-
31-
class QgsTileXYZ;
26+
class QgsVectorTileLabeling;
3227
class QgsFeature;
3328
class QgsGeometry;
3429
class QgsSelectionContext;
35-
class QgsMbTiles;
3630

3731
/**
3832
* \ingroup core
@@ -317,160 +311,6 @@ class CORE_EXPORT QgsVectorTileLayer : public QgsMapLayer
317311

318312
bool loadDefaultStyleAndSubLayersPrivate( QString &error, QStringList &warnings, QList< QgsMapLayer * > *subLayers );
319313

320-
321-
};
322-
323-
#ifndef SIP_RUN
324-
///@cond PRIVATE
325-
326-
/**
327-
* A minimal data provider for vector tile layers.
328-
*
329-
* \since QGIS 3.22
330-
*/
331-
class QgsVectorTileDataProvider : public QgsDataProvider
332-
{
333-
Q_OBJECT
334-
335-
public:
336-
QgsVectorTileDataProvider( const QString &uri,
337-
const QgsDataProvider::ProviderOptions &providerOptions,
338-
QgsDataProvider::ReadFlags flags );
339-
QString name() const override;
340-
QString description() const override;
341-
QgsRectangle extent() const override;
342-
bool renderInPreview( const QgsDataProvider::PreviewContext &context ) override;
343-
344-
//! Renders the source path for the data
345-
virtual QString sourcePath() const = 0;
346-
347-
//! Returns a clone of the data provider
348-
virtual QgsVectorTileDataProvider *clone() const = 0 SIP_FACTORY;
349-
350-
/**
351-
* Returns TRUE if the provider supports async tile reading.
352-
*
353-
* The default implementation returns FALSE.
354-
*/
355-
virtual bool supportsAsync() const;
356-
357-
//! Returns raw tile data for a single tile
358-
virtual QByteArray readTile( const QgsTileMatrix &tileMatrix, const QgsTileXYZ &id, QgsFeedback *feedback = nullptr ) const = 0;
359-
360-
//! Returns raw tile data for a range of tiles
361-
virtual QList<QgsVectorTileRawData> readTiles( const QgsTileMatrix &, const QVector<QgsTileXYZ> &tiles, QgsFeedback *feedback = nullptr ) const = 0;
362-
363-
/**
364-
* Returns a network request for a tile.
365-
*
366-
* The default implementation returns an invalid request.
367-
*/
368-
virtual QNetworkRequest tileRequest( const QgsTileMatrix &tileMatrix, const QgsTileXYZ &id, Qgis::RendererUsage usage ) const;
369314
};
370315

371-
class QgsXyzVectorTileDataProvider : public QgsVectorTileDataProvider
372-
{
373-
Q_OBJECT
374-
375-
public:
376-
QgsXyzVectorTileDataProvider( const QString &uri,
377-
const QgsDataProvider::ProviderOptions &providerOptions,
378-
QgsDataProvider::ReadFlags flags );
379-
380-
QgsVectorTileDataProvider *clone() const override;
381-
QString sourcePath() const override;
382-
bool isValid() const override;
383-
QgsCoordinateReferenceSystem crs() const override;
384-
bool supportsAsync() const override;
385-
QByteArray readTile( const QgsTileMatrix &tileMatrix, const QgsTileXYZ &id, QgsFeedback *feedback = nullptr ) const override;
386-
QList<QgsVectorTileRawData> readTiles( const QgsTileMatrix &, const QVector<QgsTileXYZ> &tiles, QgsFeedback *feedback = nullptr ) const override;
387-
QNetworkRequest tileRequest( const QgsTileMatrix &tileMatrix, const QgsTileXYZ &id, Qgis::RendererUsage usage ) const override;
388-
389-
protected:
390-
391-
QString mAuthCfg;
392-
QgsHttpHeaders mHeaders;
393-
394-
private:
395-
396-
//! Returns raw tile data for a single tile, doing a HTTP request. Block the caller until tile data are downloaded.
397-
static QByteArray loadFromNetwork( const QgsTileXYZ &id,
398-
const QgsTileMatrix &tileMatrix,
399-
const QString &requestUrl,
400-
const QString &authid,
401-
const QgsHttpHeaders &headers,
402-
QgsFeedback *feedback = nullptr );
403-
404-
};
405-
406-
class QgsMbTilesVectorTileDataProvider : public QgsVectorTileDataProvider
407-
{
408-
Q_OBJECT
409-
410-
public:
411-
QgsMbTilesVectorTileDataProvider( const QString &uri,
412-
const QgsDataProvider::ProviderOptions &providerOptions,
413-
QgsDataProvider::ReadFlags flags );
414-
415-
QgsVectorTileDataProvider *clone() const override;
416-
QString sourcePath() const override;
417-
bool isValid() const override;
418-
QgsCoordinateReferenceSystem crs() const override;
419-
QByteArray readTile( const QgsTileMatrix &tileMatrix, const QgsTileXYZ &id, QgsFeedback *feedback = nullptr ) const override;
420-
QList<QgsVectorTileRawData> readTiles( const QgsTileMatrix &, const QVector<QgsTileXYZ> &tiles, QgsFeedback *feedback = nullptr ) const override;
421-
422-
private:
423-
424-
//! Returns raw tile data for a single tile loaded from MBTiles file
425-
static QByteArray loadFromMBTiles( QgsMbTiles &mbTileReader, const QgsTileXYZ &id, QgsFeedback *feedback = nullptr );
426-
427-
};
428-
429-
class QgsVtpkTiles;
430-
431-
class QgsVtpkVectorTileDataProvider : public QgsVectorTileDataProvider
432-
{
433-
Q_OBJECT
434-
435-
public:
436-
QgsVtpkVectorTileDataProvider( const QString &uri,
437-
const QgsDataProvider::ProviderOptions &providerOptions,
438-
QgsDataProvider::ReadFlags flags );
439-
440-
QgsVectorTileDataProvider *clone() const override;
441-
QString sourcePath() const override;
442-
bool isValid() const override;
443-
QgsCoordinateReferenceSystem crs() const override;
444-
QByteArray readTile( const QgsTileMatrix &tileMatrix, const QgsTileXYZ &id, QgsFeedback *feedback = nullptr ) const override;
445-
QList<QgsVectorTileRawData> readTiles( const QgsTileMatrix &, const QVector<QgsTileXYZ> &tiles, QgsFeedback *feedback = nullptr ) const override;
446-
447-
private:
448-
449-
//! Returns raw tile data for a single tile loaded from VTPK file
450-
static QByteArray loadFromVtpk( QgsVtpkTiles &vtpkTileReader, const QgsTileXYZ &id, QgsFeedback *feedback = nullptr );
451-
452-
};
453-
454-
class QgsArcGisVectorTileServiceDataProvider : public QgsXyzVectorTileDataProvider
455-
{
456-
Q_OBJECT
457-
458-
public:
459-
QgsArcGisVectorTileServiceDataProvider( const QString &uri,
460-
const QString &sourcePath,
461-
const QgsDataProvider::ProviderOptions &providerOptions,
462-
QgsDataProvider::ReadFlags flags );
463-
QgsVectorTileDataProvider *clone() const override;
464-
QString sourcePath() const override;
465-
bool isValid() const override;
466-
467-
private:
468-
469-
QString mSourcePath;
470-
};
471-
472-
///@endcond
473-
#endif
474-
475-
476316
#endif // QGSVECTORTILELAYER_H

‎src/core/vectortile/qgsvectortilelayerrenderer.cpp

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,24 +14,21 @@
1414
***************************************************************************/
1515

1616
#include "qgsvectortilelayerrenderer.h"
17-
18-
#include <QElapsedTimer>
19-
#include <QThread>
20-
2117
#include "qgsexpressioncontextutils.h"
2218
#include "qgsfeedback.h"
2319
#include "qgslogger.h"
24-
25-
#include "qgsvectortilebasicrenderer.h"
2620
#include "qgsvectortilemvtdecoder.h"
2721
#include "qgsvectortilelayer.h"
2822
#include "qgsvectortileloader.h"
2923
#include "qgsvectortileutils.h"
30-
3124
#include "qgslabelingengine.h"
3225
#include "qgsvectortilelabeling.h"
3326
#include "qgsmapclippingutils.h"
3427
#include "qgsrendercontext.h"
28+
#include "qgsvectortiledataprovider.h"
29+
30+
#include <QElapsedTimer>
31+
#include <QThread>
3532

3633
QgsVectorTileLayerRenderer::QgsVectorTileLayerRenderer( QgsVectorTileLayer *layer, QgsRenderContext &context )
3734
: QgsMapLayerRenderer( layer->id(), &context )

‎src/core/vectortile/qgsvectortilelayerrenderer.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,15 @@
1919
#define SIP_NO_FILE
2020

2121
#include "qgsmaplayerrenderer.h"
22+
#include "qgsvectortilerenderer.h"
23+
#include "qgsmapclippingregion.h"
24+
#include "qgsvectortilematrixset.h"
2225

2326
class QgsVectorTileLayer;
2427
class QgsVectorTileRawData;
2528
class QgsVectorTileLabelProvider;
2629
class QgsVectorTileDataProvider;
2730

28-
#include "qgsvectortilerenderer.h"
29-
#include "qgsmapclippingregion.h"
30-
#include "qgsvectortilematrixset.h"
3131

3232
/**
3333
* \ingroup core

‎src/core/vectortile/qgsvectortileloader.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,16 @@
1414
***************************************************************************/
1515

1616
#include "qgsvectortileloader.h"
17-
18-
#include <QEventLoop>
19-
2017
#include "qgslogger.h"
2118
#include "qgsvectortileutils.h"
2219
#include "qgsapplication.h"
23-
#include "qgsvectortilelayer.h"
20+
#include "qgsvectortiledataprovider.h"
2421
#include "qgsfeedback.h"
25-
2622
#include "qgstiledownloadmanager.h"
2723

24+
#include <QEventLoop>
25+
26+
2827
QgsVectorTileLoader::QgsVectorTileLoader( const QgsVectorTileDataProvider *provider, const QgsTileMatrix &tileMatrix, const QgsTileRange &range, const QPointF &viewCenter, QgsFeedback *feedback, Qgis::RendererUsage usage )
2928
: mEventLoop( new QEventLoop )
3029
, mFeedback( feedback )

‎src/core/vectortile/qgsvectortileloader.h

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,13 @@
2020

2121
#include "qgstiles.h"
2222

23-
class QByteArray;
2423
class QgsFeedback;
24+
class QgsTileDownloadManagerReply;
25+
class QgsVectorTileDataProvider;
2526

27+
class QByteArray;
28+
class QNetworkReply;
29+
class QEventLoop;
2630

2731
/**
2832
* \ingroup core
@@ -44,14 +48,6 @@ class QgsVectorTileRawData
4448
};
4549

4650

47-
class QNetworkReply;
48-
class QEventLoop;
49-
50-
class QgsVtpkTiles;
51-
52-
class QgsTileDownloadManagerReply;
53-
class QgsVectorTileDataProvider;
54-
5551
/**
5652
* \ingroup core
5753
* \brief The loader class takes care of loading raw vector tile data from a tile source.
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
/***************************************************************************
2+
qgsvtpkvectortiledataprovider.cpp
3+
--------------------------------------
4+
Date : March 2020
5+
Copyright : (C) 2020 by Martin Dobias
6+
Email : wonder dot sk at gmail dot com
7+
***************************************************************************
8+
* *
9+
* This program is free software; you can redistribute it and/or modify *
10+
* it under the terms of the GNU General Public License as published by *
11+
* the Free Software Foundation; either version 2 of the License, or *
12+
* (at your option) any later version. *
13+
* *
14+
***************************************************************************/
15+
16+
#include "qgsvtpkvectortiledataprovider.h"
17+
#include "qgsthreadingutils.h"
18+
#include "qgsvtpktiles.h"
19+
#include "qgsvectortileloader.h"
20+
21+
///@cond PRIVATE
22+
23+
QgsVtpkVectorTileDataProvider::QgsVtpkVectorTileDataProvider( const QString &uri, const ProviderOptions &providerOptions, ReadFlags flags )
24+
: QgsVectorTileDataProvider( uri, providerOptions, flags )
25+
{
26+
27+
}
28+
29+
QgsVectorTileDataProvider *QgsVtpkVectorTileDataProvider::clone() const
30+
{
31+
QGIS_PROTECT_QOBJECT_THREAD_ACCESS
32+
33+
ProviderOptions options;
34+
options.transformContext = transformContext();
35+
return new QgsVtpkVectorTileDataProvider( dataSourceUri(), options, mReadFlags );
36+
}
37+
38+
QString QgsVtpkVectorTileDataProvider::sourcePath() const
39+
{
40+
QGIS_PROTECT_QOBJECT_THREAD_ACCESS
41+
42+
QgsDataSourceUri dsUri;
43+
dsUri.setEncodedUri( dataSourceUri() );
44+
return dsUri.param( QStringLiteral( "url" ) );
45+
}
46+
47+
bool QgsVtpkVectorTileDataProvider::isValid() const
48+
{
49+
QGIS_PROTECT_QOBJECT_THREAD_ACCESS
50+
51+
return true;
52+
}
53+
54+
QgsCoordinateReferenceSystem QgsVtpkVectorTileDataProvider::crs() const
55+
{
56+
QGIS_PROTECT_QOBJECT_THREAD_ACCESS
57+
58+
return QgsCoordinateReferenceSystem( QStringLiteral( "EPSG:3857" ) );
59+
}
60+
61+
QByteArray QgsVtpkVectorTileDataProvider::readTile( const QgsTileMatrix &, const QgsTileXYZ &id, QgsFeedback *feedback ) const
62+
{
63+
QGIS_PROTECT_QOBJECT_THREAD_ACCESS
64+
65+
QgsDataSourceUri dsUri;
66+
dsUri.setEncodedUri( dataSourceUri() );
67+
QgsVtpkTiles reader( dsUri.param( QStringLiteral( "url" ) ) );
68+
reader.open();
69+
return loadFromVtpk( reader, id, feedback );
70+
}
71+
72+
QList<QgsVectorTileRawData> QgsVtpkVectorTileDataProvider::readTiles( const QgsTileMatrix &, const QVector<QgsTileXYZ> &tiles, QgsFeedback *feedback ) const
73+
{
74+
QGIS_PROTECT_QOBJECT_THREAD_ACCESS
75+
76+
QgsDataSourceUri dsUri;
77+
dsUri.setEncodedUri( dataSourceUri() );
78+
79+
QgsVtpkTiles reader( dsUri.param( QStringLiteral( "url" ) ) );
80+
reader.open();
81+
82+
QList<QgsVectorTileRawData> rawTiles;
83+
rawTiles.reserve( tiles.size() );
84+
for ( QgsTileXYZ id : std::as_const( tiles ) )
85+
{
86+
if ( feedback && feedback->isCanceled() )
87+
break;
88+
89+
const QByteArray rawData = loadFromVtpk( reader, id, feedback );
90+
if ( !rawData.isEmpty() )
91+
{
92+
rawTiles.append( QgsVectorTileRawData( id, rawData ) );
93+
}
94+
}
95+
return rawTiles;
96+
}
97+
98+
QByteArray QgsVtpkVectorTileDataProvider::loadFromVtpk( QgsVtpkTiles &vtpkTileReader, const QgsTileXYZ &id, QgsFeedback * )
99+
{
100+
const QByteArray tileData = vtpkTileReader.tileData( id.zoomLevel(), id.column(), id.row() );
101+
if ( tileData.isEmpty() )
102+
{
103+
return QByteArray();
104+
}
105+
return tileData;
106+
}
107+
108+
///@endcond
109+
110+
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
/***************************************************************************
2+
qgsvtpkvectortiledataprovider.h
3+
--------------------------------------
4+
Date : March 2020
5+
Copyright : (C) 2020 by Martin Dobias
6+
Email : wonder dot sk at gmail dot com
7+
***************************************************************************
8+
* *
9+
* This program is free software; you can redistribute it and/or modify *
10+
* it under the terms of the GNU General Public License as published by *
11+
* the Free Software Foundation; either version 2 of the License, or *
12+
* (at your option) any later version. *
13+
* *
14+
***************************************************************************/
15+
16+
#ifndef QGSVTPKVECTORTILEDATAPROVIDER_H
17+
#define QGSVTPKVECTORTILEDATAPROVIDER_H
18+
19+
#include "qgis_core.h"
20+
#include "qgis_sip.h"
21+
#include "qgsvectortiledataprovider.h"
22+
23+
#define SIP_NO_FILE
24+
25+
///@cond PRIVATE
26+
27+
class QgsVtpkTiles;
28+
29+
class QgsVtpkVectorTileDataProvider : public QgsVectorTileDataProvider
30+
{
31+
Q_OBJECT
32+
33+
public:
34+
QgsVtpkVectorTileDataProvider( const QString &uri,
35+
const QgsDataProvider::ProviderOptions &providerOptions,
36+
QgsDataProvider::ReadFlags flags );
37+
38+
QgsVectorTileDataProvider *clone() const override;
39+
QString sourcePath() const override;
40+
bool isValid() const override;
41+
QgsCoordinateReferenceSystem crs() const override;
42+
QByteArray readTile( const QgsTileMatrix &tileMatrix, const QgsTileXYZ &id, QgsFeedback *feedback = nullptr ) const override;
43+
QList<QgsVectorTileRawData> readTiles( const QgsTileMatrix &, const QVector<QgsTileXYZ> &tiles, QgsFeedback *feedback = nullptr ) const override;
44+
45+
private:
46+
47+
//! Returns raw tile data for a single tile loaded from VTPK file
48+
static QByteArray loadFromVtpk( QgsVtpkTiles &vtpkTileReader, const QgsTileXYZ &id, QgsFeedback *feedback = nullptr );
49+
50+
};
51+
52+
///@endcond
53+
54+
#endif // QGSVTPKVECTORTILEDATAPROVIDER_H
Lines changed: 170 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
1+
/***************************************************************************
2+
qgsxyzvectortiledataprovider.cpp
3+
--------------------------------------
4+
Date : March 2020
5+
Copyright : (C) 2020 by Martin Dobias
6+
Email : wonder dot sk at gmail dot com
7+
***************************************************************************
8+
* *
9+
* This program is free software; you can redistribute it and/or modify *
10+
* it under the terms of the GNU General Public License as published by *
11+
* the Free Software Foundation; either version 2 of the License, or *
12+
* (at your option) any later version. *
13+
* *
14+
***************************************************************************/
15+
16+
#include "qgsxyzvectortiledataprovider.h"
17+
#include "qgsthreadingutils.h"
18+
#include "qgstiles.h"
19+
#include "qgsvectortileloader.h"
20+
#include "qgsvectortileutils.h"
21+
#include "qgsnetworkaccessmanager.h"
22+
#include "qgsapplication.h"
23+
#include "qgsauthmanager.h"
24+
#include "qgsmessagelog.h"
25+
#include "qgsblockingnetworkrequest.h"
26+
#include "qgslogger.h"
27+
28+
#include <QNetworkRequest>
29+
30+
///@cond PRIVATE
31+
32+
QgsXyzVectorTileDataProvider::QgsXyzVectorTileDataProvider( const QString &uri, const ProviderOptions &providerOptions, ReadFlags flags )
33+
: QgsVectorTileDataProvider( uri, providerOptions, flags )
34+
{
35+
QgsDataSourceUri dsUri;
36+
dsUri.setEncodedUri( uri );
37+
38+
mAuthCfg = dsUri.authConfigId();
39+
mHeaders = dsUri.httpHeaders();
40+
}
41+
42+
QgsVectorTileDataProvider *QgsXyzVectorTileDataProvider::clone() const
43+
{
44+
QGIS_PROTECT_QOBJECT_THREAD_ACCESS
45+
46+
ProviderOptions options;
47+
options.transformContext = transformContext();
48+
return new QgsXyzVectorTileDataProvider( dataSourceUri(), options, mReadFlags );
49+
}
50+
51+
QString QgsXyzVectorTileDataProvider::sourcePath() const
52+
{
53+
QGIS_PROTECT_QOBJECT_THREAD_ACCESS
54+
55+
QgsDataSourceUri dsUri;
56+
dsUri.setEncodedUri( dataSourceUri() );
57+
return dsUri.param( QStringLiteral( "url" ) );
58+
}
59+
60+
bool QgsXyzVectorTileDataProvider::isValid() const
61+
{
62+
QGIS_PROTECT_QOBJECT_THREAD_ACCESS
63+
64+
return true;
65+
}
66+
67+
QgsCoordinateReferenceSystem QgsXyzVectorTileDataProvider::crs() const
68+
{
69+
QGIS_PROTECT_QOBJECT_THREAD_ACCESS
70+
71+
return QgsCoordinateReferenceSystem( QStringLiteral( "EPSG:3857" ) );
72+
}
73+
74+
bool QgsXyzVectorTileDataProvider::supportsAsync() const
75+
{
76+
return true;
77+
}
78+
79+
QByteArray QgsXyzVectorTileDataProvider::readTile( const QgsTileMatrix &tileMatrix, const QgsTileXYZ &id, QgsFeedback *feedback ) const
80+
{
81+
return loadFromNetwork( id, tileMatrix, sourcePath(), mAuthCfg, mHeaders, feedback );
82+
}
83+
84+
QList<QgsVectorTileRawData> QgsXyzVectorTileDataProvider::readTiles( const QgsTileMatrix &tileMatrix, const QVector<QgsTileXYZ> &tiles, QgsFeedback *feedback ) const
85+
{
86+
QList<QgsVectorTileRawData> rawTiles;
87+
rawTiles.reserve( tiles.size() );
88+
const QString source = sourcePath();
89+
for ( QgsTileXYZ id : std::as_const( tiles ) )
90+
{
91+
if ( feedback && feedback->isCanceled() )
92+
break;
93+
94+
const QByteArray rawData = loadFromNetwork( id, tileMatrix, source, mAuthCfg, mHeaders, feedback );
95+
if ( !rawData.isEmpty() )
96+
{
97+
rawTiles.append( QgsVectorTileRawData( id, rawData ) );
98+
}
99+
}
100+
return rawTiles;
101+
}
102+
103+
QNetworkRequest QgsXyzVectorTileDataProvider::tileRequest( const QgsTileMatrix &tileMatrix, const QgsTileXYZ &id, Qgis::RendererUsage usage ) const
104+
{
105+
QString urlTemplate = sourcePath();
106+
107+
if ( urlTemplate.contains( QLatin1String( "{usage}" ) ) )
108+
{
109+
switch ( usage )
110+
{
111+
case Qgis::RendererUsage::View:
112+
urlTemplate.replace( QLatin1String( "{usage}" ), QLatin1String( "view" ) );
113+
break;
114+
case Qgis::RendererUsage::Export:
115+
urlTemplate.replace( QLatin1String( "{usage}" ), QLatin1String( "export" ) );
116+
break;
117+
case Qgis::RendererUsage::Unknown:
118+
urlTemplate.replace( QLatin1String( "{usage}" ), QString() );
119+
break;
120+
}
121+
}
122+
123+
const QString url = QgsVectorTileUtils::formatXYZUrlTemplate( urlTemplate, id, tileMatrix );
124+
125+
QNetworkRequest request( url );
126+
QgsSetRequestInitiatorClass( request, QStringLiteral( "QgsXyzVectorTileDataProvider" ) );
127+
QgsSetRequestInitiatorId( request, id.toString() );
128+
129+
request.setAttribute( static_cast<QNetworkRequest::Attribute>( QNetworkRequest::User + 1 ), id.column() );
130+
request.setAttribute( static_cast<QNetworkRequest::Attribute>( QNetworkRequest::User + 2 ), id.row() );
131+
request.setAttribute( static_cast<QNetworkRequest::Attribute>( QNetworkRequest::User + 3 ), id.zoomLevel() );
132+
133+
request.setAttribute( QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferCache );
134+
request.setAttribute( QNetworkRequest::CacheSaveControlAttribute, true );
135+
136+
mHeaders.updateNetworkRequest( request );
137+
138+
if ( !mAuthCfg.isEmpty() && !QgsApplication::authManager()->updateNetworkRequest( request, mAuthCfg ) )
139+
{
140+
QgsMessageLog::logMessage( tr( "network request update failed for authentication config" ), tr( "Network" ) );
141+
}
142+
143+
return request;
144+
}
145+
146+
QByteArray QgsXyzVectorTileDataProvider::loadFromNetwork( const QgsTileXYZ &id, const QgsTileMatrix &tileMatrix, const QString &requestUrl, const QString &authid, const QgsHttpHeaders &headers, QgsFeedback *feedback )
147+
{
148+
QString url = QgsVectorTileUtils::formatXYZUrlTemplate( requestUrl, id, tileMatrix );
149+
QNetworkRequest nr;
150+
nr.setUrl( QUrl( url ) );
151+
152+
headers.updateNetworkRequest( nr );
153+
154+
QgsBlockingNetworkRequest req;
155+
req.setAuthCfg( authid );
156+
QgsDebugMsgLevel( QStringLiteral( "Blocking request: " ) + url, 2 );
157+
QgsBlockingNetworkRequest::ErrorCode errCode = req.get( nr, false, feedback );
158+
if ( errCode != QgsBlockingNetworkRequest::NoError )
159+
{
160+
QgsDebugMsg( QStringLiteral( "Request failed: " ) + url );
161+
return QByteArray();
162+
}
163+
QgsNetworkReplyContent reply = req.reply();
164+
QgsDebugMsgLevel( QStringLiteral( "Request successful, content size %1" ).arg( reply.content().size() ), 2 );
165+
return reply.content();
166+
}
167+
168+
///@endcond
169+
170+
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
/***************************************************************************
2+
qgsxyzvectortiledataprovider.h
3+
--------------------------------------
4+
Date : March 2020
5+
Copyright : (C) 2020 by Martin Dobias
6+
Email : wonder dot sk at gmail dot com
7+
***************************************************************************
8+
* *
9+
* This program is free software; you can redistribute it and/or modify *
10+
* it under the terms of the GNU General Public License as published by *
11+
* the Free Software Foundation; either version 2 of the License, or *
12+
* (at your option) any later version. *
13+
* *
14+
***************************************************************************/
15+
16+
#ifndef QGSXYZVECTORTILEDATAPROVIDER_H
17+
#define QGSXYZVECTORTILEDATAPROVIDER_H
18+
19+
#include "qgis_core.h"
20+
#include "qgis_sip.h"
21+
#include "qgsvectortiledataprovider.h"
22+
23+
#define SIP_NO_FILE
24+
25+
///@cond PRIVATE
26+
class CORE_EXPORT QgsXyzVectorTileDataProvider : public QgsVectorTileDataProvider
27+
{
28+
Q_OBJECT
29+
30+
public:
31+
QgsXyzVectorTileDataProvider( const QString &uri,
32+
const QgsDataProvider::ProviderOptions &providerOptions,
33+
QgsDataProvider::ReadFlags flags );
34+
35+
QgsVectorTileDataProvider *clone() const override;
36+
QString sourcePath() const override;
37+
bool isValid() const override;
38+
QgsCoordinateReferenceSystem crs() const override;
39+
bool supportsAsync() const override;
40+
QByteArray readTile( const QgsTileMatrix &tileMatrix, const QgsTileXYZ &id, QgsFeedback *feedback = nullptr ) const override;
41+
QList<QgsVectorTileRawData> readTiles( const QgsTileMatrix &, const QVector<QgsTileXYZ> &tiles, QgsFeedback *feedback = nullptr ) const override;
42+
QNetworkRequest tileRequest( const QgsTileMatrix &tileMatrix, const QgsTileXYZ &id, Qgis::RendererUsage usage ) const override;
43+
44+
protected:
45+
46+
QString mAuthCfg;
47+
QgsHttpHeaders mHeaders;
48+
49+
private:
50+
51+
//! Returns raw tile data for a single tile, doing a HTTP request. Block the caller until tile data are downloaded.
52+
static QByteArray loadFromNetwork( const QgsTileXYZ &id,
53+
const QgsTileMatrix &tileMatrix,
54+
const QString &requestUrl,
55+
const QString &authid,
56+
const QgsHttpHeaders &headers,
57+
QgsFeedback *feedback = nullptr );
58+
59+
};
60+
61+
///@endcond
62+
63+
#endif // QGSXYZVECTORTILEDATAPROVIDER_H

0 commit comments

Comments
 (0)
Please sign in to comment.