Skip to content

Commit 36a26ee

Browse files
committedApr 5, 2020
Support loading of VT from MBTiles by drag'n'drop and in browser
+ fix layer extent when reading vector tiles from MBTiles
1 parent 0828c21 commit 36a26ee

File tree

5 files changed

+56
-21
lines changed

5 files changed

+56
-21
lines changed
 

‎src/app/qgisapp.cpp

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,7 @@ Q_GUI_EXPORT extern int qt_defaultDpiX();
260260
#include "qgsmapoverviewcanvas.h"
261261
#include "qgsmapsettings.h"
262262
#include "qgsmaptip.h"
263+
#include "qgsmbtilesreader.h"
263264
#include "qgsmenuheader.h"
264265
#include "qgsmergeattributesdialog.h"
265266
#include "qgsmessageviewer.h"
@@ -7129,12 +7130,32 @@ bool QgisApp::openLayer( const QString &fileName, bool allowInteractive )
71297130

71307131
if ( fileName.endsWith( QStringLiteral( ".mbtiles" ), Qt::CaseInsensitive ) )
71317132
{
7132-
// prefer to use WMS provider's implementation to open MBTiles rasters
7133-
QUrlQuery uq;
7134-
uq.addQueryItem( "type", "mbtiles" );
7135-
uq.addQueryItem( "url", QUrl::fromLocalFile( fileName ).toString() );
7136-
if ( addRasterLayer( uq.toString(), fileInfo.completeBaseName(), QStringLiteral( "wms" ) ) )
7137-
return true;
7133+
QgsMBTilesReader reader( fileName );
7134+
if ( reader.open() )
7135+
{
7136+
if ( reader.metadataValue( "format" ) == QStringLiteral( "pbf" ) )
7137+
{
7138+
// these are vector tiles
7139+
QUrlQuery uq;
7140+
uq.addQueryItem( QStringLiteral( "type" ), QStringLiteral( "mbtiles" ) );
7141+
uq.addQueryItem( QStringLiteral( "url" ), fileName );
7142+
std::unique_ptr<QgsVectorTileLayer> vtLayer( new QgsVectorTileLayer( uq.toString(), fileInfo.completeBaseName() ) );
7143+
if ( vtLayer->isValid() )
7144+
{
7145+
QgsProject::instance()->addMapLayer( vtLayer.release() );
7146+
return true;
7147+
}
7148+
}
7149+
else // raster tiles
7150+
{
7151+
// prefer to use WMS provider's implementation to open MBTiles rasters
7152+
QUrlQuery uq;
7153+
uq.addQueryItem( QStringLiteral( "type" ), QStringLiteral( "mbtiles" ) );
7154+
uq.addQueryItem( QStringLiteral( "url" ), QUrl::fromLocalFile( fileName ).toString() );
7155+
if ( addRasterLayer( uq.toString(), fileInfo.completeBaseName(), QStringLiteral( "wms" ) ) )
7156+
return true;
7157+
}
7158+
}
71387159
}
71397160

71407161
// try to load it as raster

‎src/core/providers/gdal/qgsgdaldataitems.cpp

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,12 @@
1818
///@cond PRIVATE
1919
#include "qgsgdalprovider.h"
2020
#include "qgslogger.h"
21+
#include "qgsmbtilesreader.h"
2122
#include "qgssettings.h"
2223
#include "qgsogrutils.h"
2324
#include "qgsproject.h"
2425
#include "qgsgdalutils.h"
26+
#include "qgsvectortiledataitems.h"
2527
#include "symbology/qgsstyle.h"
2628

2729
#include <QFileInfo>
@@ -263,14 +265,30 @@ QgsDataItem *QgsGdalDataItemProvider::createDataItem( const QString &pathIn, Qgs
263265

264266
if ( suffix == QStringLiteral( "mbtiles" ) )
265267
{
266-
// handled by WMS provider
267-
QUrlQuery uq;
268-
uq.addQueryItem( "type", "mbtiles" );
269-
uq.addQueryItem( "url", QUrl::fromLocalFile( path ).toString() );
270-
QString encodedUri = uq.toString();
271-
QgsLayerItem *item = new QgsLayerItem( parentItem, name, path, encodedUri, QgsLayerItem::Raster, QStringLiteral( "wms" ) );
272-
item->setState( QgsDataItem::Populated );
273-
return item;
268+
QgsMBTilesReader reader( path );
269+
if ( reader.open() )
270+
{
271+
if ( reader.metadataValue( "format" ) == QStringLiteral( "pbf" ) )
272+
{
273+
// these are vector tiles
274+
QUrlQuery uq;
275+
uq.addQueryItem( QStringLiteral( "type" ), QStringLiteral( "mbtiles" ) );
276+
uq.addQueryItem( QStringLiteral( "url" ), path );
277+
QString encodedUri = uq.toString();
278+
return new QgsVectorTileLayerItem( parentItem, name, path, encodedUri );
279+
}
280+
else
281+
{
282+
// handled by WMS provider
283+
QUrlQuery uq;
284+
uq.addQueryItem( QStringLiteral( "type" ), QStringLiteral( "mbtiles" ) );
285+
uq.addQueryItem( QStringLiteral( "url" ), QUrl::fromLocalFile( path ).toString() );
286+
QString encodedUri = uq.toString();
287+
QgsLayerItem *item = new QgsLayerItem( parentItem, name, path, encodedUri, QgsLayerItem::Raster, QStringLiteral( "wms" ) );
288+
item->setState( QgsDataItem::Populated );
289+
return item;
290+
}
291+
}
274292
}
275293

276294
// Filters out the OGR/GDAL supported formats that can contain multiple layers

‎src/core/vectortile/qgsvectortilelayer.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,9 @@ QgsVectorTileLayer::QgsVectorTileLayer( const QString &uri, const QString &baseN
6767
QgsDebugMsgLevel( QStringLiteral( "zoom range: %1 - %2" ).arg( mSourceMinZoom ).arg( mSourceMaxZoom ), 2 );
6868

6969
QgsRectangle r = reader.extent();
70-
// TODO: reproject to EPSG:3857
70+
QgsCoordinateTransform ct( QgsCoordinateReferenceSystem( QStringLiteral( "EPSG:4326" ) ),
71+
QgsCoordinateReferenceSystem( QStringLiteral( "EPSG:3857" ) ), transformContext() );
72+
r = ct.transformBoundingBox( r );
7173
setExtent( r );
7274
}
7375
else

‎src/core/vectortile/qgsvectortileprovidermetadata.cpp

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,4 @@ QList<QgsDataItemProvider *> QgsVectorTileProviderMetadata::dataItemProviders()
3434
return providers;
3535
}
3636

37-
//QString QgsVectorTileProviderMetadata::staticKey()
38-
//{
39-
// return PROVIDER_KEY;
40-
//}
41-
4237
///@endcond

‎src/core/vectortile/qgsvectortileprovidermetadata.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ class QgsVectorTileProviderMetadata : public QgsProviderMetadata
3333
QgsVectorTileProviderMetadata();
3434
QList< QgsDataItemProvider * > dataItemProviders() const override;
3535

36-
//static QString staticKey();
3736
};
3837

3938
///@endcond

0 commit comments

Comments
 (0)
Please sign in to comment.