From c30bf7eda3aaa48eb8ca6524ea5beac43314b68c Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Tue, 21 Mar 2023 09:19:21 +1000 Subject: [PATCH] More efficient cloning of vector tile data providers --- .../qgsarcgisvectortileservicedataprovider.cpp | 14 +++++++++++--- .../qgsarcgisvectortileservicedataprovider.h | 5 +++-- .../qgsmbtilesvectortiledataprovider.cpp | 13 +++++++++---- .../qgsmbtilesvectortiledataprovider.h | 2 ++ .../vectortile/qgsvectortiledataprovider.cpp | 6 ++++++ .../vectortile/qgsvectortiledataprovider.h | 2 ++ .../qgsvtpkvectortiledataprovider.cpp | 18 ++++++++++++++---- .../vectortile/qgsvtpkvectortiledataprovider.h | 1 + .../qgsxyzvectortiledataprovider.cpp | 14 +++++++++++--- .../vectortile/qgsxyzvectortiledataprovider.h | 1 + 10 files changed, 60 insertions(+), 16 deletions(-) diff --git a/src/core/vectortile/qgsarcgisvectortileservicedataprovider.cpp b/src/core/vectortile/qgsarcgisvectortileservicedataprovider.cpp index b25cf8a2a28..7898db4611b 100644 --- a/src/core/vectortile/qgsarcgisvectortileservicedataprovider.cpp +++ b/src/core/vectortile/qgsarcgisvectortileservicedataprovider.cpp @@ -61,6 +61,16 @@ QgsArcGisVectorTileServiceDataProvider::QgsArcGisVectorTileServiceDataProvider( mLayerMetadata.addLink( QgsAbstractMetadataBase::Link( tr( "Source" ), QStringLiteral( "WWW:LINK" ), mArcgisLayerConfiguration.value( QStringLiteral( "serviceUri" ) ).toString() ) ); } +QgsArcGisVectorTileServiceDataProvider::QgsArcGisVectorTileServiceDataProvider( const QgsArcGisVectorTileServiceDataProvider &other ) + : QgsXyzVectorTileDataProvider( other ) +{ + mSourcePath = other.mSourcePath; + mArcgisLayerConfiguration = other.mArcgisLayerConfiguration; + mArcgisStyleConfiguration = other.mArcgisStyleConfiguration; + mCrs = other.mCrs; + mLayerMetadata = other.mLayerMetadata; +} + QgsVectorTileDataProvider::ProviderCapabilities QgsArcGisVectorTileServiceDataProvider::providerCapabilities() const { return QgsVectorTileDataProvider::ProviderCapability::ReadLayerMetadata; @@ -84,9 +94,7 @@ QgsVectorTileDataProvider *QgsArcGisVectorTileServiceDataProvider::clone() const { QGIS_PROTECT_QOBJECT_THREAD_ACCESS - ProviderOptions options; - options.transformContext = transformContext(); - return new QgsArcGisVectorTileServiceDataProvider( dataSourceUri(), options, mReadFlags ); + return new QgsArcGisVectorTileServiceDataProvider( *this ); } QString QgsArcGisVectorTileServiceDataProvider::sourcePath() const diff --git a/src/core/vectortile/qgsarcgisvectortileservicedataprovider.h b/src/core/vectortile/qgsarcgisvectortileservicedataprovider.h index 012bab51fe5..5740529ee0d 100644 --- a/src/core/vectortile/qgsarcgisvectortileservicedataprovider.h +++ b/src/core/vectortile/qgsarcgisvectortileservicedataprovider.h @@ -18,7 +18,6 @@ #include "qgis_core.h" #include "qgis_sip.h" -#include "qgsvectortilematrixset.h" #include "qgsxyzvectortiledataprovider.h" #include "qgsprovidermetadata.h" @@ -35,6 +34,8 @@ class CORE_EXPORT QgsArcGisVectorTileServiceDataProvider : public QgsXyzVectorTi const QgsDataProvider::ProviderOptions &providerOptions, QgsDataProvider::ReadFlags flags ); + QgsArcGisVectorTileServiceDataProvider( const QgsArcGisVectorTileServiceDataProvider &other ); + QgsVectorTileDataProvider::ProviderCapabilities providerCapabilities() const override; QString name() const override; QString description() const override; @@ -43,7 +44,7 @@ class CORE_EXPORT QgsArcGisVectorTileServiceDataProvider : public QgsXyzVectorTi QgsCoordinateReferenceSystem crs() const override; QgsLayerMetadata layerMetadata() const override; QVariantMap styleDefinition() const override; - QString styleUrl() const; + QString styleUrl() const override; static QString ARCGIS_VT_SERVICE_DATA_PROVIDER_KEY; static QString ARCGIS_VT_SERVICE_DATA_PROVIDER_DESCRIPTION; diff --git a/src/core/vectortile/qgsmbtilesvectortiledataprovider.cpp b/src/core/vectortile/qgsmbtilesvectortiledataprovider.cpp index 8ed7f159dfc..8d579714f69 100644 --- a/src/core/vectortile/qgsmbtilesvectortiledataprovider.cpp +++ b/src/core/vectortile/qgsmbtilesvectortiledataprovider.cpp @@ -81,6 +81,14 @@ QgsMbTilesVectorTileDataProvider::QgsMbTilesVectorTileDataProvider( const QStrin mIsValid = true; } +QgsMbTilesVectorTileDataProvider::QgsMbTilesVectorTileDataProvider( const QgsMbTilesVectorTileDataProvider &other ) + : QgsVectorTileDataProvider( other ) +{ + mIsValid = other.mIsValid; + mExtent = other.mExtent; + mMatrixSet = other.mMatrixSet; +} + QString QgsMbTilesVectorTileDataProvider::name() const { QGIS_PROTECT_QOBJECT_THREAD_ACCESS @@ -98,10 +106,7 @@ QString QgsMbTilesVectorTileDataProvider::description() const QgsVectorTileDataProvider *QgsMbTilesVectorTileDataProvider::clone() const { QGIS_PROTECT_QOBJECT_THREAD_ACCESS - - ProviderOptions options; - options.transformContext = transformContext(); - return new QgsMbTilesVectorTileDataProvider( dataSourceUri(), options, mReadFlags ); + return new QgsMbTilesVectorTileDataProvider( *this ); } QString QgsMbTilesVectorTileDataProvider::sourcePath() const diff --git a/src/core/vectortile/qgsmbtilesvectortiledataprovider.h b/src/core/vectortile/qgsmbtilesvectortiledataprovider.h index c7de6e0290f..f1d5e433d3d 100644 --- a/src/core/vectortile/qgsmbtilesvectortiledataprovider.h +++ b/src/core/vectortile/qgsmbtilesvectortiledataprovider.h @@ -37,6 +37,8 @@ class CORE_EXPORT QgsMbTilesVectorTileDataProvider : public QgsVectorTileDataPro const QgsDataProvider::ProviderOptions &providerOptions, QgsDataProvider::ReadFlags flags ); + QgsMbTilesVectorTileDataProvider( const QgsMbTilesVectorTileDataProvider &other ); + QString name() const override; QString description() const override; QgsVectorTileDataProvider *clone() const override; diff --git a/src/core/vectortile/qgsvectortiledataprovider.cpp b/src/core/vectortile/qgsvectortiledataprovider.cpp index a10cbbd3deb..513c9c024b9 100644 --- a/src/core/vectortile/qgsvectortiledataprovider.cpp +++ b/src/core/vectortile/qgsvectortiledataprovider.cpp @@ -26,6 +26,12 @@ QgsVectorTileDataProvider::QgsVectorTileDataProvider( : QgsDataProvider( uri, options, flags ) {} +QgsVectorTileDataProvider::QgsVectorTileDataProvider( const QgsVectorTileDataProvider &other ) + : QgsDataProvider( other.dataSourceUri( false ), ProviderOptions(), other.mReadFlags ) +{ + setTransformContext( other.transformContext() ); +} + QgsVectorTileDataProvider::ProviderCapabilities QgsVectorTileDataProvider::providerCapabilities() const { return QgsVectorTileDataProvider::ProviderCapabilities(); diff --git a/src/core/vectortile/qgsvectortiledataprovider.h b/src/core/vectortile/qgsvectortiledataprovider.h index f1b1d062bde..fd2f2a94c47 100644 --- a/src/core/vectortile/qgsvectortiledataprovider.h +++ b/src/core/vectortile/qgsvectortiledataprovider.h @@ -61,6 +61,8 @@ class CORE_EXPORT QgsVectorTileDataProvider : public QgsDataProvider const QgsDataProvider::ProviderOptions &providerOptions, QgsDataProvider::ReadFlags flags ); + QgsVectorTileDataProvider( const QgsVectorTileDataProvider &other ); + /** * Returns flags containing the supported capabilities of the data provider. * \since QGIS 3.32 diff --git a/src/core/vectortile/qgsvtpkvectortiledataprovider.cpp b/src/core/vectortile/qgsvtpkvectortiledataprovider.cpp index d631ab4057f..1bb7a9f3dba 100644 --- a/src/core/vectortile/qgsvtpkvectortiledataprovider.cpp +++ b/src/core/vectortile/qgsvtpkvectortiledataprovider.cpp @@ -67,6 +67,19 @@ QgsVtpkVectorTileDataProvider::QgsVtpkVectorTileDataProvider( const QString &uri mIsValid = true; } +QgsVtpkVectorTileDataProvider::QgsVtpkVectorTileDataProvider( const QgsVtpkVectorTileDataProvider &other ) + : QgsVectorTileDataProvider( other ) +{ + mIsValid = other.mIsValid; + mCrs = other.mCrs;; + mExtent = other.mExtent; + mMatrixSet = other.mMatrixSet; + mLayerMetadata = other.mLayerMetadata; + mStyleDefinition = other.mStyleDefinition; + mSpriteDefinition = other.mSpriteDefinition; + mSpriteImage = other.mSpriteImage; +} + QgsVectorTileDataProvider::ProviderCapabilities QgsVtpkVectorTileDataProvider::providerCapabilities() const { return QgsVectorTileDataProvider::ProviderCapability::ReadLayerMetadata; @@ -89,10 +102,7 @@ QString QgsVtpkVectorTileDataProvider::description() const QgsVectorTileDataProvider *QgsVtpkVectorTileDataProvider::clone() const { QGIS_PROTECT_QOBJECT_THREAD_ACCESS - - ProviderOptions options; - options.transformContext = transformContext(); - return new QgsVtpkVectorTileDataProvider( dataSourceUri(), options, mReadFlags ); + return new QgsVtpkVectorTileDataProvider( *this ); } QString QgsVtpkVectorTileDataProvider::sourcePath() const diff --git a/src/core/vectortile/qgsvtpkvectortiledataprovider.h b/src/core/vectortile/qgsvtpkvectortiledataprovider.h index 53fbb33b024..d6c15598c17 100644 --- a/src/core/vectortile/qgsvtpkvectortiledataprovider.h +++ b/src/core/vectortile/qgsvtpkvectortiledataprovider.h @@ -38,6 +38,7 @@ class CORE_EXPORT QgsVtpkVectorTileDataProvider : public QgsVectorTileDataProvid QgsVtpkVectorTileDataProvider( const QString &uri, const QgsDataProvider::ProviderOptions &providerOptions, QgsDataProvider::ReadFlags flags ); + QgsVtpkVectorTileDataProvider( const QgsVtpkVectorTileDataProvider &other ); QgsVectorTileDataProvider::ProviderCapabilities providerCapabilities() const override; QString name() const override; diff --git a/src/core/vectortile/qgsxyzvectortiledataprovider.cpp b/src/core/vectortile/qgsxyzvectortiledataprovider.cpp index 0a27b6e2b48..55267eb7d9e 100644 --- a/src/core/vectortile/qgsxyzvectortiledataprovider.cpp +++ b/src/core/vectortile/qgsxyzvectortiledataprovider.cpp @@ -63,6 +63,16 @@ QgsXyzVectorTileDataProvider::QgsXyzVectorTileDataProvider( const QString &uri, mIsValid = true; } +QgsXyzVectorTileDataProvider::QgsXyzVectorTileDataProvider( const QgsXyzVectorTileDataProvider &other ) + : QgsVectorTileDataProvider( other ) +{ + mAuthCfg = other.mAuthCfg; + mHeaders = other.mHeaders; + mIsValid = other.mIsValid; + mExtent = other.mExtent; + mMatrixSet = other.mMatrixSet; +} + QString QgsXyzVectorTileDataProvider::name() const { QGIS_PROTECT_QOBJECT_THREAD_ACCESS @@ -81,9 +91,7 @@ QgsVectorTileDataProvider *QgsXyzVectorTileDataProvider::clone() const { QGIS_PROTECT_QOBJECT_THREAD_ACCESS - ProviderOptions options; - options.transformContext = transformContext(); - return new QgsXyzVectorTileDataProvider( dataSourceUri(), options, mReadFlags ); + return new QgsXyzVectorTileDataProvider( *this ); } QString QgsXyzVectorTileDataProvider::sourcePath() const diff --git a/src/core/vectortile/qgsxyzvectortiledataprovider.h b/src/core/vectortile/qgsxyzvectortiledataprovider.h index dc6680b0078..e327eb9a43d 100644 --- a/src/core/vectortile/qgsxyzvectortiledataprovider.h +++ b/src/core/vectortile/qgsxyzvectortiledataprovider.h @@ -33,6 +33,7 @@ class CORE_EXPORT QgsXyzVectorTileDataProvider : public QgsVectorTileDataProvide QgsXyzVectorTileDataProvider( const QString &uri, const QgsDataProvider::ProviderOptions &providerOptions, QgsDataProvider::ReadFlags flags ); + QgsXyzVectorTileDataProvider( const QgsXyzVectorTileDataProvider &other ); QString name() const override; QString description() const override;