Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Use tile matrix set in more QgsVectorTileDataProvider methods
This gives more flexibility for the individual vector tile data
providers to handle zoom levels using custom logic
  • Loading branch information
nyalldawson committed May 10, 2023
1 parent d459766 commit aee823a
Show file tree
Hide file tree
Showing 12 changed files with 38 additions and 38 deletions.
4 changes: 2 additions & 2 deletions src/core/vectortile/qgsmbtilesvectortiledataprovider.cpp
Expand Up @@ -150,7 +150,7 @@ const QgsVectorTileMatrixSet &QgsMbTilesVectorTileDataProvider::tileMatrixSet()
return mMatrixSet;
}

QByteArray QgsMbTilesVectorTileDataProvider::readTile( const QgsTileMatrix &, const QgsTileXYZ &id, QgsFeedback *feedback ) const
QByteArray QgsMbTilesVectorTileDataProvider::readTile( const QgsTileMatrixSet &, const QgsTileXYZ &id, QgsFeedback *feedback ) const
{
QGIS_PROTECT_QOBJECT_THREAD_ACCESS

Expand All @@ -162,7 +162,7 @@ QByteArray QgsMbTilesVectorTileDataProvider::readTile( const QgsTileMatrix &, co
return loadFromMBTiles( mbReader, id, feedback );
}

QList<QgsVectorTileRawData> QgsMbTilesVectorTileDataProvider::readTiles( const QgsTileMatrix &, const QVector<QgsTileXYZ> &tiles, QgsFeedback *feedback ) const
QList<QgsVectorTileRawData> QgsMbTilesVectorTileDataProvider::readTiles( const QgsTileMatrixSet &, const QVector<QgsTileXYZ> &tiles, QgsFeedback *feedback ) const
{
QGIS_PROTECT_QOBJECT_THREAD_ACCESS

Expand Down
4 changes: 2 additions & 2 deletions src/core/vectortile/qgsmbtilesvectortiledataprovider.h
Expand Up @@ -52,8 +52,8 @@ class CORE_EXPORT QgsMbTilesVectorTileDataProvider : public QgsVectorTileDataPro
QgsRectangle extent() const override;
QgsCoordinateReferenceSystem crs() const override;
const QgsVectorTileMatrixSet &tileMatrixSet() const override;
QByteArray readTile( const QgsTileMatrix &tileMatrix, const QgsTileXYZ &id, QgsFeedback *feedback = nullptr ) const override;
QList<QgsVectorTileRawData> readTiles( const QgsTileMatrix &, const QVector<QgsTileXYZ> &tiles, QgsFeedback *feedback = nullptr ) const override;
QByteArray readTile( const QgsTileMatrixSet &tileMatrixSet, const QgsTileXYZ &id, QgsFeedback *feedback = nullptr ) const override;
QList<QgsVectorTileRawData> readTiles( const QgsTileMatrixSet &, const QVector<QgsTileXYZ> &tiles, QgsFeedback *feedback = nullptr ) const override;

static QString MB_TILES_VECTOR_TILE_DATA_PROVIDER_KEY;
static QString MB_TILES_VECTOR_TILE_DATA_PROVIDER_DESCRIPTION;
Expand Down
2 changes: 1 addition & 1 deletion src/core/vectortile/qgsvectortiledataprovider.cpp
Expand Up @@ -61,7 +61,7 @@ bool QgsVectorTileDataProvider::supportsAsync() const
return false;
}

QNetworkRequest QgsVectorTileDataProvider::tileRequest( const QgsTileMatrix &, const QgsTileXYZ &, Qgis::RendererUsage ) const
QNetworkRequest QgsVectorTileDataProvider::tileRequest( const QgsTileMatrixSet &, const QgsTileXYZ &, Qgis::RendererUsage ) const
{
QGIS_PROTECT_QOBJECT_THREAD_ACCESS

Expand Down
8 changes: 4 additions & 4 deletions src/core/vectortile/qgsvectortiledataprovider.h
Expand Up @@ -20,7 +20,7 @@
#include "qgis_sip.h"
#include "qgsdataprovider.h"

class QgsTileMatrix;
class QgsTileMatrixSet;
class QgsTileXYZ;
class QgsVectorTileRawData;
class QgsVectorTileMatrixSet;
Expand Down Expand Up @@ -105,19 +105,19 @@ class CORE_EXPORT QgsVectorTileDataProvider : public QgsDataProvider
/**
* Returns raw tile data for a single tile.
*/
virtual QByteArray readTile( const QgsTileMatrix &tileMatrix, const QgsTileXYZ &id, QgsFeedback *feedback = nullptr ) const = 0;
virtual QByteArray readTile( const QgsTileMatrixSet &tileMatrixSet, const QgsTileXYZ &id, QgsFeedback *feedback = nullptr ) const = 0;

/**
* Returns raw tile data for a range of tiles.
*/
virtual QList<QgsVectorTileRawData> readTiles( const QgsTileMatrix &tileMatrix, const QVector<QgsTileXYZ> &tiles, QgsFeedback *feedback = nullptr ) const = 0;
virtual QList<QgsVectorTileRawData> readTiles( const QgsTileMatrixSet &tileMatrixSet, const QVector<QgsTileXYZ> &tiles, QgsFeedback *feedback = nullptr ) const = 0;

/**
* Returns a network request for a tile.
*
* The default implementation returns an invalid request.
*/
virtual QNetworkRequest tileRequest( const QgsTileMatrix &tileMatrix, const QgsTileXYZ &id, Qgis::RendererUsage usage ) const;
virtual QNetworkRequest tileRequest( const QgsTileMatrixSet &tileMatrixSet, const QgsTileXYZ &id, Qgis::RendererUsage usage ) const;

/**
* Returns the style definition for the provider, if available.
Expand Down
3 changes: 1 addition & 2 deletions src/core/vectortile/qgsvectortilelayer.cpp
Expand Up @@ -575,8 +575,7 @@ QByteArray QgsVectorTileLayer::getRawTile( QgsTileXYZ tileID )
if ( !vtProvider )
return QByteArray();

const QgsTileMatrix tileMatrix = mMatrixSet.tileMatrix( tileID.zoomLevel() );
return vtProvider->readTile( tileMatrix, tileID );
return vtProvider->readTile( mMatrixSet, tileID );
}

void QgsVectorTileLayer::setRenderer( QgsVectorTileRenderer *r )
Expand Down
6 changes: 3 additions & 3 deletions src/core/vectortile/qgsvectortilelayerrenderer.cpp
Expand Up @@ -110,13 +110,13 @@ bool QgsVectorTileLayerRenderer::render()
{
QElapsedTimer tFetch;
tFetch.start();
rawTiles = QgsVectorTileLoader::blockingFetchTileRawData( mDataProvider.get(), mTileMatrix, viewCenter, mTileRange, mFeedback.get() );
rawTiles = QgsVectorTileLoader::blockingFetchTileRawData( mDataProvider.get(), mTileMatrixSet, viewCenter, mTileRange, mTileZoom, mFeedback.get() );
QgsDebugMsgLevel( QStringLiteral( "Tile fetching time: %1" ).arg( tFetch.elapsed() / 1000. ), 2 );
QgsDebugMsgLevel( QStringLiteral( "Fetched tiles: %1" ).arg( rawTiles.count() ), 2 );
}
else
{
asyncLoader.reset( new QgsVectorTileLoader( mDataProvider.get(), mTileMatrix, mTileRange, viewCenter, mFeedback.get(), renderContext()->rendererUsage() ) );
asyncLoader.reset( new QgsVectorTileLoader( mDataProvider.get(), mTileMatrixSet, mTileRange, mTileZoom, viewCenter, mFeedback.get(), renderContext()->rendererUsage() ) );
QObject::connect( asyncLoader.get(), &QgsVectorTileLoader::tileRequestFinished, asyncLoader.get(), [this]( const QgsVectorTileRawData & rawTile )
{
QgsDebugMsgLevel( QStringLiteral( "Got tile asynchronously: " ) + rawTile.id.toString(), 2 );
Expand Down Expand Up @@ -234,7 +234,7 @@ void QgsVectorTileLayerRenderer::decodeAndDrawTile( const QgsVectorTileRawData &

try
{
tile.setTilePolygon( QgsVectorTileUtils::tilePolygon( rawTile.id, ct, mTileMatrix, ctx.mapToPixel() ) );
tile.setTilePolygon( QgsVectorTileUtils::tilePolygon( rawTile.id, ct, mTileMatrixSet.tileMatrix( rawTile.id.zoomLevel() ), ctx.mapToPixel() ) );
}
catch ( QgsCsException & )
{
Expand Down
16 changes: 8 additions & 8 deletions src/core/vectortile/qgsvectortileloader.cpp
Expand Up @@ -24,7 +24,7 @@
#include <QEventLoop>


QgsVectorTileLoader::QgsVectorTileLoader( const QgsVectorTileDataProvider *provider, const QgsTileMatrix &tileMatrix, const QgsTileRange &range, const QPointF &viewCenter, QgsFeedback *feedback, Qgis::RendererUsage usage )
QgsVectorTileLoader::QgsVectorTileLoader( const QgsVectorTileDataProvider *provider, const QgsTileMatrixSet &tileMatrixSet, const QgsTileRange &range, int zoomLevel, const QPointF &viewCenter, QgsFeedback *feedback, Qgis::RendererUsage usage )
: mEventLoop( new QEventLoop )
, mFeedback( feedback )
{
Expand All @@ -39,11 +39,11 @@ QgsVectorTileLoader::QgsVectorTileLoader( const QgsVectorTileDataProvider *provi
}

QgsDebugMsgLevel( QStringLiteral( "Starting network loader" ), 2 );
QVector<QgsTileXYZ> tiles = QgsVectorTileUtils::tilesInRange( range, tileMatrix.zoomLevel() );
QVector<QgsTileXYZ> tiles = QgsVectorTileUtils::tilesInRange( range, zoomLevel );
QgsVectorTileUtils::sortTilesByDistanceFromCenter( tiles, viewCenter );
for ( QgsTileXYZ id : std::as_const( tiles ) )
{
loadFromNetworkAsync( id, tileMatrix, provider, usage );
loadFromNetworkAsync( id, tileMatrixSet, provider, usage );
}
}

Expand Down Expand Up @@ -76,9 +76,9 @@ void QgsVectorTileLoader::downloadBlocking()
Q_ASSERT( mReplies.isEmpty() );
}

void QgsVectorTileLoader::loadFromNetworkAsync( const QgsTileXYZ &id, const QgsTileMatrix &tileMatrix, const QgsVectorTileDataProvider *provider, Qgis::RendererUsage usage )
void QgsVectorTileLoader::loadFromNetworkAsync( const QgsTileXYZ &id, const QgsTileMatrixSet &tileMatrixSet, const QgsVectorTileDataProvider *provider, Qgis::RendererUsage usage )
{
QNetworkRequest request = provider->tileRequest( tileMatrix, id, usage );
QNetworkRequest request = provider->tileRequest( tileMatrixSet, id, usage );

QgsTileDownloadManagerReply *reply = QgsApplication::tileDownloadManager()->get( request );
connect( reply, &QgsTileDownloadManagerReply::finished, this, &QgsVectorTileLoader::tileReplyFinished );
Expand Down Expand Up @@ -147,16 +147,16 @@ QString QgsVectorTileLoader::error() const

//////

QList<QgsVectorTileRawData> QgsVectorTileLoader::blockingFetchTileRawData( const QgsVectorTileDataProvider *provider, const QgsTileMatrix &tileMatrix, const QPointF &viewCenter, const QgsTileRange &range, QgsFeedback *feedback )
QList<QgsVectorTileRawData> QgsVectorTileLoader::blockingFetchTileRawData( const QgsVectorTileDataProvider *provider, const QgsTileMatrixSet &tileMatrixSet, const QPointF &viewCenter, const QgsTileRange &range, int zoomLevel, QgsFeedback *feedback )
{
if ( feedback && feedback->isCanceled() )
return {};

QVector<QgsTileXYZ> tiles = QgsVectorTileUtils::tilesInRange( range, tileMatrix.zoomLevel() );
QVector<QgsTileXYZ> tiles = QgsVectorTileUtils::tilesInRange( range, zoomLevel );

// if a tile matrix results in a HUGE number of tile requests, we skip the sort -- it can be expensive
if ( tiles.size() < 10000 )
QgsVectorTileUtils::sortTilesByDistanceFromCenter( tiles, viewCenter );

return provider->readTiles( tileMatrix, tiles, feedback );
return provider->readTiles( tileMatrixSet, tiles, feedback );
}
7 changes: 4 additions & 3 deletions src/core/vectortile/qgsvectortileloader.h
Expand Up @@ -62,17 +62,18 @@ class QgsVectorTileLoader : public QObject
//! Returns raw tile data for the specified range of tiles. Blocks the caller until all tiles are fetched.
static QList<QgsVectorTileRawData> blockingFetchTileRawData(
const QgsVectorTileDataProvider *provider,
const QgsTileMatrix &tileMatrix,
const QgsTileMatrixSet &tileMatrixSet,
const QPointF &viewCenter,
const QgsTileRange &range,
int zoomLevel,
QgsFeedback *feedback = nullptr );

//
// non-static stuff
//

//! Constructs tile loader for doing asynchronous requests and starts network requests
QgsVectorTileLoader( const QgsVectorTileDataProvider *provider, const QgsTileMatrix &tileMatrix, const QgsTileRange &range, const QPointF &viewCenter,
QgsVectorTileLoader( const QgsVectorTileDataProvider *provider, const QgsTileMatrixSet &tileMatrixSet, const QgsTileRange &range, int zoomLevel, const QPointF &viewCenter,
QgsFeedback *feedback, Qgis::RendererUsage usage );
~QgsVectorTileLoader();

Expand All @@ -83,7 +84,7 @@ class QgsVectorTileLoader : public QObject
QString error() const;

private:
void loadFromNetworkAsync( const QgsTileXYZ &id, const QgsTileMatrix &tileMatrix, const QgsVectorTileDataProvider *provider, Qgis::RendererUsage usage );
void loadFromNetworkAsync( const QgsTileXYZ &id, const QgsTileMatrixSet &tileMatrixSet, const QgsVectorTileDataProvider *provider, Qgis::RendererUsage usage );

private slots:
void tileReplyFinished();
Expand Down
4 changes: 2 additions & 2 deletions src/core/vectortile/qgsvtpkvectortiledataprovider.cpp
Expand Up @@ -171,7 +171,7 @@ QImage QgsVtpkVectorTileDataProvider::spriteImage() const
return mSpriteImage;
}

QByteArray QgsVtpkVectorTileDataProvider::readTile( const QgsTileMatrix &, const QgsTileXYZ &id, QgsFeedback *feedback ) const
QByteArray QgsVtpkVectorTileDataProvider::readTile( const QgsTileMatrixSet &, const QgsTileXYZ &id, QgsFeedback *feedback ) const
{
QGIS_PROTECT_QOBJECT_THREAD_ACCESS

Expand All @@ -182,7 +182,7 @@ QByteArray QgsVtpkVectorTileDataProvider::readTile( const QgsTileMatrix &, const
return loadFromVtpk( reader, id, feedback );
}

QList<QgsVectorTileRawData> QgsVtpkVectorTileDataProvider::readTiles( const QgsTileMatrix &, const QVector<QgsTileXYZ> &tiles, QgsFeedback *feedback ) const
QList<QgsVectorTileRawData> QgsVtpkVectorTileDataProvider::readTiles( const QgsTileMatrixSet &, const QVector<QgsTileXYZ> &tiles, QgsFeedback *feedback ) const
{
QGIS_PROTECT_QOBJECT_THREAD_ACCESS

Expand Down
4 changes: 2 additions & 2 deletions src/core/vectortile/qgsvtpkvectortiledataprovider.h
Expand Up @@ -58,8 +58,8 @@ class CORE_EXPORT QgsVtpkVectorTileDataProvider : public QgsVectorTileDataProvid
QVariantMap styleDefinition() const override;
QVariantMap spriteDefinition() const override;
QImage spriteImage() const override;
QByteArray readTile( const QgsTileMatrix &tileMatrix, const QgsTileXYZ &id, QgsFeedback *feedback = nullptr ) const override;
QList<QgsVectorTileRawData> readTiles( const QgsTileMatrix &, const QVector<QgsTileXYZ> &tiles, QgsFeedback *feedback = nullptr ) const override;
QByteArray readTile( const QgsTileMatrixSet &tileMatrix, const QgsTileXYZ &id, QgsFeedback *feedback = nullptr ) const override;
QList<QgsVectorTileRawData> readTiles( const QgsTileMatrixSet &, const QVector<QgsTileXYZ> &tiles, QgsFeedback *feedback = nullptr ) const override;

static QString DATA_PROVIDER_KEY;
static QString DATA_PROVIDER_DESCRIPTION;
Expand Down
12 changes: 6 additions & 6 deletions src/core/vectortile/qgsxyzvectortiledataprovider.cpp
Expand Up @@ -57,12 +57,12 @@ bool QgsXyzVectorTileDataProviderBase::supportsAsync() const
return true;
}

QByteArray QgsXyzVectorTileDataProviderBase::readTile( const QgsTileMatrix &tileMatrix, const QgsTileXYZ &id, QgsFeedback *feedback ) const
QByteArray QgsXyzVectorTileDataProviderBase::readTile( const QgsTileMatrixSet &set, const QgsTileXYZ &id, QgsFeedback *feedback ) const
{
return loadFromNetwork( id, tileMatrix, sourcePath(), mAuthCfg, mHeaders, feedback );
return loadFromNetwork( id, set.tileMatrix( id.zoomLevel() ), sourcePath(), mAuthCfg, mHeaders, feedback );
}

QList<QgsVectorTileRawData> QgsXyzVectorTileDataProviderBase::readTiles( const QgsTileMatrix &tileMatrix, const QVector<QgsTileXYZ> &tiles, QgsFeedback *feedback ) const
QList<QgsVectorTileRawData> QgsXyzVectorTileDataProviderBase::readTiles( const QgsTileMatrixSet &set, const QVector<QgsTileXYZ> &tiles, QgsFeedback *feedback ) const
{
QList<QgsVectorTileRawData> rawTiles;
rawTiles.reserve( tiles.size() );
Expand All @@ -72,7 +72,7 @@ QList<QgsVectorTileRawData> QgsXyzVectorTileDataProviderBase::readTiles( const Q
if ( feedback && feedback->isCanceled() )
break;

const QByteArray rawData = loadFromNetwork( id, tileMatrix, source, mAuthCfg, mHeaders, feedback );
const QByteArray rawData = loadFromNetwork( id, set.tileMatrix( id.zoomLevel() ), source, mAuthCfg, mHeaders, feedback );
if ( !rawData.isEmpty() )
{
rawTiles.append( QgsVectorTileRawData( id, rawData ) );
Expand All @@ -81,7 +81,7 @@ QList<QgsVectorTileRawData> QgsXyzVectorTileDataProviderBase::readTiles( const Q
return rawTiles;
}

QNetworkRequest QgsXyzVectorTileDataProviderBase::tileRequest( const QgsTileMatrix &tileMatrix, const QgsTileXYZ &id, Qgis::RendererUsage usage ) const
QNetworkRequest QgsXyzVectorTileDataProviderBase::tileRequest( const QgsTileMatrixSet &set, const QgsTileXYZ &id, Qgis::RendererUsage usage ) const
{
QString urlTemplate = sourcePath();

Expand All @@ -101,7 +101,7 @@ QNetworkRequest QgsXyzVectorTileDataProviderBase::tileRequest( const QgsTileMatr
}
}

const QString url = QgsVectorTileUtils::formatXYZUrlTemplate( urlTemplate, id, tileMatrix );
const QString url = QgsVectorTileUtils::formatXYZUrlTemplate( urlTemplate, id, set.tileMatrix( id.zoomLevel() ) );

QNetworkRequest request( url );
QgsSetRequestInitiatorClass( request, QStringLiteral( "QgsXyzVectorTileDataProvider" ) );
Expand Down
6 changes: 3 additions & 3 deletions src/core/vectortile/qgsxyzvectortiledataprovider.h
Expand Up @@ -42,9 +42,9 @@ class CORE_EXPORT QgsXyzVectorTileDataProviderBase : public QgsVectorTileDataPro
QgsXyzVectorTileDataProviderBase &operator=( const QgsXyzVectorTileDataProviderBase &other ) = delete;

bool supportsAsync() const override;
QByteArray readTile( const QgsTileMatrix &tileMatrix, const QgsTileXYZ &id, QgsFeedback *feedback = nullptr ) const override;
QList<QgsVectorTileRawData> readTiles( const QgsTileMatrix &, const QVector<QgsTileXYZ> &tiles, QgsFeedback *feedback = nullptr ) const override;
QNetworkRequest tileRequest( const QgsTileMatrix &tileMatrix, const QgsTileXYZ &id, Qgis::RendererUsage usage ) const override;
QByteArray readTile( const QgsTileMatrixSet &tileMatrix, const QgsTileXYZ &id, QgsFeedback *feedback = nullptr ) const override;
QList<QgsVectorTileRawData> readTiles( const QgsTileMatrixSet &, const QVector<QgsTileXYZ> &tiles, QgsFeedback *feedback = nullptr ) const override;
QNetworkRequest tileRequest( const QgsTileMatrixSet &tileMatrix, const QgsTileXYZ &id, Qgis::RendererUsage usage ) const override;

protected:

Expand Down

0 comments on commit aee823a

Please sign in to comment.