Move vector tile style handling to data provider subclasses

This commit is contained in:
Nyall Dawson 2023-03-21 09:06:51 +10:00
parent 55daeff0b5
commit fb8702c039
8 changed files with 128 additions and 31 deletions

View File

@ -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

View File

@ -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;

View File

@ -17,6 +17,7 @@
#include "qgsthreadingutils.h"
#include <QNetworkRequest>
#include <QImage>
QgsVectorTileDataProvider::QgsVectorTileDataProvider(
const QString &uri,
@ -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();
}

View File

@ -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;
};

View File

@ -17,7 +17,6 @@
#include "qgslogger.h"
#include "qgsvectortilelayerrenderer.h"
#include "qgsvtpktiles.h"
#include "qgsvectortilebasiclabeling.h"
#include "qgsvectortilebasicrenderer.h"
#include "qgsvectortilelabeling.h"
@ -36,7 +35,6 @@
#include "qgsthreadingutils.h"
#include "qgsproviderregistry.h"
#include "qgsvectortiledataprovider.h"
#include "qgsarcgisvectortileservicedataprovider.h"
#include <QUrl>
#include <QUrlQuery>
@ -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 );
@ -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 ) );

View File

@ -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;

View File

@ -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;
}
@ -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

View File

@ -22,6 +22,8 @@
#include "qgsprovidermetadata.h"
#include "qgsvectortilematrixset.h"
#include <QImage>
#define SIP_NO_FILE
///@cond PRIVATE
@ -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;
@ -62,6 +67,9 @@ class CORE_EXPORT QgsVtpkVectorTileDataProvider : public QgsVectorTileDataProvid
QgsRectangle mExtent;
QgsVectorTileMatrixSet mMatrixSet;
QgsLayerMetadata mLayerMetadata;
QVariantMap mStyleDefinition;
QVariantMap mSpriteDefinition;
QImage mSpriteImage;
};