Skip to content

Commit

Permalink
Move vector tile style handling to data provider subclasses
Browse files Browse the repository at this point in the history
  • Loading branch information
nyalldawson committed Mar 23, 2023
1 parent 55daeff commit fb8702c
Show file tree
Hide file tree
Showing 8 changed files with 128 additions and 31 deletions.
18 changes: 18 additions & 0 deletions src/core/vectortile/qgsarcgisvectortileservicedataprovider.cpp
Expand Up @@ -105,9 +105,27 @@ QgsCoordinateReferenceSystem QgsArcGisVectorTileServiceDataProvider::crs() const

QgsLayerMetadata QgsArcGisVectorTileServiceDataProvider::layerMetadata() const
{
QGIS_PROTECT_QOBJECT_THREAD_ACCESS

return mLayerMetadata;
}

QVariantMap QgsArcGisVectorTileServiceDataProvider::styleDefinition() const
{
QGIS_PROTECT_QOBJECT_THREAD_ACCESS

return mArcgisStyleConfiguration;
}

QString QgsArcGisVectorTileServiceDataProvider::styleUrl() const
{
QGIS_PROTECT_QOBJECT_THREAD_ACCESS

// for ArcMap VectorTileServices we default to the defaultStyles URL from the layer configuration
return mArcgisLayerConfiguration.value( QStringLiteral( "serviceUri" ) ).toString()
+ '/' + mArcgisLayerConfiguration.value( QStringLiteral( "defaultStyles" ) ).toString();
}

