32#include "moc_qgsmbtilesvectortiledataprovider.cpp"
36QString QgsMbTilesVectorTileDataProvider::MB_TILES_VECTOR_TILE_DATA_PROVIDER_KEY = QStringLiteral(
"mbtilesvectortiles" );
37QString QgsMbTilesVectorTileDataProvider::MB_TILES_VECTOR_TILE_DATA_PROVIDER_DESCRIPTION = QObject::tr(
"MBTile Vector Tiles data provider" );
39QgsMbTilesVectorTileDataProvider::QgsMbTilesVectorTileDataProvider(
const QString &uri,
const ProviderOptions &providerOptions,
Qgis::DataProviderReadFlags flags )
44 const QString sourcePath = dsUri.
param( QStringLiteral(
"url" ) );
49 QgsDebugError( QStringLiteral(
"failed to open MBTiles file: " ) + sourcePath );
54 const QString format = reader.metadataValue( QStringLiteral(
"format" ) );
55 if ( format != QLatin1String(
"pbf" ) )
57 QgsDebugError( QStringLiteral(
"Cannot open MBTiles for vector tiles. Format = " ) + format );
62 QgsDebugMsgLevel( QStringLiteral(
"name: " ) + reader.metadataValue( QStringLiteral(
"name" ) ), 2 );
64 bool minZoomOk, maxZoomOk;
65 const int minZoom = reader.metadataValue( QStringLiteral(
"minzoom" ) ).toInt( &minZoomOk );
66 const int maxZoom = reader.metadataValue( QStringLiteral(
"maxzoom" ) ).toInt( &maxZoomOk );
67 if ( minZoomOk && maxZoomOk )
84 QgsDebugMsgLevel( QStringLiteral(
"zoom range: %1 - %2" ).arg( mMatrixSet.minimumZoom() ).arg( mMatrixSet.maximumZoom() ), 2 );
89 ct.setBallparkTransformsAreAppropriate(
true );
92 mExtent = ct.transformBoundingBox( r );
96 QgsDebugError( QStringLiteral(
"Could not transform layer extent to layer CRS" ) );
102QgsMbTilesVectorTileDataProvider::QgsMbTilesVectorTileDataProvider(
const QgsMbTilesVectorTileDataProvider &other )
105 mIsValid = other.mIsValid;
106 mExtent = other.mExtent;
107 mMatrixSet = other.mMatrixSet;
115QString QgsMbTilesVectorTileDataProvider::name()
const
119 return MB_TILES_VECTOR_TILE_DATA_PROVIDER_KEY;
122QString QgsMbTilesVectorTileDataProvider::description()
const
126 return MB_TILES_VECTOR_TILE_DATA_PROVIDER_DESCRIPTION;
132 return new QgsMbTilesVectorTileDataProvider( *
this );
135QString QgsMbTilesVectorTileDataProvider::sourcePath()
const
141 return dsUri.param( QStringLiteral(
"url" ) );
144bool QgsMbTilesVectorTileDataProvider::isValid()
const
151QgsRectangle QgsMbTilesVectorTileDataProvider::extent()
const
179 QgsMbTiles mbReader( dsUri.param( QStringLiteral(
"url" ) ) );
191 QgsMbTiles mbReader( dsUri.param( QStringLiteral(
"url" ) ) );
194 QList<QgsVectorTileRawData> rawTiles;
195 rawTiles.reserve( tiles.size() );
196 for (
QgsTileXYZ id : std::as_const( tiles ) )
201 const QByteArray rawData = loadFromMBTiles( mbReader,
id, feedback );
202 if ( !rawData.isEmpty() )
213 const int rowTMS =
static_cast<int>( pow( 2,
id.zoomLevel() ) -
id.row() - 1 );
214 QByteArray gzippedTileData = mbTileReader.
tileData(
id.zoomLevel(),
id.column(), rowTMS );
215 if ( gzippedTileData.isEmpty() )
226 QgsDebugError( QStringLiteral(
"Failed to decompress tile " ) +
id.toString() );
230 QgsDebugMsgLevel( QStringLiteral(
"Tile blob size %1 -> uncompressed size %2" ).arg( gzippedTileData.size() ).arg( data.size() ), 2 );
239QgsMbTilesVectorTileDataProviderMetadata::QgsMbTilesVectorTileDataProviderMetadata()
240 :
QgsProviderMetadata( QgsMbTilesVectorTileDataProvider::MB_TILES_VECTOR_TILE_DATA_PROVIDER_KEY,
241 QgsMbTilesVectorTileDataProvider::MB_TILES_VECTOR_TILE_DATA_PROVIDER_DESCRIPTION )
247 return ProviderMetadataCapability::LayerTypesForUri
248 | ProviderMetadataCapability::PriorityForUri
249 | ProviderMetadataCapability::QuerySublayers;
254 return new QgsMbTilesVectorTileDataProvider( uri, options, flags );
257QIcon QgsMbTilesVectorTileDataProviderMetadata::icon()
const
264 return FileBasedUris;
280 return QObject::tr(
"Mbtiles Vector Tiles" ) + QStringLiteral(
" (*.mbtiles *.MBTILES)" );
288 const QFileInfo fi( uri );
295 const QVariantMap parts = decodeUri( uri );
296 fileName = parts.value( QStringLiteral(
"path" ) ).toString();
299 if ( fileName.isEmpty() )
302 if ( QFileInfo( fileName ).suffix().compare( QLatin1String(
"mbtiles" ), Qt::CaseInsensitive ) == 0 )
305 parts.insert( QStringLiteral(
"path" ), fileName );
311 details.
setUri( encodeUri( parts ) );
324 if ( reader.metadataValue(
"format" ) == QLatin1String(
"pbf" ) )
327 details.
setUri( encodeUri( parts ) );
339int QgsMbTilesVectorTileDataProviderMetadata::priorityForUri(
const QString &uri )
const
347QList<Qgis::LayerType> QgsMbTilesVectorTileDataProviderMetadata::validLayerTypesForUri(
const QString &uri )
const
349 const QFileInfo fi( uri );
350 if ( fi.isFile() && fi.suffix().compare( QLatin1String(
"mbtiles" ), Qt::CaseInsensitive ) == 0 )
355 const QVariantMap parts = decodeUri( uri );
356 if ( parts.value( QStringLiteral(
"path" ) ).toString().endsWith(
".mbtiles", Qt::CaseSensitivity::CaseInsensitive ) )
362QVariantMap QgsMbTilesVectorTileDataProviderMetadata::decodeUri(
const QString &uri )
const
367 QVariantMap uriComponents;
368 uriComponents.insert( QStringLiteral(
"type" ), QStringLiteral(
"mbtiles" ) );
369 uriComponents.insert( QStringLiteral(
"path" ), dsUri.
param( QStringLiteral(
"url" ) ) );
371 return uriComponents;
374QString QgsMbTilesVectorTileDataProviderMetadata::encodeUri(
const QVariantMap &parts )
const
377 dsUri.
setParam( QStringLiteral(
"type" ), QStringLiteral(
"mbtiles" ) );
378 dsUri.
setParam( QStringLiteral(
"url" ), parts.value( parts.contains( QStringLiteral(
"path" ) ) ? QStringLiteral(
"path" ) : QStringLiteral(
"url" ) ).toString() );
382QString QgsMbTilesVectorTileDataProviderMetadata::absoluteToRelativeUri(
const QString &uri,
const QgsReadWriteContext &context )
const
384 QVariantMap parts = decodeUri( uri );
386 const QString originalPath = parts.value( QStringLiteral(
"path" ) ).toString();
389 return encodeUri( parts );
392QString QgsMbTilesVectorTileDataProviderMetadata::relativeToAbsoluteUri(
const QString &uri,
const QgsReadWriteContext &context )
const
394 QVariantMap parts = decodeUri( uri );
396 const QString originalPath = parts.value( QStringLiteral(
"path" ) ).toString();
399 return encodeUri( parts );
402QList<Qgis::LayerType> QgsMbTilesVectorTileDataProviderMetadata::supportedLayerTypes()
const
QFlags< DataProviderFlag > DataProviderFlags
Data provider flags.
FileFilterType
Type of file filters.
@ TiledScene
Tiled scene layers.
@ VectorTile
Vector tile layers.
@ MeshDataset
Mesh datasets.
@ PointCloud
Point clouds.
@ FastExtent2D
Provider's 2D extent retrieval via QgsDataProvider::extent() is always guaranteed to be trivial/fast ...
@ FastScan
Indicates that the provider must scan for sublayers using the fastest possible approach – e....
QFlags< DataProviderReadFlag > DataProviderReadFlags
Flags which control data provider construction.
QFlags< SublayerQueryFlag > SublayerQueryFlags
Sublayer query flags.
@ VectorTile
Vector tile layer. Added in QGIS 3.14.
RendererUsage
Usage of the renderer.
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
Represents a coordinate reference system (CRS).
Custom exception class for Coordinate Reference System related exceptions.
Stores the component parts of a data source URI (e.g.
QByteArray encodedUri() const
Returns the complete encoded URI as a byte array.
void setEncodedUri(const QByteArray &uri)
Sets the complete encoded uri.
QString param(const QString &key) const
Returns a generic parameter value corresponding to the specified key.
void setParam(const QString &key, const QString &value)
Sets a generic parameter value on the URI.
Base class for feedback objects to be used for cancellation of something running in a worker thread.
bool isCanceled() const
Tells whether the operation has been canceled already.
Utility class for reading and writing MBTiles files (which are SQLite3 databases).
QByteArray tileData(int z, int x, int y) const
Returns raw tile data for given tile.
QString writePath(const QString &filename) const
Prepare a filename to save it to the project file.
QString readPath(const QString &filename) const
Turn filename read from the project file to an absolute path.
Contains details about a sub layer available from a dataset.
void setUri(const QString &uri)
Sets the layer's uri.
void setType(Qgis::LayerType type)
Sets the layer type.
void setName(const QString &name)
Sets the layer's name.
void setProviderKey(const QString &key)
Sets the associated data provider key.
void setSkippedContainerScan(bool skipped)
Set to true if the layer is a potential dataset container and an in-depth scan of its contents was sk...
static QString suggestLayerNameFromFilePath(const QString &path)
Suggests a suitable layer name given only a file path.
A container for the context for various read/write operations on objects.
const QgsPathResolver & pathResolver() const
Returns path resolver for conversion between relative and absolute paths.
A rectangle specified with double values.
Defines a set of tile matrices for multiple zoom levels.
Stores coordinates of a tile in a tile matrix set.
Base class for vector tile layer data providers.
Encapsulates properties of a vector tile matrix set, including tile origins and scaling information.
static QgsVectorTileMatrixSet fromWebMercator(int minimumZoom=0, int maximumZoom=14)
Returns a vector tile structure corresponding to the standard web mercator/GoogleCRS84Quad setup.
Keeps track of raw tile data from one or more sources that need to be decoded.
static bool decodeGzip(const QByteArray &bytesIn, QByteArray &bytesOut)
Decodes gzip byte stream, returns true on success.
#define QgsDebugMsgLevel(str, level)
#define QgsDebugError(str)
#define QGIS_PROTECT_QOBJECT_THREAD_ACCESS
Setting options for creating vector data providers.