Skip to content

Commit ce4f93b

Browse files
committedMay 3, 2017
Add method to retrieve corresponding OGR driver from a file extension
1 parent 75fa28f commit ce4f93b

File tree

4 files changed

+48
-0
lines changed

4 files changed

+48
-0
lines changed
 

‎python/core/qgsvectorfilewriter.sip

Lines changed: 2 additions & 0 deletions
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

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2744,6 +2744,34 @@ QMap<QString, QString> QgsVectorFileWriter::ogrDriverList()
27442744
return resultMap;
27452745
}
27462746

2747+
QString QgsVectorFileWriter::driverForExtension( const QString &extension )
2748+
{
2749+
QString ext = extension.trimmed();
2750+
if ( ext.isEmpty() )
2751+
return QString();
2752+
QgsApplication::registerOgrDrivers();
2753+
int const drvCount = OGRGetDriverCount();
2754+
2755+
for ( int i = 0; i < drvCount; ++i )
2756+
{
2757+
OGRSFDriverH drv = OGRGetDriver( i );
2758+
if ( drv )
2759+
{
2760+
QString drvName = OGR_Dr_GetName( drv );
2761+
if ( OGR_Dr_TestCapability( drv, "CreateDataSource" ) != 0 )
2762+
{
2763+
MetaData metadata;
2764+
if ( driverMetadata( drvName, metadata ) )
2765+
{
2766+
if ( metadata.glob.contains( ext, Qt::CaseInsensitive ) )
2767+
return drvName;
2768+
}
2769+
}
2770+
}
2771+
}
2772+
return QString();
2773+
}
2774+
27472775
QString QgsVectorFileWriter::fileFilterString()
27482776
{
27492777
QString filterString;

‎src/core/qgsvectorfilewriter.h

Lines changed: 8 additions & 0 deletions
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

Lines changed: 10 additions & 0 deletions
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)
Please sign in to comment.