Skip to content

Commit

Permalink
Support loading of VT from MBTiles by drag'n'drop and in browser
Browse files Browse the repository at this point in the history
+ fix layer extent when reading vector tiles from MBTiles
  • Loading branch information
wonder-sk committed Apr 5, 2020
1 parent 0828c21 commit 36a26ee
Show file tree
Hide file tree
Showing 5 changed files with 56 additions and 21 deletions.
33 changes: 27 additions & 6 deletions src/app/qgisapp.cpp
Expand Up @@ -260,6 +260,7 @@ Q_GUI_EXPORT extern int qt_defaultDpiX();
#include "qgsmapoverviewcanvas.h"
#include "qgsmapsettings.h"
#include "qgsmaptip.h"
#include "qgsmbtilesreader.h"
#include "qgsmenuheader.h"
#include "qgsmergeattributesdialog.h"
#include "qgsmessageviewer.h"
Expand Down Expand Up @@ -7129,12 +7130,32 @@ bool QgisApp::openLayer( const QString &fileName, bool allowInteractive )

if ( fileName.endsWith( QStringLiteral( ".mbtiles" ), Qt::CaseInsensitive ) )
{
// prefer to use WMS provider's implementation to open MBTiles rasters
QUrlQuery uq;
uq.addQueryItem( "type", "mbtiles" );
uq.addQueryItem( "url", QUrl::fromLocalFile( fileName ).toString() );
if ( addRasterLayer( uq.toString(), fileInfo.completeBaseName(), QStringLiteral( "wms" ) ) )
return true;
QgsMBTilesReader reader( fileName );
if ( reader.open() )
{
if ( reader.metadataValue( "format" ) == QStringLiteral( "pbf" ) )
{
// these are vector tiles
QUrlQuery uq;
uq.addQueryItem( QStringLiteral( "type" ), QStringLiteral( "mbtiles" ) );
uq.addQueryItem( QStringLiteral( "url" ), fileName );
std::unique_ptr<QgsVectorTileLayer> vtLayer( new QgsVectorTileLayer( uq.toString(), fileInfo.completeBaseName() ) );
if ( vtLayer->isValid() )
{
QgsProject::instance()->addMapLayer( vtLayer.release() );
return true;
}
}
else // raster tiles
{
// prefer to use WMS provider's implementation to open MBTiles rasters
QUrlQuery uq;
uq.addQueryItem( QStringLiteral( "type" ), QStringLiteral( "mbtiles" ) );
uq.addQueryItem( QStringLiteral( "url" ), QUrl::fromLocalFile( fileName ).toString() );
if ( addRasterLayer( uq.toString(), fileInfo.completeBaseName(), QStringLiteral( "wms" ) ) )
return true;
}
}
}

// try to load it as raster
Expand Down
34 changes: 26 additions & 8 deletions src/core/providers/gdal/qgsgdaldataitems.cpp
Expand Up @@ -18,10 +18,12 @@
///@cond PRIVATE
#include "qgsgdalprovider.h"
#include "qgslogger.h"
#include "qgsmbtilesreader.h"
#include "qgssettings.h"
#include "qgsogrutils.h"
#include "qgsproject.h"
#include "qgsgdalutils.h"
#include "qgsvectortiledataitems.h"
#include "symbology/qgsstyle.h"

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

if ( suffix == QStringLiteral( "mbtiles" ) )
{
// handled by WMS provider
QUrlQuery uq;
uq.addQueryItem( "type", "mbtiles" );
uq.addQueryItem( "url", QUrl::fromLocalFile( path ).toString() );
QString encodedUri = uq.toString();
QgsLayerItem *item = new QgsLayerItem( parentItem, name, path, encodedUri, QgsLayerItem::Raster, QStringLiteral( "wms" ) );
item->setState( QgsDataItem::Populated );
return item;
QgsMBTilesReader reader( path );
if ( reader.open() )
{
if ( reader.metadataValue( "format" ) == QStringLiteral( "pbf" ) )
{
// these are vector tiles
QUrlQuery uq;
uq.addQueryItem( QStringLiteral( "type" ), QStringLiteral( "mbtiles" ) );
uq.addQueryItem( QStringLiteral( "url" ), path );
QString encodedUri = uq.toString();
return new QgsVectorTileLayerItem( parentItem, name, path, encodedUri );
}
else
{
// handled by WMS provider
QUrlQuery uq;
uq.addQueryItem( QStringLiteral( "type" ), QStringLiteral( "mbtiles" ) );
uq.addQueryItem( QStringLiteral( "url" ), QUrl::fromLocalFile( path ).toString() );
QString encodedUri = uq.toString();
QgsLayerItem *item = new QgsLayerItem( parentItem, name, path, encodedUri, QgsLayerItem::Raster, QStringLiteral( "wms" ) );
item->setState( QgsDataItem::Populated );
return item;
}
}
}

// Filters out the OGR/GDAL supported formats that can contain multiple layers
Expand Down
4 changes: 3 additions & 1 deletion src/core/vectortile/qgsvectortilelayer.cpp
Expand Up @@ -67,7 +67,9 @@ QgsVectorTileLayer::QgsVectorTileLayer( const QString &uri, const QString &baseN
QgsDebugMsgLevel( QStringLiteral( "zoom range: %1 - %2" ).arg( mSourceMinZoom ).arg( mSourceMaxZoom ), 2 );

QgsRectangle r = reader.extent();
// TODO: reproject to EPSG:3857
QgsCoordinateTransform ct( QgsCoordinateReferenceSystem( QStringLiteral( "EPSG:4326" ) ),
QgsCoordinateReferenceSystem( QStringLiteral( "EPSG:3857" ) ), transformContext() );
r = ct.transformBoundingBox( r );
setExtent( r );
}
else
Expand Down
5 changes: 0 additions & 5 deletions src/core/vectortile/qgsvectortileprovidermetadata.cpp
Expand Up @@ -34,9 +34,4 @@ QList<QgsDataItemProvider *> QgsVectorTileProviderMetadata::dataItemProviders()
return providers;
}

//QString QgsVectorTileProviderMetadata::staticKey()
//{
// return PROVIDER_KEY;
//}

///@endcond
1 change: 0 additions & 1 deletion src/core/vectortile/qgsvectortileprovidermetadata.h
Expand Up @@ -33,7 +33,6 @@ class QgsVectorTileProviderMetadata : public QgsProviderMetadata
QgsVectorTileProviderMetadata();
QList< QgsDataItemProvider * > dataItemProviders() const override;

//static QString staticKey();
};

///@endcond
Expand Down

0 comments on commit 36a26ee

Please sign in to comment.