Skip to content

Commit

Permalink
Move some common code to QgsGdalUtils
Browse files Browse the repository at this point in the history
  • Loading branch information
nyalldawson committed Jul 23, 2021
1 parent 0dfd561 commit 36aa9f3
Show file tree
Hide file tree
Showing 5 changed files with 50 additions and 20 deletions.
12 changes: 2 additions & 10 deletions src/core/providers/gdal/qgsgdalprovider.cpp
Expand Up @@ -3602,17 +3602,9 @@ QList<QgsProviderSublayerDetails> QgsGdalProviderMetadata::querySublayers( const
}

// if this is a VRT file make sure it is raster VRT
if ( suffix == QLatin1String( "vrt" ) )
if ( suffix == QLatin1String( "vrt" ) && !QgsGdalUtils::vrtMatchesLayerType( path, QgsMapLayerType::RasterLayer ) )
{
CPLPushErrorHandler( CPLQuietErrorHandler );
CPLErrorReset();
GDALDriverH hDriver = GDALIdentifyDriverEx( path.toUtf8().constData(), GDAL_OF_RASTER, nullptr, nullptr );
CPLPopErrorHandler();
if ( !hDriver )
{
// vrt is not a raster vrt, skip it
return {};
}
return {};
}

QgsProviderSublayerDetails details;
Expand Down
12 changes: 2 additions & 10 deletions src/core/providers/ogr/qgsogrprovidermetadata.cpp
Expand Up @@ -1138,17 +1138,9 @@ QList<QgsProviderSublayerDetails> QgsOgrProviderMetadata::querySublayers( const
if ( !QgsGdalUtils::INEXPENSIVE_TO_SCAN_EXTENSIONS.contains( suffix ) )
{
// if this is a VRT file make sure it is vector VRT
if ( suffix == QLatin1String( "vrt" ) )
if ( suffix == QLatin1String( "vrt" ) && !QgsGdalUtils::vrtMatchesLayerType( path, QgsMapLayerType::VectorLayer ) )
{
CPLPushErrorHandler( CPLQuietErrorHandler );
CPLErrorReset();
GDALDriverH hDriver = GDALIdentifyDriverEx( path.toUtf8().constData(), GDAL_OF_VECTOR, nullptr, nullptr );
CPLPopErrorHandler();
if ( !hDriver )
{
// vrt is not a vector vrt, skip it
return {};
}
return {};
}

QgsProviderSublayerDetails details;
Expand Down
28 changes: 28 additions & 0 deletions src/core/qgsgdalutils.cpp
Expand Up @@ -568,4 +568,32 @@ bool QgsGdalUtils::pathIsCheapToOpen( const QString &path, int smallFileSizeLimi
// TODO -- flag formats which only require a quick header parse as cheap
return false;
}

bool QgsGdalUtils::vrtMatchesLayerType( const QString &vrtPath, QgsMapLayerType type )
{
CPLPushErrorHandler( CPLQuietErrorHandler );
CPLErrorReset();
GDALDriverH hDriver = nullptr;

switch ( type )
{
case QgsMapLayerType::VectorLayer:
hDriver = GDALIdentifyDriverEx( vrtPath.toUtf8().constData(), GDAL_OF_VECTOR, nullptr, nullptr );
break;

case QgsMapLayerType::RasterLayer:
hDriver = GDALIdentifyDriverEx( vrtPath.toUtf8().constData(), GDAL_OF_RASTER, nullptr, nullptr );
break;

case QgsMapLayerType::PluginLayer:
case QgsMapLayerType::MeshLayer:
case QgsMapLayerType::VectorTileLayer:
case QgsMapLayerType::AnnotationLayer:
case QgsMapLayerType::PointCloudLayer:
break;
}

CPLPopErrorHandler();
return static_cast< bool >( hDriver );
}
#endif
8 changes: 8 additions & 0 deletions src/core/qgsgdalutils.h
Expand Up @@ -156,6 +156,14 @@ class CORE_EXPORT QgsGdalUtils
*/
static const QStringList SUPPORTED_DB_LAYERS_EXTENSIONS;

/**
* Returns TRUE if the VRT file at the specified path is a VRT matching
* the given layer \a type.
*
* \since QGIS 3.22
*/
static bool vrtMatchesLayerType( const QString &vrtPath, QgsMapLayerType type );

friend class TestQgsGdalUtils;
};

Expand Down
10 changes: 10 additions & 0 deletions tests/src/core/testqgsgdalutils.cpp
Expand Up @@ -42,6 +42,7 @@ class TestQgsGdalUtils: public QObject
void testImageToDataset();
void testResampleImageToImage();
void testPathIsCheapToOpen();
void testVrtMatchesLayerType();

private:

Expand Down Expand Up @@ -284,6 +285,15 @@ void TestQgsGdalUtils::testPathIsCheapToOpen()
QVERIFY( !QgsGdalUtils::pathIsCheapToOpen( QStringLiteral( TEST_DATA_DIR ) + "/delimitedtext/testdms.csv", 500 ) );
}

void TestQgsGdalUtils::testVrtMatchesLayerType()
{
QVERIFY( QgsGdalUtils::vrtMatchesLayerType( QStringLiteral( TEST_DATA_DIR ) + "/raster/hub13263.vrt", QgsMapLayerType::RasterLayer ) );
QVERIFY( !QgsGdalUtils::vrtMatchesLayerType( QStringLiteral( TEST_DATA_DIR ) + "/raster/hub13263.vrt", QgsMapLayerType::VectorLayer ) );

QVERIFY( !QgsGdalUtils::vrtMatchesLayerType( QStringLiteral( TEST_DATA_DIR ) + "/vector_vrt.vrt", QgsMapLayerType::RasterLayer ) );
QVERIFY( QgsGdalUtils::vrtMatchesLayerType( QStringLiteral( TEST_DATA_DIR ) + "/vector_vrt.vrt", QgsMapLayerType::VectorLayer ) );
}

double TestQgsGdalUtils::identify( GDALDatasetH dataset, int band, int px, int py )
{
GDALRasterBandH hBand = GDALGetRasterBand( dataset, band );
Expand Down

0 comments on commit 36aa9f3

Please sign in to comment.