Skip to content

Commit f56c682

Browse files
committedMar 20, 2023
Move xyz tile loading to data provider
1 parent 5c78cf4 commit f56c682

File tree

2 files changed

+61
-55
lines changed

2 files changed

+61
-55
lines changed
 

‎src/core/vectortile/qgsvectortilelayer.cpp

Lines changed: 44 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1367,7 +1367,11 @@ bool QgsVectorTileDataProvider::supportsAsync() const
13671367
QgsXyzVectorTileDataProvider::QgsXyzVectorTileDataProvider( const QString &uri, const ProviderOptions &providerOptions, ReadFlags flags )
13681368
: QgsVectorTileDataProvider( uri, providerOptions, flags )
13691369
{
1370+
QgsDataSourceUri dsUri;
1371+
dsUri.setEncodedUri( uri );
13701372

1373+
mAuthCfg = dsUri.authConfigId();
1374+
mHeaders = dsUri.httpHeaders();
13711375
}
13721376

13731377
QgsVectorTileDataProvider *QgsXyzVectorTileDataProvider::clone() const
@@ -1409,27 +1413,48 @@ bool QgsXyzVectorTileDataProvider::supportsAsync() const
14091413

14101414
QByteArray QgsXyzVectorTileDataProvider::readTile( const QgsTileMatrix &tileMatrix, const QgsTileXYZ &id, QgsFeedback *feedback ) const
14111415
{
1412-
QgsDataSourceUri dsUri;
1413-
dsUri.setEncodedUri( dataSourceUri() );
1414-
const QString authcfg = dsUri.authConfigId();
1415-
1416-
const QgsTileRange tileRange( id.column(), id.column(), id.row(), id.row() );
1417-
1418-
QList<QgsVectorTileRawData> rawTiles = QgsVectorTileLoader::blockingFetchTileRawData( QStringLiteral( "xyz" ),
1419-
dsUri.param( QStringLiteral( "url" ) ),
1420-
tileMatrix,
1421-
QPointF(),
1422-
tileRange,
1423-
authcfg,
1424-
dsUri.httpHeaders() );
1425-
if ( rawTiles.isEmpty() )
1426-
return QByteArray();
1427-
return rawTiles.first().data;
1416+
return loadFromNetwork( id, tileMatrix, sourcePath(), mAuthCfg, mHeaders, feedback );
14281417
}
14291418

1430-
QList<QgsVectorTileRawData> QgsXyzVectorTileDataProvider::readTiles( const QgsTileMatrix &, const QVector<QgsTileXYZ> &tiles, QgsFeedback *feedback ) const
1419+
QList<QgsVectorTileRawData> QgsXyzVectorTileDataProvider::readTiles( const QgsTileMatrix &tileMatrix, const QVector<QgsTileXYZ> &tiles, QgsFeedback *feedback ) const
14311420
{
1421+
QList<QgsVectorTileRawData> rawTiles;
1422+
rawTiles.reserve( tiles.size() );
1423+
const QString source = sourcePath();
1424+
for ( QgsTileXYZ id : std::as_const( tiles ) )
1425+
{
1426+
if ( feedback && feedback->isCanceled() )
1427+
break;
14321428

1429+
const QByteArray rawData = loadFromNetwork( id, tileMatrix, source, mAuthCfg, mHeaders, feedback );
1430+
if ( !rawData.isEmpty() )
1431+
{
1432+
rawTiles.append( QgsVectorTileRawData( id, rawData ) );
1433+
}
1434+
}
1435+
return rawTiles;
1436+
}
1437+
1438+
QByteArray QgsXyzVectorTileDataProvider::loadFromNetwork( const QgsTileXYZ &id, const QgsTileMatrix &tileMatrix, const QString &requestUrl, const QString &authid, const QgsHttpHeaders &headers, QgsFeedback *feedback )
1439+
{
1440+
QString url = QgsVectorTileUtils::formatXYZUrlTemplate( requestUrl, id, tileMatrix );
1441+
QNetworkRequest nr;
1442+
nr.setUrl( QUrl( url ) );
1443+
1444+
headers.updateNetworkRequest( nr );
1445+
1446+
QgsBlockingNetworkRequest req;
1447+
req.setAuthCfg( authid );
1448+
QgsDebugMsgLevel( QStringLiteral( "Blocking request: " ) + url, 2 );
1449+
QgsBlockingNetworkRequest::ErrorCode errCode = req.get( nr, false, feedback );
1450+
if ( errCode != QgsBlockingNetworkRequest::NoError )
1451+
{
1452+
QgsDebugMsg( QStringLiteral( "Request failed: " ) + url );
1453+
return QByteArray();
1454+
}
1455+
QgsNetworkReplyContent reply = req.reply();
1456+
QgsDebugMsgLevel( QStringLiteral( "Request successful, content size %1" ).arg( reply.content().size() ), 2 );
1457+
return reply.content();
14331458
}
14341459

14351460
//
@@ -1474,7 +1499,7 @@ QgsCoordinateReferenceSystem QgsMbTilesVectorTileDataProvider::crs() const
14741499
return QgsCoordinateReferenceSystem( QStringLiteral( "EPSG:3857" ) );
14751500
}
14761501

