diff --git a/src/core/vectortile/qgsarcgisvectortileservicedataprovider.cpp b/src/core/vectortile/qgsarcgisvectortileservicedataprovider.cpp index 4d164e49f95..b25cf8a2a28 100644 --- a/src/core/vectortile/qgsarcgisvectortileservicedataprovider.cpp +++ b/src/core/vectortile/qgsarcgisvectortileservicedataprovider.cpp @@ -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 diff --git a/src/core/vectortile/qgsarcgisvectortileservicedataprovider.h b/src/core/vectortile/qgsarcgisvectortileservicedataprovider.h index 681d80d6bf3..012bab51fe5 100644 --- a/src/core/vectortile/qgsarcgisvectortileservicedataprovider.h +++ b/src/core/vectortile/qgsarcgisvectortileservicedataprovider.h @@ -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; diff --git a/src/core/vectortile/qgsvectortiledataprovider.cpp b/src/core/vectortile/qgsvectortiledataprovider.cpp index f4a6d308fd8..a10cbbd3deb 100644 --- a/src/core/vectortile/qgsvectortiledataprovider.cpp +++ b/src/core/vectortile/qgsvectortiledataprovider.cpp @@ -17,6 +17,7 @@ #include "qgsthreadingutils.h" #include +#include 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(); +} + diff --git a/src/core/vectortile/qgsvectortiledataprovider.h b/src/core/vectortile/qgsvectortiledataprovider.h index 7651640e3cc..f1b1d062bde 100644 --- a/src/core/vectortile/qgsvectortiledataprovider.h +++ b/src/core/vectortile/qgsvectortiledataprovider.h @@ -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; }; diff --git a/src/core/vectortile/qgsvectortilelayer.cpp b/src/core/vectortile/qgsvectortilelayer.cpp index 891846f89d1..983f8150fc0 100644 --- a/src/core/vectortile/qgsvectortilelayer.cpp +++ b/src/core/vectortile/qgsvectortilelayer.cpp @@ -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 #include @@ -379,6 +377,9 @@ bool QgsVectorTileLayer::loadDefaultStyleAndSubLayers( QString &error, QStringLi bool QgsVectorTileLayer::loadDefaultStyleAndSubLayersPrivate( QString &error, QStringList &warnings, QList *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 ) ); diff --git a/src/core/vectortile/qgsvectortilelayer.h b/src/core/vectortile/qgsvectortilelayer.h index 7b372ea1e34..b32e0633024 100644 --- a/src/core/vectortile/qgsvectortilelayer.h +++ b/src/core/vectortile/qgsvectortilelayer.h @@ -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; diff --git a/src/core/vectortile/qgsvtpkvectortiledataprovider.cpp b/src/core/vectortile/qgsvtpkvectortiledataprovider.cpp index 62ab79903ad..d631ab4057f 100644 --- a/src/core/vectortile/qgsvtpkvectortiledataprovider.cpp +++ b/src/core/vectortile/qgsvtpkvectortiledataprovider.cpp @@ -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 diff --git a/src/core/vectortile/qgsvtpkvectortiledataprovider.h b/src/core/vectortile/qgsvtpkvectortiledataprovider.h index 4b981d8e259..53fbb33b024 100644 --- a/src/core/vectortile/qgsvtpkvectortiledataprovider.h +++ b/src/core/vectortile/qgsvtpkvectortiledataprovider.h @@ -22,6 +22,8 @@ #include "qgsprovidermetadata.h" #include "qgsvectortilematrixset.h" +#include + #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 readTiles( const QgsTileMatrix &, const QVector &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; };