Skip to content

Commit

Permalink
Use data provider to get tiles
Browse files Browse the repository at this point in the history
  • Loading branch information
nyalldawson committed Mar 20, 2023
1 parent f56c682 commit abb9328
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 97 deletions.
2 changes: 1 addition & 1 deletion src/core/vectortile/qgsvectortilelayerrenderer.cpp
Expand Up @@ -137,7 +137,7 @@ bool QgsVectorTileLayerRenderer::render()
{
QElapsedTimer tFetch;
tFetch.start();
rawTiles = QgsVectorTileLoader::blockingFetchTileRawData( mSourceType, mSourcePath, mTileMatrix, viewCenter, mTileRange, mAuthCfg, mHeaders, mFeedback.get() );
rawTiles = QgsVectorTileLoader::blockingFetchTileRawData( mDataProvider.get(), mTileMatrix, viewCenter, mTileRange, mFeedback.get() );
QgsDebugMsgLevel( QStringLiteral( "Tile fetching time: %1" ).arg( tFetch.elapsed() / 1000. ), 2 );
QgsDebugMsgLevel( QStringLiteral( "Fetched tiles: %1" ).arg( rawTiles.count() ), 2 );
}
Expand Down
79 changes: 4 additions & 75 deletions src/core/vectortile/qgsvectortileloader.cpp
Expand Up @@ -17,16 +17,14 @@

#include <QEventLoop>

#include "qgsblockingnetworkrequest.h"
#include "qgslogger.h"
#include "qgsmbtiles.h"
#include "qgsvtpktiles.h"
#include "qgsnetworkaccessmanager.h"
#include "qgsvectortileutils.h"
#include "qgsapplication.h"
#include "qgsauthmanager.h"
#include "qgsmessagelog.h"
#include "qgsziputils.h"
#include "qgsvectortilelayer.h"
#include "qgsfeedback.h"

#include "qgstiledownloadmanager.h"

Expand Down Expand Up @@ -172,26 +170,8 @@ QString QgsVectorTileLoader::error() const

//////

