Skip to content

Commit 04a7357

Browse files
committedJun 23, 2021
Implement querySublayers for mdal provider
1 parent 69debff commit 04a7357

File tree

4 files changed

+94
-0
lines changed

4 files changed

+94
-0
lines changed
 

‎src/providers/mdal/qgsmdalprovider.cpp

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@
2323
#include "qgsapplication.h"
2424
#include "qgsmdaldataitems.h"
2525
#include "qgsmeshdataprovidertemporalcapabilities.h"
26+
#include "qgsprovidersublayerdetails.h"
2627

28+
#include <QFileInfo>
2729

2830
const QString QgsMdalProvider::MDAL_PROVIDER_KEY = QStringLiteral( "mdal" );
2931
const QString QgsMdalProvider::MDAL_PROVIDER_DESCRIPTION = QStringLiteral( "MDAL provider" );
@@ -998,6 +1000,56 @@ QgsProviderMetadata::ProviderCapabilities QgsMdalProviderMetadata::providerCapab
9981000
return FileBasedUris;
9991001
}
10001002

1003+
QList<QgsProviderSublayerDetails> QgsMdalProviderMetadata::querySublayers( const QString &uri, Qgis::SublayerQueryFlags, QgsFeedback * ) const
1004+
{
1005+
if ( uri.isEmpty() )
1006+
return {};
1007+
1008+
// get suffix, removing .gz if present
1009+
const QFileInfo info( uri );
1010+
// allow only normal files
1011+
if ( !info.isFile() )
1012+
return {};
1013+
1014+
const QString suffix = info.suffix().toLower();
1015+
1016+
static QStringList sExtensions;
1017+
static std::once_flag initialized;
1018+
std::call_once( initialized, [ = ]( )
1019+
{
1020+
QStringList meshExtensions;
1021+
QStringList datasetsExtensions;
1022+
QgsMdalProvider::fileMeshExtensions( sExtensions, datasetsExtensions );
1023+
Q_UNUSED( datasetsExtensions )
1024+
} );
1025+
1026+
// Filter files by extension
1027+
if ( !sExtensions.contains( suffix ) )
1028+
return {};
1029+
1030+
const QStringList meshNames = QString( MDAL_MeshNames( uri.toUtf8() ) ).split( QStringLiteral( ";;" ) );
1031+
1032+
QList<QgsProviderSublayerDetails> res;
1033+
res.reserve( meshNames.size() );
1034+
int layerIndex = 0;
1035+
for ( const QString &layerUri : meshNames )
1036+
{
1037+
QgsProviderSublayerDetails details;
1038+
details.setUri( layerUri );
1039+
details.setProviderKey( QStringLiteral( "mdal" ) );
1040+
details.setType( QgsMapLayerType::MeshLayer );
1041+
details.setLayerNumber( layerIndex );
1042+
1043+
// strip the driver name and path from the MDAL uri to get the layer name
1044+
details.setName( layerUri.mid( layerUri.indexOf( uri ) + uri.length() + 2 ) );
1045+
1046+
res << details;
1047+
1048+
layerIndex++;
1049+
}
1050+
return res;
1051+
}
1052+
10011053
QString QgsMdalProviderMetadata::filters( FilterType type )
10021054
{
10031055
switch ( type )

‎src/providers/mdal/qgsmdalprovider.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ class QgsMdalProviderMetadata: public QgsProviderMetadata
146146
QVariantMap decodeUri( const QString &uri ) const override;
147147
QString encodeUri( const QVariantMap &parts ) const override;
148148
ProviderCapabilities providerCapabilities() const override;
149+
QList< QgsProviderSublayerDetails > querySublayers( const QString &uri, Qgis::SublayerQueryFlags flags = Qgis::SublayerQueryFlags(), QgsFeedback *feedback = nullptr ) const override;
149150
};
150151

151152
#endif //QGSMDALPROVIDER_H

‎tests/src/core/testqgsmeshlayer.cpp

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030
#include "qgsmeshlayertemporalproperties.h"
3131

