Skip to content
Permalink
Browse files

Use GDAL metadata to determine feature styles support

GDAL >= 2.3 only
  • Loading branch information
nyalldawson committed Dec 11, 2017
1 parent 73eec6f commit 83cdd8468b692f826cc9318fc377155375bb1f27
@@ -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;
@@ -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,
@@ -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
@@ -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
@@ -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 );
@@ -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.
You can’t perform that action at this time.