Move some common code to QgsGdalUtils

This commit is contained in:
Nyall Dawson 2021-07-22 09:10:06 +10:00
parent 0dfd561e4a
commit 36aa9f3109
5 changed files with 50 additions and 20 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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

View File

@ -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;
};

View File

@ -42,6 +42,7 @@ class TestQgsGdalUtils: public QObject
void testImageToDataset();
void testResampleImageToImage();
void testPathIsCheapToOpen();
void testVrtMatchesLayerType();
private:
@ -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 );