QList<QgsVectorTileRawData> QgsVectorTileLoader::blockingFetchTileRawData( const QString &sourceType, const QString &sourcePath, const QgsTileMatrix &tileMatrix, const QPointF &viewCenter, const QgsTileRange &range, const QString &authid, const QgsHttpHeaders &headers, QgsFeedback *feedback )
QList<QgsVectorTileRawData> QgsVectorTileLoader::blockingFetchTileRawData( const QgsVectorTileDataProvider *provider, const QgsTileMatrix &tileMatrix, const QPointF &viewCenter, const QgsTileRange &range, QgsFeedback *feedback )
{
QList<QgsVectorTileRawData> rawTiles;

std::unique_ptr< QgsMbTiles > mbReader;
std::unique_ptr< QgsVtpkTiles > vtpkReader;
bool isUrl = ( sourceType == QLatin1String( "xyz" ) );
if ( sourceType == QLatin1String( "vtpk" ) )
{
vtpkReader = std::make_unique< QgsVtpkTiles >( sourcePath );
vtpkReader->open();
}
else if ( !isUrl )
{
mbReader = std::make_unique< QgsMbTiles >( sourcePath );
bool res = mbReader->open();
Q_UNUSED( res )
Q_ASSERT( res );
}

if ( feedback && feedback->isCanceled() )
return {};

Expand All @@ -201,56 +181,5 @@ QList<QgsVectorTileRawData> QgsVectorTileLoader::blockingFetchTileRawData( const
if ( tiles.size() < 10000 )
QgsVectorTileUtils::sortTilesByDistanceFromCenter( tiles, viewCenter );

rawTiles.reserve( tiles.size() );
for ( QgsTileXYZ id : std::as_const( tiles ) )
{
if ( feedback && feedback->isCanceled() )
return rawTiles;

QByteArray rawData = isUrl ? loadFromNetwork( id, tileMatrix, sourcePath, authid, headers, feedback )
: ( mbReader ? loadFromMBTiles( id, *mbReader ) : loadFromVtpk( id, *vtpkReader ) );
if ( !rawData.isEmpty() )
{
rawTiles.append( QgsVectorTileRawData( id, rawData ) );
}
}
return rawTiles;
}

QByteArray QgsVectorTileLoader::loadFromNetwork( const QgsTileXYZ &id, const QgsTileMatrix &tileMatrix, const QString &requestUrl, const QString &authid, const QgsHttpHeaders &headers, QgsFeedback *feedback )
{
QString url = QgsVectorTileUtils::formatXYZUrlTemplate( requestUrl, id, tileMatrix );
QNetworkRequest nr;
nr.setUrl( QUrl( url ) );

headers.updateNetworkRequest( nr );

QgsBlockingNetworkRequest req;
req.setAuthCfg( authid );
QgsDebugMsgLevel( QStringLiteral( "Blocking request: " ) + url, 2 );
QgsBlockingNetworkRequest::ErrorCode errCode = req.get( nr, false, feedback );
if ( errCode != QgsBlockingNetworkRequest::NoError )
{
QgsDebugMsg( QStringLiteral( "Request failed: " ) + url );
return QByteArray();
}
QgsNetworkReplyContent reply = req.reply();
QgsDebugMsgLevel( QStringLiteral( "Request successful, content size %1" ).arg( reply.content().size() ), 2 );
return reply.content();
}


QByteArray QgsVectorTileLoader::loadFromMBTiles( const QgsTileXYZ &id, QgsMbTiles &mbTileReader, QgsFeedback *feedback )
{

}

QByteArray QgsVectorTileLoader::loadFromVtpk( const QgsTileXYZ &id, QgsVtpkTiles &vtpkTileReader )
{
QByteArray tileData = vtpkTileReader.tileData( id.zoomLevel(), id.column(), id.row() );
if ( tileData.isEmpty() )
{
return QByteArray();
}
return tileData;
return provider->readTiles( tileMatrix, tiles, feedback );
}
28 changes: 7 additions & 21 deletions src/core/vectortile/qgsvectortileloader.h
Expand Up @@ -46,10 +46,10 @@ class QgsVectorTileRawData
class QNetworkReply;
class QEventLoop;

class QgsMbTiles;
class QgsVtpkTiles;

class QgsTileDownloadManagerReply;
class QgsVectorTileDataProvider;

/**
* \ingroup core
Expand All @@ -63,26 +63,12 @@ class QgsVectorTileLoader : public QObject
public:

//! Returns raw tile data for the specified range of tiles. Blocks the caller until all tiles are fetched.
static QList<QgsVectorTileRawData> blockingFetchTileRawData( const QString &sourceType,
const QString &sourcePath,
const QgsTileMatrix &tileMatrix,
const QPointF &viewCenter,
const QgsTileRange &range,
const QString &authid,
const QgsHttpHeaders &headers,
QgsFeedback *feedback = nullptr );

//! Returns raw tile data for a single tile, doing a HTTP request. Block the caller until tile data are downloaded.
static QByteArray loadFromNetwork( const QgsTileXYZ &id,
const QgsTileMatrix &tileMatrix,
const QString &requestUrl,
const QString &authid,
const QgsHttpHeaders &headers,
QgsFeedback *feedback = nullptr );
static QByteArray loadFromMBTiles( const QgsTileXYZ &id, QgsMbTiles &mbTileReader, QgsFeedback *feedback = nullptr );

//! Returns raw tile data for a single tile loaded from VTPK file
static QByteArray loadFromVtpk( const QgsTileXYZ &id, QgsVtpkTiles &vtpkTileReader );
static QList<QgsVectorTileRawData> blockingFetchTileRawData(
const QgsVectorTileDataProvider *provider,
const QgsTileMatrix &tileMatrix,
const QPointF &viewCenter,
const QgsTileRange &range,
QgsFeedback *feedback = nullptr );

//
// non-static stuff
Expand Down

0 comments on commit abb9328

Please sign in to comment.