Skip to content

Commit 87e2aab

Browse files
authored
Merge pull request #4492 from nyalldawson/driver_from_extension
Add method to retrieve corresponding OGR driver from a file extension
2 parents 32ff092 + 03dd26e commit 87e2aab

File tree

4 files changed

+55
-0
lines changed

4 files changed

+55
-0
lines changed

python/core/qgsvectorfilewriter.sip

+2
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,8 @@ class QgsVectorFileWriter : QgsFeatureSink
365365
*/
366366
static QMap< QString, QString> ogrDriverList();
367367

368+
static QString driverForExtension( const QString &extension );
369+
368370
/** Returns filter string that can be used for dialogs*/
369371
static QString fileFilterString();
370372

src/core/qgsvectorfilewriter.cpp

+35
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
#include <ogr_srs_api.h>
5050
#include <cpl_error.h>
5151
#include <cpl_conv.h>
52+
#include <cpl_string.h>
5253
#include <gdal.h>
5354

5455
QgsVectorFileWriter::FieldValueConverter::FieldValueConverter()
@@ -2744,6 +2745,40 @@ QMap<QString, QString> QgsVectorFileWriter::ogrDriverList()
27442745
return resultMap;
27452746
}
27462747

2748+
QString QgsVectorFileWriter::driverForExtension( const QString &extension )
2749+
{
2750+
QString ext = extension.trimmed();
2751+
if ( ext.isEmpty() )
2752+
return QString();
2753+
2754+
if ( ext.startsWith( '.' ) )
2755+
ext.remove( 0, 1 );
2756+
2757+
GDALAllRegister();
2758+
int const drvCount = GDALGetDriverCount();
2759+
2760+
for ( int i = 0; i < drvCount; ++i )
2761+
{
2762+
GDALDriverH drv = GDALGetDriver( i );
2763+
if ( drv )
2764+
{
2765+
char **driverMetadata = GDALGetMetadata( drv, nullptr );
2766+
if ( CSLFetchBoolean( driverMetadata, GDAL_DCAP_CREATE, false ) && CSLFetchBoolean( driverMetadata, GDAL_DCAP_VECTOR, false ) )
2767+
{
2768+
QString drvName = GDALGetDriverShortName( drv );
2769+
QStringList driverExtensions = QString( GDALGetMetadataItem( drv, GDAL_DMD_EXTENSIONS, nullptr ) ).split( ' ' );
2770+
2771+
Q_FOREACH ( const QString &driver, driverExtensions )
2772+
{
2773+
if ( driver.compare( ext, Qt::CaseInsensitive ) == 0 )
2774+
return drvName;
2775+
}
2776+
}
2777+
}
2778+
}
2779+
return QString();
2780+
}
2781+
27472782
QString QgsVectorFileWriter::fileFilterString()
27482783
{
27492784
QString filterString;

src/core/qgsvectorfilewriter.h

+8
Original file line numberDiff line numberDiff line change
@@ -482,6 +482,14 @@ class CORE_EXPORT QgsVectorFileWriter : public QgsFeatureSink
482482
*/
483483
static QMap< QString, QString> ogrDriverList();
484484

485+
/**
486+
* Returns the OGR driver name for a specified file \a extension. E.g. the
487+
* driver name for the ".shp" extension is "ESRI Shapefile".
488+
* If no suitable drivers are found then an empty string is returned.
489+
* \since QGIS 3.0
490+
*/
491+
static QString driverForExtension( const QString &extension );
492+
485493
//! Returns filter string that can be used for dialogs
486494
static QString fileFilterString();
487495

tests/src/python/test_qgsvectorfilewriter.py

+10
Original file line numberDiff line numberDiff line change
@@ -722,6 +722,16 @@ def testSupportedFormatExtensions(self):
722722
self.assertFalse('exe' in formats)
723723
self.assertEqual(formats[0], 'shp')
724724

725+
def testDriverForExtension(self):
726+
self.assertEqual(QgsVectorFileWriter.driverForExtension('shp'), 'ESRI Shapefile')
727+
self.assertEqual(QgsVectorFileWriter.driverForExtension('SHP'), 'ESRI Shapefile')
728+
self.assertEqual(QgsVectorFileWriter.driverForExtension('sHp'), 'ESRI Shapefile')
729+
self.assertEqual(QgsVectorFileWriter.driverForExtension('.shp'), 'ESRI Shapefile')
730+
self.assertEqual(QgsVectorFileWriter.driverForExtension('tab'), 'MapInfo File')
731+
self.assertEqual(QgsVectorFileWriter.driverForExtension('.GML'), 'GML')
732+
self.assertEqual(QgsVectorFileWriter.driverForExtension('not a format'), '')
733+
self.assertEqual(QgsVectorFileWriter.driverForExtension(''), '')
734+
725735

726736
if __name__ == '__main__':
727737
unittest.main()

0 commit comments

Comments
 (0)