Skip to content

Commit

Permalink
[mdal] Don't report sublayers for .adf files which aren't ESRI tin adf
Browse files Browse the repository at this point in the history
files (e.g. arcinfo grids)
  • Loading branch information
nyalldawson committed Oct 6, 2021
1 parent efcf8f8 commit fcbcf2c
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 0 deletions.
6 changes: 6 additions & 0 deletions src/providers/mdal/qgsmdalprovider.cpp
Expand Up @@ -1155,6 +1155,12 @@ QList<QgsProviderSublayerDetails> QgsMdalProviderMetadata::querySublayers( const
// Filter files by extension
if ( !sExtensions.contains( suffix ) )
return {};

// special handling for .adf files -- although mdal reports support for the .adf file format, we only
// want to report sublayers for tdenv.adf or tdenv9.adf files (otherwise we are reporting that any arcinfo grids or coverages are meshes)
if ( suffix == QLatin1String( "adf" )
&& !info.completeBaseName().startsWith( QLatin1String( "tdenv" ), Qt::CaseInsensitive ) )
return {};
}

if ( flags & Qgis::SublayerQueryFlag::FastScan )
Expand Down
54 changes: 54 additions & 0 deletions tests/src/core/testqgsmeshlayer.cpp
Expand Up @@ -1605,6 +1605,32 @@ void TestQgsMeshLayer::testMdalProviderQuerySublayers()
res = mdalMetadata->querySublayers( QString( TEST_DATA_DIR ) + "/lines.shp" );
QVERIFY( res.empty() );

// even though mdal reports support for .adf files, these are not a mesh:
res = mdalMetadata->querySublayers( QString( TEST_DATA_DIR ) + "/aigrid/dblbnd.adf" );
QVERIFY( res.empty() );
res = mdalMetadata->querySublayers( QString( TEST_DATA_DIR ) + "/aigrid/hdr.adf" );
QVERIFY( res.empty() );
res = mdalMetadata->querySublayers( QString( TEST_DATA_DIR ) + "/aigrid/prj.adf" );
QVERIFY( res.empty() );
res = mdalMetadata->querySublayers( QString( TEST_DATA_DIR ) + "/aigrid/sta.adf" );
QVERIFY( res.empty() );
res = mdalMetadata->querySublayers( QString( TEST_DATA_DIR ) + "/aigrid/vat.adf" );
QVERIFY( res.empty() );
res = mdalMetadata->querySublayers( QString( TEST_DATA_DIR ) + "/aigrid/w001001.adf" );
QVERIFY( res.empty() );
res = mdalMetadata->querySublayers( QString( TEST_DATA_DIR ) + "/aigrid/w001001x.adf" );
QVERIFY( res.empty() );

// adf which IS a mesh
res = mdalMetadata->querySublayers( QString( TEST_DATA_DIR ) + "/esri_tin/tdenv9.adf" );
QCOMPARE( res.count(), 1 );
QCOMPARE( res.at( 0 ).layerNumber(), 0 );
QCOMPARE( res.at( 0 ).name(), QStringLiteral( "esri_tin" ) );
QCOMPARE( res.at( 0 ).uri(), QStringLiteral( "ESRI_TIN:\"%1/esri_tin/tdenv9.adf\"" ).arg( TEST_DATA_DIR ) );
QCOMPARE( res.at( 0 ).providerKey(), QStringLiteral( "mdal" ) );
QCOMPARE( res.at( 0 ).driverName(), QStringLiteral( "ESRI_TIN" ) );
QCOMPARE( res.at( 0 ).type(), QgsMapLayerType::MeshLayer );

// single layer mesh
res = mdalMetadata->querySublayers( mDataDir + "/quad_and_triangle.2dm" );
QCOMPARE( res.count(), 1 );
Expand Down Expand Up @@ -1707,6 +1733,34 @@ void TestQgsMeshLayer::testMdalProviderQuerySublayersFastScan()
QCOMPARE( res.at( 0 ).providerKey(), QStringLiteral( "mdal" ) );
QCOMPARE( res.at( 0 ).type(), QgsMapLayerType::MeshLayer );
QVERIFY( res.at( 0 ).skippedContainerScan() );

// even though mdal reports support for .adf files, these are not a mesh:
res = mdalMetadata->querySublayers( QString( TEST_DATA_DIR ) + "/aigrid/dblbnd.adf", Qgis::SublayerQueryFlag::FastScan );
QVERIFY( res.empty() );
res = mdalMetadata->querySublayers( QString( TEST_DATA_DIR ) + "/aigrid/hdr.adf", Qgis::SublayerQueryFlag::FastScan );
QVERIFY( res.empty() );
res = mdalMetadata->querySublayers( QString( TEST_DATA_DIR ) + "/aigrid/prj.adf", Qgis::SublayerQueryFlag::FastScan );
QVERIFY( res.empty() );
res = mdalMetadata->querySublayers( QString( TEST_DATA_DIR ) + "/aigrid/sta.adf", Qgis::SublayerQueryFlag::FastScan );
QVERIFY( res.empty() );
res = mdalMetadata->querySublayers( QString( TEST_DATA_DIR ) + "/aigrid/vat.adf", Qgis::SublayerQueryFlag::FastScan );
QVERIFY( res.empty() );
res = mdalMetadata->querySublayers( QString( TEST_DATA_DIR ) + "/aigrid/w001001.adf", Qgis::SublayerQueryFlag::FastScan );
QVERIFY( res.empty() );
res = mdalMetadata->querySublayers( QString( TEST_DATA_DIR ) + "/aigrid/w001001x.adf", Qgis::SublayerQueryFlag::FastScan );
QVERIFY( res.empty() );

// adf which IS a mesh
res = mdalMetadata->querySublayers( QString( TEST_DATA_DIR ) + "/esri_tin/tdenv9.adf", Qgis::SublayerQueryFlag::FastScan );
QCOMPARE( res.count(), 1 );
QCOMPARE( res.at( 0 ).layerNumber(), 0 );
QCOMPARE( res.at( 0 ).name(), QStringLiteral( "esri_tin" ) );
QCOMPARE( res.at( 0 ).uri(), QString( TEST_DATA_DIR ) + "/esri_tin/tdenv9.adf" );
QCOMPARE( res.at( 0 ).providerKey(), QStringLiteral( "mdal" ) );
QCOMPARE( res.at( 0 ).type(), QgsMapLayerType::MeshLayer );
// only tdenv?.adf file should report capabilities
res = mdalMetadata->querySublayers( QString( TEST_DATA_DIR ) + "/esri_tin/thul.adf", Qgis::SublayerQueryFlag::FastScan );
QVERIFY( res.empty() );
}

void TestQgsMeshLayer::testSelectByExpression()
Expand Down

0 comments on commit fcbcf2c

Please sign in to comment.