Skip to content

Commit

Permalink
Implement uri priority methods for vector tile mbtiles provider metadata
Browse files Browse the repository at this point in the history
  • Loading branch information
nyalldawson committed Apr 2, 2023
1 parent fd11e0b commit e4a84d6
Show file tree
Hide file tree
Showing 3 changed files with 75 additions and 0 deletions.
31 changes: 31 additions & 0 deletions src/core/vectortile/qgsmbtilesvectortiledataprovider.cpp
Expand Up @@ -22,7 +22,9 @@
#include "qgslogger.h"
#include "qgsapplication.h"
#include "qgscoordinatetransform.h"

#include <QIcon>
#include <QFileInfo>

///@cond PRIVATE

Expand Down Expand Up @@ -219,6 +221,12 @@ QgsMbTilesVectorTileDataProviderMetadata::QgsMbTilesVectorTileDataProviderMetada
{
}

QgsProviderMetadata::ProviderMetadataCapabilities QgsMbTilesVectorTileDataProviderMetadata::capabilities() const
{
return ProviderMetadataCapability::LayerTypesForUri
| ProviderMetadataCapability::PriorityForUri;
}

QgsMbTilesVectorTileDataProvider *QgsMbTilesVectorTileDataProviderMetadata::createProvider( const QString &uri, const QgsDataProvider::ProviderOptions &options, QgsDataProvider::ReadFlags flags )
{
return new QgsMbTilesVectorTileDataProvider( uri, options, flags );
Expand Down Expand Up @@ -251,6 +259,29 @@ QString QgsMbTilesVectorTileDataProviderMetadata::filters( Qgis::FileFilterType
return QString();
}

int QgsMbTilesVectorTileDataProviderMetadata::priorityForUri( const QString &uri ) const
{
if ( validLayerTypesForUri( uri ).contains( Qgis::LayerType::VectorTile ) )
return 100;

return 0;
}

QList<Qgis::LayerType> QgsMbTilesVectorTileDataProviderMetadata::validLayerTypesForUri( const QString &uri ) const
{
const QFileInfo fi( uri );
if ( fi.isFile() && fi.suffix().compare( QLatin1String( "mbtiles" ), Qt::CaseInsensitive ) == 0 )
{
return { Qgis::LayerType::VectorTile };
}

const QVariantMap parts = decodeUri( uri );
if ( parts.value( QStringLiteral( "path" ) ).toString().endsWith( ".mbtiles", Qt::CaseSensitivity::CaseInsensitive ) )
return { Qgis::LayerType::VectorTile };

return {};
}

QVariantMap QgsMbTilesVectorTileDataProviderMetadata::decodeUri( const QString &uri ) const
{
QgsDataSourceUri dsUri;
Expand Down
4 changes: 4 additions & 0 deletions src/core/vectortile/qgsmbtilesvectortiledataprovider.h
Expand Up @@ -73,10 +73,14 @@ class QgsMbTilesVectorTileDataProviderMetadata : public QgsProviderMetadata
Q_OBJECT
public:
QgsMbTilesVectorTileDataProviderMetadata();
QgsProviderMetadata::ProviderMetadataCapabilities capabilities() const override;
QgsMbTilesVectorTileDataProvider *createProvider( const QString &uri, const QgsDataProvider::ProviderOptions &options, QgsDataProvider::ReadFlags flags = QgsDataProvider::ReadFlags() ) override;
QIcon icon() const override;
ProviderCapabilities providerCapabilities() const override;
QString filters( Qgis::FileFilterType type ) override;
int priorityForUri( const QString &uri ) const override;
QList< Qgis::LayerType > validLayerTypesForUri( const QString &uri ) const override;

QVariantMap decodeUri( const QString &uri ) const override;
QString encodeUri( const QVariantMap &parts ) const override;
QString absoluteToRelativeUri( const QString &uri, const QgsReadWriteContext &context ) const override;
Expand Down
40 changes: 40 additions & 0 deletions tests/src/core/testqgsvectortilelayer.cpp
Expand Up @@ -222,6 +222,36 @@ void TestQgsVectorTileLayer::testMbtilesProviderMetadata()
QgsProviderMetadata *vectorTileMetadata = QgsProviderRegistry::instance()->providerMetadata( "mbtilesvectortiles" );
QVERIFY( vectorTileMetadata );

// not mbtile uris
QCOMPARE( vectorTileMetadata->priorityForUri( QString() ), 0 );
QCOMPARE( vectorTileMetadata->validLayerTypesForUri( QString() ), {} );

QCOMPARE( vectorTileMetadata->priorityForUri( QStringLiteral( TEST_DATA_DIR ) + QStringLiteral( "/points.shp" ) ), 0 );
QVERIFY( vectorTileMetadata->validLayerTypesForUri( QStringLiteral( TEST_DATA_DIR ) + QStringLiteral( "/points.shp" ) ).isEmpty() );
QVERIFY( vectorTileMetadata->querySublayers( QStringLiteral( TEST_DATA_DIR ) + QStringLiteral( "/points.shp" ) ).isEmpty() );

QCOMPARE( vectorTileMetadata->priorityForUri( QStringLiteral( "type=vtpk&url=%1/points.shp" ).arg( TEST_DATA_DIR ) ), 0 );
QVERIFY( vectorTileMetadata->validLayerTypesForUri( QStringLiteral( "type=vtpk&url=%1/points.shp" ).arg( TEST_DATA_DIR ) ).isEmpty() );
QVERIFY( vectorTileMetadata->querySublayers( QStringLiteral( "type=vtpk&url=%1/points.shp" ).arg( TEST_DATA_DIR ) ).isEmpty() );

// mbtile uris
QCOMPARE( vectorTileMetadata->priorityForUri( QStringLiteral( "%1/vector_tile/mbtiles_vt.mbtiles" ).arg( TEST_DATA_DIR ) ), 100 );
QCOMPARE( vectorTileMetadata->validLayerTypesForUri( QStringLiteral( "%1/vector_tile/mbtiles_vt.mbtiles" ).arg( TEST_DATA_DIR ) ), {Qgis::LayerType::VectorTile} );

QCOMPARE( vectorTileMetadata->priorityForUri( QStringLiteral( "type=mbtiles&url=%1/vector_tile/mbtiles_vt.mbtiles" ).arg( TEST_DATA_DIR ) ), 100 );
QCOMPARE( vectorTileMetadata->validLayerTypesForUri( QStringLiteral( "type=mbtiles&url=%1/vector_tile/mbtiles_vt.mbtiles" ).arg( TEST_DATA_DIR ) ), {Qgis::LayerType::VectorTile} );

// test that mbtilesvectortiles provider is the preferred provider for vector tile mbtiles files
QList<QgsProviderRegistry::ProviderCandidateDetails> candidates = QgsProviderRegistry::instance()->preferredProvidersForUri( QStringLiteral( "type=mbtiles&url=%1/vector_tile/mbtiles_vt.mbtiles" ).arg( TEST_DATA_DIR ) );
QCOMPARE( candidates.size(), 1 );
QCOMPARE( candidates.at( 0 ).metadata()->key(), QStringLiteral( "mbtilesvectortiles" ) );
QCOMPARE( candidates.at( 0 ).layerTypes(), QList< Qgis::LayerType >() << Qgis::LayerType::VectorTile );

candidates = QgsProviderRegistry::instance()->preferredProvidersForUri( QStringLiteral( "%1/vector_tile/mbtiles_vt.mbtiles" ).arg( TEST_DATA_DIR ) );
QCOMPARE( candidates.size(), 1 );
QCOMPARE( candidates.at( 0 ).metadata()->key(), QStringLiteral( "mbtilesvectortiles" ) );
QCOMPARE( candidates.at( 0 ).layerTypes(), QList< Qgis::LayerType >() << Qgis::LayerType::VectorTile );

QCOMPARE( vectorTileMetadata->filters( Qgis::FileFilterType::VectorTile ), QStringLiteral( "Mbtiles Vector Tiles (*.mbtiles *.MBTILES)" ) );
QCOMPARE( vectorTileMetadata->filters( Qgis::FileFilterType::PointCloud ), QString() );

Expand Down Expand Up @@ -367,6 +397,16 @@ void TestQgsVectorTileLayer::testVtpkProviderMetadata()
QCOMPARE( sublayers.at( 0 ).uri(), QStringLiteral( "type=vtpk&url=%1/testvtpk.vtpk" ).arg( TEST_DATA_DIR ) );
QCOMPARE( sublayers.at( 0 ).type(), Qgis::LayerType::VectorTile );

// test that vtpk provider is the preferred provider for vtpk files
QList<QgsProviderRegistry::ProviderCandidateDetails> candidates = QgsProviderRegistry::instance()->preferredProvidersForUri( QStringLiteral( "type=vtpk&url=%1/testvtpk.vtpk" ).arg( TEST_DATA_DIR ) );
QCOMPARE( candidates.size(), 1 );
QCOMPARE( candidates.at( 0 ).metadata()->key(), QStringLiteral( "vtpkvectortiles" ) );
QCOMPARE( candidates.at( 0 ).layerTypes(), QList< Qgis::LayerType >() << Qgis::LayerType::VectorTile );

candidates = QgsProviderRegistry::instance()->preferredProvidersForUri( QStringLiteral( TEST_DATA_DIR ) + QStringLiteral( "/testvtpk.vtpk" ) );
QCOMPARE( candidates.size(), 1 );
QCOMPARE( candidates.at( 0 ).metadata()->key(), QStringLiteral( "vtpkvectortiles" ) );
QCOMPARE( candidates.at( 0 ).layerTypes(), QList< Qgis::LayerType >() << Qgis::LayerType::VectorTile );

QCOMPARE( vectorTileMetadata->filters( Qgis::FileFilterType::VectorTile ), QStringLiteral( "VTPK Vector Tiles (*.vtpk *.VTPK)" ) );
QCOMPARE( vectorTileMetadata->filters( Qgis::FileFilterType::PointCloud ), QString() );
Expand Down

0 comments on commit e4a84d6

Please sign in to comment.