Skip to content

Commit 0476d4e

Browse files
committed
[API] method to retrieve corresponding GDAL driver from a file
extension
1 parent fef93fc commit 0476d4e

File tree

4 files changed

+63
-0
lines changed

4 files changed

+63
-0
lines changed

python/core/raster/qgsrasterfilewriter.sip

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,15 @@ class QgsRasterFileWriter
156156
:rtype: list of str
157157
%End
158158

159+
static QString driverForExtension( const QString &extension );
160+
%Docstring
161+
Returns the GDAL driver name for a specified file ``extension``. E.g. the
162+
driver name for the ".tif" extension is "GTiff".
163+
If no suitable drivers are found then an empty string is returned.
164+
.. versionadded:: 3.0
165+
:rtype: str
166+
%End
167+
159168
};
160169

161170
/************************************************************************

src/core/raster/qgsrasterfilewriter.cpp

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@
2929
#include <QTextStream>
3030
#include <QMessageBox>
3131

32+
#include <gdal.h>
33+
#include <cpl_string.h>
34+
3235
QgsRasterDataProvider *QgsRasterFileWriter::createOneBandRaster( Qgis::DataType dataType, int width, int height, const QgsRectangle &extent, const QgsCoordinateReferenceSystem &crs )
3336
{
3437
if ( mTiledMode )
@@ -991,3 +994,37 @@ QString QgsRasterFileWriter::vrtFileName()
991994
QFileInfo outputInfo( mOutputUrl );
992995
return QStringLiteral( "%1.vrt" ).arg( outputInfo.fileName() );
993996
}
997+
998+
QString QgsRasterFileWriter::driverForExtension( const QString &extension )
999+
{
1000+
QString ext = extension.trimmed();
1001+
if ( ext.isEmpty() )
1002+
return QString();
1003+
1004+
if ( ext.startsWith( '.' ) )
1005+
ext.remove( 0, 1 );
1006+
1007+
GDALAllRegister();
1008+
int const drvCount = GDALGetDriverCount();
1009+
1010+
for ( int i = 0; i < drvCount; ++i )
1011+
{
1012+
GDALDriverH drv = GDALGetDriver( i );
1013+
if ( drv )
1014+
{
1015+
char **driverMetadata = GDALGetMetadata( drv, nullptr );
1016+
if ( CSLFetchBoolean( driverMetadata, GDAL_DCAP_CREATE, false ) && CSLFetchBoolean( driverMetadata, GDAL_DCAP_RASTER, false ) )
1017+
{
1018+
QString drvName = GDALGetDriverShortName( drv );
1019+
QStringList driverExtensions = QString( GDALGetMetadataItem( drv, GDAL_DMD_EXTENSIONS, nullptr ) ).split( ' ' );
1020+
1021+
Q_FOREACH ( const QString &driver, driverExtensions )
1022+
{
1023+
if ( driver.compare( ext, Qt::CaseInsensitive ) == 0 )
1024+
return drvName;
1025+
}
1026+
}
1027+
}
1028+
}
1029+
return QString();
1030+
}

src/core/raster/qgsrasterfilewriter.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,14 @@ class CORE_EXPORT QgsRasterFileWriter
130130
void setPyramidsConfigOptions( const QStringList &list ) { mPyramidsConfigOptions = list; }
131131
QStringList pyramidsConfigOptions() const { return mPyramidsConfigOptions; }
132132

133+
/**
134+
* Returns the GDAL driver name for a specified file \a extension. E.g. the
135+
* driver name for the ".tif" extension is "GTiff".
136+
* If no suitable drivers are found then an empty string is returned.
137+
* \since QGIS 3.0
138+
*/
139+
static QString driverForExtension( const QString &extension );
140+
133141
private:
134142
QgsRasterFileWriter(); //forbidden
135143
WriterError writeDataRaster( const QgsRasterPipe *pipe, QgsRasterIterator *iter, int nCols, int nRows, const QgsRectangle &outputExtent,

tests/src/python/test_qgsrasterfilewriter.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,15 @@ def testWrite(self):
9797

9898
assert allOk, "Raster file writer test failed"
9999

100+
def testDriverForExtension(self):
101+
self.assertEqual(QgsRasterFileWriter.driverForExtension('tif'), 'GTiff')
102+
self.assertEqual(QgsRasterFileWriter.driverForExtension('TIF'), 'GTiff')
103+
self.assertEqual(QgsRasterFileWriter.driverForExtension('tIf'), 'GTiff')
104+
self.assertEqual(QgsRasterFileWriter.driverForExtension('.tif'), 'GTiff')
105+
self.assertEqual(QgsRasterFileWriter.driverForExtension('img'), 'HFA')
106+
self.assertEqual(QgsRasterFileWriter.driverForExtension('.vrt'), 'VRT')
107+
self.assertEqual(QgsRasterFileWriter.driverForExtension('not a format'), '')
108+
self.assertEqual(QgsRasterFileWriter.driverForExtension(''), '')
100109

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

0 commit comments

Comments
 (0)