1477-
QByteArray QgsMbTilesVectorTileDataProvider::readTile( const QgsTileMatrix &tileMatrix, const QgsTileXYZ &id, QgsFeedback *feedback ) const
1502+
QByteArray QgsMbTilesVectorTileDataProvider::readTile( const QgsTileMatrix &, const QgsTileXYZ &id, QgsFeedback *feedback ) const
14781503
{
14791504
QgsDataSourceUri dsUri;
14801505
dsUri.setEncodedUri( dataSourceUri() );
@@ -1622,7 +1647,7 @@ QByteArray QgsVtpkVectorTileDataProvider::loadFromVtpk( QgsVtpkTiles &vtpkTileRe
16221647
//
16231648

16241649
QgsArcGisVectorTileServiceDataProvider::QgsArcGisVectorTileServiceDataProvider( const QString &uri, const QString &sourcePath, const ProviderOptions &providerOptions, ReadFlags flags )
1625-
: QgsVectorTileDataProvider( uri, providerOptions, flags )
1650+
: QgsXyzVectorTileDataProvider( uri, providerOptions, flags )
16261651
, mSourcePath( sourcePath )
16271652
{
16281653

@@ -1651,38 +1676,6 @@ bool QgsArcGisVectorTileServiceDataProvider::isValid() const
16511676
return true;
16521677
}
16531678

1654-
QgsCoordinateReferenceSystem QgsArcGisVectorTileServiceDataProvider::crs() const
1655-
{
1656-
QGIS_PROTECT_QOBJECT_THREAD_ACCESS
1657-
1658-
return QgsCoordinateReferenceSystem( QStringLiteral( "EPSG:3857" ) );
1659-
}
1660-
1661-
QByteArray QgsArcGisVectorTileServiceDataProvider::readTile( const QgsTileMatrix &tileMatrix, const QgsTileXYZ &id, QgsFeedback *feedback ) const
1662-
{
1663-
QgsDataSourceUri dsUri;
1664-
dsUri.setEncodedUri( dataSourceUri() );
1665-
const QString authcfg = dsUri.authConfigId();
1666-
1667-
const QgsTileRange tileRange( id.column(), id.column(), id.row(), id.row() );
1668-
1669-
QList<QgsVectorTileRawData> rawTiles = QgsVectorTileLoader::blockingFetchTileRawData( QStringLiteral( "xyz" ),
1670-
mSourcePath,
1671-
tileMatrix,
1672-
QPointF(),
1673-
tileRange,
1674-
authcfg,
1675-
dsUri.httpHeaders() );
1676-
if ( rawTiles.isEmpty() )
1677-
return QByteArray();
1678-
return rawTiles.first().data;
1679-
}
1680-
1681-
QList<QgsVectorTileRawData> QgsArcGisVectorTileServiceDataProvider::readTiles( const QgsTileMatrix &, const QVector<QgsTileXYZ> &tiles, QgsFeedback *feedback ) const
1682-
{
1683-
1684-
}
1685-
16861679
///@endcond
16871680

16881681

‎src/core/vectortile/qgsvectortilelayer.h

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -374,6 +374,22 @@ class QgsXyzVectorTileDataProvider : public QgsVectorTileDataProvider
374374
bool supportsAsync() const override;
375375
QByteArray readTile( const QgsTileMatrix &tileMatrix, const QgsTileXYZ &id, QgsFeedback *feedback = nullptr ) const override;
376376
QList<QgsVectorTileRawData> readTiles( const QgsTileMatrix &, const QVector<QgsTileXYZ> &tiles, QgsFeedback *feedback = nullptr ) const override;
377+
378+
protected:
379+
380+
QString mAuthCfg;
381+
QgsHttpHeaders mHeaders;
382+
383+
private:
384+
385+
//! Returns raw tile data for a single tile, doing a HTTP request. Block the caller until tile data are downloaded.
386+
static QByteArray loadFromNetwork( const QgsTileXYZ &id,
387+
const QgsTileMatrix &tileMatrix,
388+
const QString &requestUrl,
389+
const QString &authid,
390+
const QgsHttpHeaders &headers,
391+
QgsFeedback *feedback = nullptr );
392+
377393
};
378394

379395
class QgsMbTilesVectorTileDataProvider : public QgsVectorTileDataProvider
@@ -424,7 +440,7 @@ class QgsVtpkVectorTileDataProvider : public QgsVectorTileDataProvider
424440

425441
};
426442

427-
class QgsArcGisVectorTileServiceDataProvider : public QgsVectorTileDataProvider
443+
class QgsArcGisVectorTileServiceDataProvider : public QgsXyzVectorTileDataProvider
428444
{
429445
Q_OBJECT
430446

@@ -436,9 +452,6 @@ class QgsArcGisVectorTileServiceDataProvider : public QgsVectorTileDataProvider
436452
QgsVectorTileDataProvider *clone() const override;
437453
QString sourcePath() const override;
438454
bool isValid() const override;
439-
QgsCoordinateReferenceSystem crs() const override;
440-
QByteArray readTile( const QgsTileMatrix &tileMatrix, const QgsTileXYZ &id, QgsFeedback *feedback = nullptr ) const override;
441-
QList<QgsVectorTileRawData> readTiles( const QgsTileMatrix &, const QVector<QgsTileXYZ> &tiles, QgsFeedback *feedback = nullptr ) const override;
442455

443456
private:
444457

0 commit comments

Comments
 (0)
Please sign in to comment.