3232
#include "qgsmeshdataprovidertemporalcapabilities.h"
33+
#include "qgsprovidermetadata.h"
34+
#include "qgsprovidersublayerdetails.h"
3335

3436
/**
3537
* \ingroup UnitTests
@@ -92,6 +94,8 @@ class TestQgsMeshLayer : public QObject
9294
void test_memory_dataset_group_1d();
9395

9496
void test_setDataSource();
97+
98+
void testMdalProviderQuerySublayers();
9599
};
96100

97101
QString TestQgsMeshLayer::readFile( const QString &fname ) const
@@ -1582,6 +1586,43 @@ void TestQgsMeshLayer::test_setDataSource()
15821586
QCOMPARE( QgsMeshDatasetValue( 2.0 ), layerWithBadDataSource.datasetValue( QgsMeshDatasetIndex( 4, 0 ), 1 ) );
15831587
}
15841588

1589+
void TestQgsMeshLayer::testMdalProviderQuerySublayers()
1590+
{
1591+
// test querying sub layers for a mesh layer
1592+
QgsProviderMetadata *mdalMetadata = QgsProviderRegistry::instance()->providerMetadata( QStringLiteral( "mdal" ) );
1593+
1594+
// invalid uri
1595+
QList< QgsProviderSublayerDetails >res = mdalMetadata->querySublayers( QString() );
1596+
QVERIFY( res.empty() );
1597+
1598+
// not a mesh
1599+
res = mdalMetadata->querySublayers( QString( TEST_DATA_DIR ) + "/lines.shp" );
1600+
QVERIFY( res.empty() );
1601+
1602+
// single layer mesh
1603+
res = mdalMetadata->querySublayers( mDataDir + "/quad_and_triangle.2dm" );
1604+
QCOMPARE( res.count(), 1 );
1605+
QCOMPARE( res.at( 0 ).layerNumber(), 0 );
1606+
QCOMPARE( res.at( 0 ).name(), QString( ) );
1607+
QCOMPARE( res.at( 0 ).uri(), QStringLiteral( "2DM:\"%1/quad_and_triangle.2dm\"" ).arg( mDataDir ) );
1608+
QCOMPARE( res.at( 0 ).providerKey(), QStringLiteral( "mdal" ) );
1609+
QCOMPARE( res.at( 0 ).type(), QgsMapLayerType::MeshLayer );
1610+
1611+
// mesh with two layers
1612+
res = mdalMetadata->querySublayers( mDataDir + "/manzese_1d2d_small_map.nc" );
1613+
QCOMPARE( res.count(), 2 );
1614+
QCOMPARE( res.at( 0 ).layerNumber(), 0 );
1615+
QCOMPARE( res.at( 0 ).name(), QStringLiteral( "mesh1d" ) );
1616+
QCOMPARE( res.at( 0 ).uri(), QStringLiteral( "Ugrid:\"%1/manzese_1d2d_small_map.nc\":mesh1d" ).arg( mDataDir ) );
1617+
QCOMPARE( res.at( 0 ).providerKey(), QStringLiteral( "mdal" ) );
1618+
QCOMPARE( res.at( 0 ).type(), QgsMapLayerType::MeshLayer );
1619+
QCOMPARE( res.at( 1 ).layerNumber(), 1 );
1620+
QCOMPARE( res.at( 1 ).name(), QStringLiteral( "mesh2d" ) );
1621+
QCOMPARE( res.at( 1 ).uri(), QStringLiteral( "Ugrid:\"%1/manzese_1d2d_small_map.nc\":mesh2d" ).arg( mDataDir ) );
1622+
QCOMPARE( res.at( 1 ).providerKey(), QStringLiteral( "mdal" ) );
1623+
QCOMPARE( res.at( 1 ).type(), QgsMapLayerType::MeshLayer );
1624+
}
1625+
15851626
void TestQgsMeshLayer::test_temporal()
15861627
{
15871628
qint64 relativeTime_0 = -1000;
3.01 MB
Binary file not shown.

0 commit comments

Comments
 (0)
Please sign in to comment.