Skip to content

Commit

Permalink
Add method to retrieve corresponding OGR driver from a file extension
Browse files Browse the repository at this point in the history
  • Loading branch information
nyalldawson committed May 3, 2017
1 parent 75fa28f commit ce4f93b
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 0 deletions.
2 changes: 2 additions & 0 deletions python/core/qgsvectorfilewriter.sip
Expand Up @@ -365,6 +365,8 @@ class QgsVectorFileWriter : QgsFeatureSink
*/
static QMap< QString, QString> ogrDriverList();

static QString driverForExtension( const QString &extension );

/** Returns filter string that can be used for dialogs*/
static QString fileFilterString();

Expand Down
28 changes: 28 additions & 0 deletions src/core/qgsvectorfilewriter.cpp
Expand Up @@ -2744,6 +2744,34 @@ QMap<QString, QString> QgsVectorFileWriter::ogrDriverList()
return resultMap;
}

QString QgsVectorFileWriter::driverForExtension( const QString &extension )
{
QString ext = extension.trimmed();
if ( ext.isEmpty() )
return QString();
QgsApplication::registerOgrDrivers();
int const drvCount = OGRGetDriverCount();

for ( int i = 0; i < drvCount; ++i )
{
OGRSFDriverH drv = OGRGetDriver( i );
if ( drv )
{
QString drvName = OGR_Dr_GetName( drv );
if ( OGR_Dr_TestCapability( drv, "CreateDataSource" ) != 0 )
{
MetaData metadata;
if ( driverMetadata( drvName, metadata ) )
{
if ( metadata.glob.contains( ext, Qt::CaseInsensitive ) )
return drvName;
}
}
}
}
return QString();
}

QString QgsVectorFileWriter::fileFilterString()
{
QString filterString;
Expand Down
8 changes: 8 additions & 0 deletions src/core/qgsvectorfilewriter.h
Expand Up @@ -482,6 +482,14 @@ class CORE_EXPORT QgsVectorFileWriter : public QgsFeatureSink
*/
static QMap< QString, QString> ogrDriverList();

/**
* Returns the OGR driver name for a specified file \a extension. E.g. the
* driver name for the ".shp" extension is "ESRI Shapefile".
* If no suitable drivers are found then an empty string is returned.
* \since QGIS 3.0
*/
static QString driverForExtension( const QString &extension );

//! Returns filter string that can be used for dialogs
static QString fileFilterString();

Expand Down
10 changes: 10 additions & 0 deletions tests/src/python/test_qgsvectorfilewriter.py
Expand Up @@ -722,6 +722,16 @@ def testSupportedFormatExtensions(self):
self.assertFalse('exe' in formats)
self.assertEqual(formats[0], 'shp')

def testDriverForExtension(self):
self.assertEqual(QgsVectorFileWriter.driverForExtension('shp'), 'ESRI Shapefile')
self.assertEqual(QgsVectorFileWriter.driverForExtension('SHP'), 'ESRI Shapefile')
self.assertEqual(QgsVectorFileWriter.driverForExtension('sHp'), 'ESRI Shapefile')
self.assertEqual(QgsVectorFileWriter.driverForExtension('.shp'), 'ESRI Shapefile')
self.assertEqual(QgsVectorFileWriter.driverForExtension('tab'), 'MapInfo File')
self.assertEqual(QgsVectorFileWriter.driverForExtension('.GML'), 'GML')
self.assertEqual(QgsVectorFileWriter.driverForExtension('not a format'), '')
self.assertEqual(QgsVectorFileWriter.driverForExtension(''), '')


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

0 comments on commit ce4f93b

Please sign in to comment.