bool QgsArcGisVectorTileServiceDataProvider::setupArcgisVectorTileServiceConnection()
{
QGIS_PROTECT_QOBJECT_THREAD_ACCESS
Expand Down
2 changes: 2 additions & 0 deletions src/core/vectortile/qgsarcgisvectortileservicedataprovider.h
Expand Up @@ -42,6 +42,8 @@ class CORE_EXPORT QgsArcGisVectorTileServiceDataProvider : public QgsXyzVectorTi
QString sourcePath() const override;
QgsCoordinateReferenceSystem crs() const override;
QgsLayerMetadata layerMetadata() const override;
QVariantMap styleDefinition() const override;
QString styleUrl() const;

static QString ARCGIS_VT_SERVICE_DATA_PROVIDER_KEY;
static QString ARCGIS_VT_SERVICE_DATA_PROVIDER_DESCRIPTION;
Expand Down
29 changes: 29 additions & 0 deletions src/core/vectortile/qgsvectortiledataprovider.cpp
Expand Up @@ -17,6 +17,7 @@
#include "qgsthreadingutils.h"

#include <QNetworkRequest>
#include <QImage>

QgsVectorTileDataProvider::QgsVectorTileDataProvider(
const QString &uri,
Expand Down Expand Up @@ -61,5 +62,33 @@ QNetworkRequest QgsVectorTileDataProvider::tileRequest( const QgsTileMatrix &, c
return QNetworkRequest();
}

QVariantMap QgsVectorTileDataProvider::styleDefinition() const
{
QGIS_PROTECT_QOBJECT_THREAD_ACCESS

return QVariantMap();
}

QString QgsVectorTileDataProvider::styleUrl() const
{
QGIS_PROTECT_QOBJECT_THREAD_ACCESS

return QString();
}

QVariantMap QgsVectorTileDataProvider::spriteDefinition() const
{
QGIS_PROTECT_QOBJECT_THREAD_ACCESS

return QVariantMap();
}

QImage QgsVectorTileDataProvider::spriteImage() const
{
QGIS_PROTECT_QOBJECT_THREAD_ACCESS

return QImage();
}



31 changes: 31 additions & 0 deletions src/core/vectortile/qgsvectortiledataprovider.h
Expand Up @@ -108,6 +108,37 @@ class CORE_EXPORT QgsVectorTileDataProvider : public QgsDataProvider
* The default implementation returns an invalid request.
*/
virtual QNetworkRequest tileRequest( const QgsTileMatrix &tileMatrix, const QgsTileXYZ &id, Qgis::RendererUsage usage ) const;

/**
* Returns the style definition for the provider, if available.
*
* \see styleUrl()
* \see spriteDefinition()
*/
virtual QVariantMap styleDefinition() const;

/**
* Returns the URL for the provider style, if available.
*
* If styleDefinition() is empty, then the layer style may be available
* from this URL.
*/
virtual QString styleUrl() const;

/**
* Returns the sprite definition for the provider, if available.
*
* \see spriteImage()
* \see styleDefinition()
*/
virtual QVariantMap spriteDefinition() const;

/**
* Returns the sprite image for the provider, if available.
*
* \see spriteDefinition()
*/
virtual QImage spriteImage() const;
};


Expand Down
41 changes: 13 additions & 28 deletions src/core/vectortile/qgsvectortilelayer.cpp
Expand Up @@ -17,7 +17,6 @@

#include "qgslogger.h"
#include "qgsvectortilelayerrenderer.h"
#include "qgsvtpktiles.h"
#include "qgsvectortilebasiclabeling.h"
#include "qgsvectortilebasicrenderer.h"
#include "qgsvectortilelabeling.h"
Expand All @@ -36,7 +35,6 @@
#include "qgsthreadingutils.h"
#include "qgsproviderregistry.h"
#include "qgsvectortiledataprovider.h"
#include "qgsarcgisvectortileservicedataprovider.h"

#include <QUrl>
#include <QUrlQuery>
Expand Down Expand Up @@ -379,6 +377,9 @@ bool QgsVectorTileLayer::loadDefaultStyleAndSubLayers( QString &error, QStringLi
bool QgsVectorTileLayer::loadDefaultStyleAndSubLayersPrivate( QString &error, QStringList &warnings, QList<QgsMapLayer *> *subLayers )
{
QGIS_PROTECT_QOBJECT_THREAD_ACCESS
QgsVectorTileDataProvider *vtProvider = qgis::down_cast< QgsVectorTileDataProvider *> ( mDataProvider.get() );
if ( !vtProvider )
return false;

QgsDataSourceUri dsUri;
dsUri.setEncodedUri( mDataSource );
Expand All @@ -390,38 +391,22 @@ bool QgsVectorTileLayer::loadDefaultStyleAndSubLayersPrivate( QString &error, QS
{
styleUrl = dsUri.param( QStringLiteral( "styleUrl" ) );
}
else if ( mSourceType == QLatin1String( "xyz" ) && dsUri.param( QStringLiteral( "serviceType" ) ) == QLatin1String( "arcgis" ) )
else
{
// for ArcMap VectorTileServices we default to the defaultStyles URL from the layer configuration
styleUrl = mArcgisLayerConfiguration.value( QStringLiteral( "serviceUri" ) ).toString()
+ '/' + mArcgisLayerConfiguration.value( QStringLiteral( "defaultStyles" ) ).toString();
styleUrl = vtProvider->styleUrl();
}

if ( mSourceType == QLatin1String( "vtpk" ) )
styleDefinition = vtProvider->styleDefinition();
const QVariantMap spriteDefinition = vtProvider->spriteDefinition();
if ( !spriteDefinition.isEmpty() )
{
QgsVtpkTiles reader( sourcePath() );
if ( !reader.open() )
{
QgsDebugMsg( QStringLiteral( "failed to open VTPK file: " ) + sourcePath() );
return false;
}

styleDefinition = reader.styleDefinition();

const QVariantMap spriteDefinition = reader.spriteDefinition();
if ( !spriteDefinition.isEmpty() )
{
const QImage spriteImage = reader.spriteImage();
context.setSprites( spriteImage, spriteDefinition );
}
const QImage spriteImage = vtProvider->spriteImage();
context.setSprites( spriteImage, spriteDefinition );
}
else if ( !mArcgisStyleConfiguration.isEmpty() || !styleUrl.isEmpty() )

if ( !styleDefinition.isEmpty() || !styleUrl.isEmpty() )
{
if ( !mArcgisStyleConfiguration.isEmpty() )
{
styleDefinition = mArcgisStyleConfiguration;
}
else
if ( styleDefinition.isEmpty() )
{
QNetworkRequest request = QNetworkRequest( QUrl( styleUrl ) );

Expand Down
3 changes: 0 additions & 3 deletions src/core/vectortile/qgsvectortilelayer.h
Expand Up @@ -295,9 +295,6 @@ class CORE_EXPORT QgsVectorTileLayer : public QgsMapLayer
//! Whether we draw borders of tiles
bool mTileBorderRendering = false;

QVariantMap mArcgisLayerConfiguration;
QVariantMap mArcgisStyleConfiguration;

QgsCoordinateTransformContext mTransformContext;

std::unique_ptr< QgsDataProvider > mDataProvider;
Expand Down
27 changes: 27 additions & 0 deletions src/core/vectortile/qgsvtpkvectortiledataprovider.cpp
Expand Up @@ -57,6 +57,12 @@ QgsVtpkVectorTileDataProvider::QgsVtpkVectorTileDataProvider( const QString &uri
mCrs = mMatrixSet.crs();
mExtent = reader.extent( transformContext() );
mLayerMetadata = reader.layerMetadata();
mStyleDefinition = reader.styleDefinition();
mSpriteDefinition = reader.spriteDefinition();
if ( !mSpriteDefinition.isEmpty() )
{
mSpriteImage = reader.spriteImage();
}

mIsValid = true;
}
Expand Down Expand Up @@ -131,6 +137,27 @@ const QgsVectorTileMatrixSet &QgsVtpkVectorTileDataProvider::tileMatrixSet() con
return mMatrixSet;
}

QVariantMap QgsVtpkVectorTileDataProvider::styleDefinition() const
{
QGIS_PROTECT_QOBJECT_THREAD_ACCESS

return mStyleDefinition;
}

QVariantMap QgsVtpkVectorTileDataProvider::spriteDefinition() const
{
QGIS_PROTECT_QOBJECT_THREAD_ACCESS

return mSpriteDefinition;
}

QImage QgsVtpkVectorTileDataProvider::spriteImage() const
{
QGIS_PROTECT_QOBJECT_THREAD_ACCESS

return mSpriteImage;
}

QByteArray QgsVtpkVectorTileDataProvider::readTile( const QgsTileMatrix &, const QgsTileXYZ &id, QgsFeedback *feedback ) const
{
QGIS_PROTECT_QOBJECT_THREAD_ACCESS
Expand Down
8 changes: 8 additions & 0 deletions src/core/vectortile/qgsvtpkvectortiledataprovider.h
Expand Up @@ -22,6 +22,8 @@
#include "qgsprovidermetadata.h"
#include "qgsvectortilematrixset.h"

#include <QImage>

#define SIP_NO_FILE

///@cond PRIVATE
Expand All @@ -47,6 +49,9 @@ class CORE_EXPORT QgsVtpkVectorTileDataProvider : public QgsVectorTileDataProvid
QgsRectangle extent() const override;
QgsLayerMetadata layerMetadata() const override;
const QgsVectorTileMatrixSet &tileMatrixSet() const override;
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;

Expand All @@ -62,6 +67,9 @@ class CORE_EXPORT QgsVtpkVectorTileDataProvider : public QgsVectorTileDataProvid
QgsRectangle mExtent;
QgsVectorTileMatrixSet mMatrixSet;
QgsLayerMetadata mLayerMetadata;
QVariantMap mStyleDefinition;
QVariantMap mSpriteDefinition;
QImage mSpriteImage;

};

Expand Down

0 comments on commit fb8702c

Please sign in to comment.