Skip to content

Commit e4a84d6

Browse files
committedApr 2, 2023
Implement uri priority methods for vector tile mbtiles provider metadata
1 parent fd11e0b commit e4a84d6

File tree

3 files changed

+75
-0
lines changed

3 files changed

+75
-0
lines changed
 

‎src/core/vectortile/qgsmbtilesvectortiledataprovider.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@
2222
#include "qgslogger.h"
2323
#include "qgsapplication.h"
2424
#include "qgscoordinatetransform.h"
25+
2526
#include <QIcon>
27+
#include <QFileInfo>
2628

2729
///@cond PRIVATE
2830

@@ -219,6 +221,12 @@ QgsMbTilesVectorTileDataProviderMetadata::QgsMbTilesVectorTileDataProviderMetada
219221
{
220222
}
221223

224+
QgsProviderMetadata::ProviderMetadataCapabilities QgsMbTilesVectorTileDataProviderMetadata::capabilities() const
225+
{
226+
return ProviderMetadataCapability::LayerTypesForUri
227+
| ProviderMetadataCapability::PriorityForUri;
228+
}
229+
222230
QgsMbTilesVectorTileDataProvider *QgsMbTilesVectorTileDataProviderMetadata::createProvider( const QString &uri, const QgsDataProvider::ProviderOptions &options, QgsDataProvider::ReadFlags flags )
223231
{
224232
return new QgsMbTilesVectorTileDataProvider( uri, options, flags );
@@ -251,6 +259,29 @@ QString QgsMbTilesVectorTileDataProviderMetadata::filters( Qgis::FileFilterType
251259
return QString();
252260
}
253261

262+
int QgsMbTilesVectorTileDataProviderMetadata::priorityForUri( const QString &uri ) const
263+
{
264+
if ( validLayerTypesForUri( uri ).contains( Qgis::LayerType::VectorTile ) )
265+
return 100;
266+
267+
return 0;
268+
}
269+
270+
QList<Qgis::LayerType> QgsMbTilesVectorTileDataProviderMetadata::validLayerTypesForUri( const QString &uri ) const
271+
{
272+
const QFileInfo fi( uri );
273+
if ( fi.isFile() && fi.suffix().compare( QLatin1String( "mbtiles" ), Qt::CaseInsensitive ) == 0 )
274+
{
275+
return { Qgis::LayerType::VectorTile };
276+
}
277+
278+
const QVariantMap parts = decodeUri( uri );
279+
if ( parts.value( QStringLiteral( "path" ) ).toString().endsWith( ".mbtiles", Qt::CaseSensitivity::CaseInsensitive ) )
280+
return { Qgis::LayerType::VectorTile };
281+
282+
return {};
283+
}
284+
254285
QVariantMap QgsMbTilesVectorTileDataProviderMetadata::decodeUri( const QString &uri ) const
255286
{
256287
QgsDataSourceUri dsUri;

‎src/core/vectortile/qgsmbtilesvectortiledataprovider.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,10 +73,14 @@ class QgsMbTilesVectorTileDataProviderMetadata : public QgsProviderMetadata
7373
Q_OBJECT
7474
public:
7575
QgsMbTilesVectorTileDataProviderMetadata();
76+
QgsProviderMetadata::ProviderMetadataCapabilities capabilities() const override;
7677
QgsMbTilesVectorTileDataProvider *createProvider( const QString &uri, const QgsDataProvider::ProviderOptions &options, QgsDataProvider::ReadFlags flags = QgsDataProvider::ReadFlags() ) override;
7778
QIcon icon() const override;
7879
ProviderCapabilities providerCapabilities() const override;
7980
QString filters( Qgis::FileFilterType type ) override;
81+
int priorityForUri( const QString &uri ) const override;
82+
QList< Qgis::LayerType > validLayerTypesForUri( const QString &uri ) const override;
83+
8084
QVariantMap decodeUri( const QString &uri ) const override;
8185
QString encodeUri( const QVariantMap &parts ) const override;
8286
QString absoluteToRelativeUri( const QString &uri, const QgsReadWriteContext &context ) const override;

‎tests/src/core/testqgsvectortilelayer.cpp

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,36 @@ void TestQgsVectorTileLayer::testMbtilesProviderMetadata()
222222
QgsProviderMetadata *vectorTileMetadata = QgsProviderRegistry::instance()->providerMetadata( "mbtilesvectortiles" );
223223
QVERIFY( vectorTileMetadata );
224224

225+
// not mbtile uris
226+
QCOMPARE( vectorTileMetadata->priorityForUri( QString() ), 0 );
227+
QCOMPARE( vectorTileMetadata->validLayerTypesForUri( QString() ), {} );
228+
229+
QCOMPARE( vectorTileMetadata->priorityForUri( QStringLiteral( TEST_DATA_DIR ) + QStringLiteral( "/points.shp" ) ), 0 );
230+
QVERIFY( vectorTileMetadata->validLayerTypesForUri( QStringLiteral( TEST_DATA_DIR ) + QStringLiteral( "/points.shp" ) ).isEmpty() );
231+
QVERIFY( vectorTileMetadata->querySublayers( QStringLiteral( TEST_DATA_DIR ) + QStringLiteral( "/points.shp" ) ).isEmpty() );
232+
233+
QCOMPARE( vectorTileMetadata->priorityForUri( QStringLiteral( "type=vtpk&url=%1/points.shp" ).arg( TEST_DATA_DIR ) ), 0 );
234+
QVERIFY( vectorTileMetadata->validLayerTypesForUri( QStringLiteral( "type=vtpk&url=%1/points.shp" ).arg( TEST_DATA_DIR ) ).isEmpty() );
235+
QVERIFY( vectorTileMetadata->querySublayers( QStringLiteral( "type=vtpk&url=%1/points.shp" ).arg( TEST_DATA_DIR ) ).isEmpty() );
236+
237+
// mbtile uris
238+
QCOMPARE( vectorTileMetadata->priorityForUri( QStringLiteral( "%1/vector_tile/mbtiles_vt.mbtiles" ).arg( TEST_DATA_DIR ) ), 100 );
239+
QCOMPARE( vectorTileMetadata->validLayerTypesForUri( QStringLiteral( "%1/vector_tile/mbtiles_vt.mbtiles" ).arg( TEST_DATA_DIR ) ), {Qgis::LayerType::VectorTile} );
240+
241+
QCOMPARE( vectorTileMetadata->priorityForUri( QStringLiteral( "type=mbtiles&url=%1/vector_tile/mbtiles_vt.mbtiles" ).arg( TEST_DATA_DIR ) ), 100 );
242+
QCOMPARE( vectorTileMetadata->validLayerTypesForUri( QStringLiteral( "type=mbtiles&url=%1/vector_tile/mbtiles_vt.mbtiles" ).arg( TEST_DATA_DIR ) ), {Qgis::LayerType::VectorTile} );
243+
244+
// test that mbtilesvectortiles provider is the preferred provider for vector tile mbtiles files
245+
QList<QgsProviderRegistry::ProviderCandidateDetails> candidates = QgsProviderRegistry::instance()->preferredProvidersForUri( QStringLiteral( "type=mbtiles&url=%1/vector_tile/mbtiles_vt.mbtiles" ).arg( TEST_DATA_DIR ) );
246+
QCOMPARE( candidates.size(), 1 );
247+
QCOMPARE( candidates.at( 0 ).metadata()->key(), QStringLiteral( "mbtilesvectortiles" ) );
248+
QCOMPARE( candidates.at( 0 ).layerTypes(), QList< Qgis::LayerType >() << Qgis::LayerType::VectorTile );
249+
250+
candidates = QgsProviderRegistry::instance()->preferredProvidersForUri( QStringLiteral( "%1/vector_tile/mbtiles_vt.mbtiles" ).arg( TEST_DATA_DIR ) );
251+
QCOMPARE( candidates.size(), 1 );
252+
QCOMPARE( candidates.at( 0 ).metadata()->key(), QStringLiteral( "mbtilesvectortiles" ) );
253+
QCOMPARE( candidates.at( 0 ).layerTypes(), QList< Qgis::LayerType >() << Qgis::LayerType::VectorTile );
254+
225255
QCOMPARE( vectorTileMetadata->filters( Qgis::FileFilterType::VectorTile ), QStringLiteral( "Mbtiles Vector Tiles (*.mbtiles *.MBTILES)" ) );
226256
QCOMPARE( vectorTileMetadata->filters( Qgis::FileFilterType::PointCloud ), QString() );
227257

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

400+
// test that vtpk provider is the preferred provider for vtpk files
401+
QList<QgsProviderRegistry::ProviderCandidateDetails> candidates = QgsProviderRegistry::instance()->preferredProvidersForUri( QStringLiteral( "type=vtpk&url=%1/testvtpk.vtpk" ).arg( TEST_DATA_DIR ) );
402+
QCOMPARE( candidates.size(), 1 );
403+
QCOMPARE( candidates.at( 0 ).metadata()->key(), QStringLiteral( "vtpkvectortiles" ) );
404+
QCOMPARE( candidates.at( 0 ).layerTypes(), QList< Qgis::LayerType >() << Qgis::LayerType::VectorTile );
405+
406+
candidates = QgsProviderRegistry::instance()->preferredProvidersForUri( QStringLiteral( TEST_DATA_DIR ) + QStringLiteral( "/testvtpk.vtpk" ) );
407+
QCOMPARE( candidates.size(), 1 );
408+
QCOMPARE( candidates.at( 0 ).metadata()->key(), QStringLiteral( "vtpkvectortiles" ) );
409+
QCOMPARE( candidates.at( 0 ).layerTypes(), QList< Qgis::LayerType >() << Qgis::LayerType::VectorTile );
370410

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

0 commit comments

Comments
 (0)
Please sign in to comment.