Skip to content

Commit

Permalink
Use GDAL metadata to determine feature styles support
Browse files Browse the repository at this point in the history
GDAL >= 2.3 only
  • Loading branch information
nyalldawson committed Dec 11, 2017
1 parent 73eec6f commit 83cdd84
Show file tree
Hide file tree
Showing 5 changed files with 46 additions and 2 deletions.
10 changes: 10 additions & 0 deletions python/core/qgsvectorfilewriter.sip
Expand Up @@ -506,6 +506,16 @@ Filter string for file picker dialogs
:rtype: list of str
%End

static bool supportsFeatureStyles( const QString &driverName );
%Docstring
Returns true if the specified ``driverName`` supports feature styles.

The ``driverName`` argument must be a valid GDAL driver name.

.. versionadded:: 3.0
:rtype: bool
%End

struct DriverDetails
{
QString longName;
Expand Down
19 changes: 18 additions & 1 deletion src/core/qgsvectorfilewriter.cpp
Expand Up @@ -112,6 +112,23 @@ QgsVectorFileWriter::QgsVectorFileWriter( const QString &vectorFileName,
layerName, action );
}

bool QgsVectorFileWriter::supportsFeatureStyles( const QString &driverName )
{
#if GDAL_VERSION_NUM >= GDAL_COMPUTE_VERSION(2,3,0)
GDALDriverH gdalDriver = GDALGetDriverByName( driverName.toLocal8Bit().constData() );
if ( !gdalDriver )
return false;

char **driverMetadata = GDALGetMetadata( gdalDriver, nullptr );
if ( !driverMetadata )
return false;

return CSLFetchBoolean( driverMetadata, GDAL_DCAP_FEATURE_STYLES, false );
#else
return driverName == QLatin1String( "DXF" ) || driverName == QLatin1String( "KML" ) || driverName == QLatin1String( "MapInfo File" ) || driverName == QLatin1String( "MapInfo MIF" );
#endif
}

void QgsVectorFileWriter::init( QString vectorFileName,
QString fileEncoding,
const QgsFields &fields,
Expand Down Expand Up @@ -2724,7 +2741,7 @@ QList< QgsVectorFileWriter::FilterFormatDetails > QgsVectorFileWriter::supported
driverMetadata = GDALGetMetadata( gdalDriver, nullptr );
}

bool nonSpatialFormat = nonSpatialFormat = CSLFetchBoolean( driverMetadata, GDAL_DCAP_NONSPATIAL, false );
bool nonSpatialFormat = CSLFetchBoolean( driverMetadata, GDAL_DCAP_NONSPATIAL, false );
#else
bool nonSpatialFormat = ( drvName == QLatin1String( "ODS" ) || drvName == QLatin1String( "XLSX" ) || drvName == QLatin1String( "XLS" ) );
#endif
Expand Down
9 changes: 9 additions & 0 deletions src/core/qgsvectorfilewriter.h
Expand Up @@ -538,6 +538,15 @@ class CORE_EXPORT QgsVectorFileWriter : public QgsFeatureSink
*/
static QStringList supportedFormatExtensions( VectorFormatOptions options = SortRecommended );

/**
* Returns true if the specified \a driverName supports feature styles.
*
* The \a driverName argument must be a valid GDAL driver name.
*
* \since QGIS 3.0
*/
static bool supportsFeatureStyles( const QString &driverName );

/**
* Details of available driver formats.
* \since QGIS 3.0
Expand Down
2 changes: 1 addition & 1 deletion src/gui/ogr/qgsvectorlayersaveasdialog.cpp
Expand Up @@ -388,7 +388,7 @@ void QgsVectorLayerSaveAsDialog::mFormatComboBox_currentIndexChanged( int idx )
}

// Show symbology options only for some formats
if ( sFormat == QLatin1String( "DXF" ) || sFormat == QLatin1String( "KML" ) || sFormat == QLatin1String( "MapInfo File" ) || sFormat == QLatin1String( "MapInfo MIF" ) )
if ( QgsVectorFileWriter::supportsFeatureStyles( sFormat ) )
{
mSymbologyExportLabel->setVisible( true );
mSymbologyExportComboBox->setVisible( true );
Expand Down
8 changes: 8 additions & 0 deletions tests/src/python/test_qgsvectorfilewriter.py
Expand Up @@ -842,6 +842,14 @@ def testDriverForExtension(self):
self.assertEqual(QgsVectorFileWriter.driverForExtension('not a format'), '')
self.assertEqual(QgsVectorFileWriter.driverForExtension(''), '')

def testSupportsFeatureStyles(self):
self.assertFalse(QgsVectorFileWriter.supportsFeatureStyles('ESRI Shapefile'))
self.assertFalse(QgsVectorFileWriter.supportsFeatureStyles('not a driver'))
self.assertTrue(QgsVectorFileWriter.supportsFeatureStyles('DXF'))
self.assertTrue(QgsVectorFileWriter.supportsFeatureStyles('KML'))
self.assertTrue(QgsVectorFileWriter.supportsFeatureStyles('MapInfo File'))
self.assertTrue(QgsVectorFileWriter.supportsFeatureStyles('MapInfo MIF'))


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

0 comments on commit 83cdd84

Please sign in to comment.