Skip to content

Commit 83cdd84

Browse files
committed
Use GDAL metadata to determine feature styles support
GDAL >= 2.3 only
1 parent 73eec6f commit 83cdd84

File tree

5 files changed

+46
-2
lines changed

5 files changed

+46
-2
lines changed

python/core/qgsvectorfilewriter.sip

+10
Original file line numberDiff line numberDiff line change
@@ -506,6 +506,16 @@ Filter string for file picker dialogs
506506
:rtype: list of str
507507
%End
508508

509+
static bool supportsFeatureStyles( const QString &driverName );
510+
%Docstring
511+
Returns true if the specified ``driverName`` supports feature styles.
512+
513+
The ``driverName`` argument must be a valid GDAL driver name.
514+
515+
.. versionadded:: 3.0
516+
:rtype: bool
517+
%End
518+
509519
struct DriverDetails
510520
{
511521
QString longName;

src/core/qgsvectorfilewriter.cpp

+18-1
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,23 @@ QgsVectorFileWriter::QgsVectorFileWriter( const QString &vectorFileName,
112112
layerName, action );
113113
}
114114

115+
bool QgsVectorFileWriter::supportsFeatureStyles( const QString &driverName )
116+
{
117+
#if GDAL_VERSION_NUM >= GDAL_COMPUTE_VERSION(2,3,0)
118+
GDALDriverH gdalDriver = GDALGetDriverByName( driverName.toLocal8Bit().constData() );
119+
if ( !gdalDriver )
120+
return false;
121+
122+
char **driverMetadata = GDALGetMetadata( gdalDriver, nullptr );
123+
if ( !driverMetadata )
124+
return false;
125+
126+
return CSLFetchBoolean( driverMetadata, GDAL_DCAP_FEATURE_STYLES, false );
127+
#else
128+
return driverName == QLatin1String( "DXF" ) || driverName == QLatin1String( "KML" ) || driverName == QLatin1String( "MapInfo File" ) || driverName == QLatin1String( "MapInfo MIF" );
129+
#endif
130+
}
131+
115132
void QgsVectorFileWriter::init( QString vectorFileName,
116133
QString fileEncoding,
117134
const QgsFields &fields,
@@ -2724,7 +2741,7 @@ QList< QgsVectorFileWriter::FilterFormatDetails > QgsVectorFileWriter::supported
27242741
driverMetadata = GDALGetMetadata( gdalDriver, nullptr );
27252742
}
27262743

2727-
bool nonSpatialFormat = nonSpatialFormat = CSLFetchBoolean( driverMetadata, GDAL_DCAP_NONSPATIAL, false );
2744+
bool nonSpatialFormat = CSLFetchBoolean( driverMetadata, GDAL_DCAP_NONSPATIAL, false );
27282745
#else
27292746
bool nonSpatialFormat = ( drvName == QLatin1String( "ODS" ) || drvName == QLatin1String( "XLSX" ) || drvName == QLatin1String( "XLS" ) );
27302747
#endif

src/core/qgsvectorfilewriter.h

+9
Original file line numberDiff line numberDiff line change
@@ -538,6 +538,15 @@ class CORE_EXPORT QgsVectorFileWriter : public QgsFeatureSink
538538
*/
539539
static QStringList supportedFormatExtensions( VectorFormatOptions options = SortRecommended );
540540

541+
/**
542+
* Returns true if the specified \a driverName supports feature styles.
543+
*
544+
* The \a driverName argument must be a valid GDAL driver name.
545+
*
546+
* \since QGIS 3.0
547+
*/
548+
static bool supportsFeatureStyles( const QString &driverName );
549+
541550
/**
542551
* Details of available driver formats.
543552
* \since QGIS 3.0

src/gui/ogr/qgsvectorlayersaveasdialog.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -388,7 +388,7 @@ void QgsVectorLayerSaveAsDialog::mFormatComboBox_currentIndexChanged( int idx )
388388
}
389389

390390
// Show symbology options only for some formats
391-
if ( sFormat == QLatin1String( "DXF" ) || sFormat == QLatin1String( "KML" ) || sFormat == QLatin1String( "MapInfo File" ) || sFormat == QLatin1String( "MapInfo MIF" ) )
391+
if ( QgsVectorFileWriter::supportsFeatureStyles( sFormat ) )
392392
{
393393
mSymbologyExportLabel->setVisible( true );
394394
mSymbologyExportComboBox->setVisible( true );

tests/src/python/test_qgsvectorfilewriter.py

+8
Original file line numberDiff line numberDiff line change
@@ -842,6 +842,14 @@ def testDriverForExtension(self):
842842
self.assertEqual(QgsVectorFileWriter.driverForExtension('not a format'), '')
843843
self.assertEqual(QgsVectorFileWriter.driverForExtension(''), '')
844844

845+
def testSupportsFeatureStyles(self):
846+
self.assertFalse(QgsVectorFileWriter.supportsFeatureStyles('ESRI Shapefile'))
847+
self.assertFalse(QgsVectorFileWriter.supportsFeatureStyles('not a driver'))
848+
self.assertTrue(QgsVectorFileWriter.supportsFeatureStyles('DXF'))
849+
self.assertTrue(QgsVectorFileWriter.supportsFeatureStyles('KML'))
850+
self.assertTrue(QgsVectorFileWriter.supportsFeatureStyles('MapInfo File'))
851+
self.assertTrue(QgsVectorFileWriter.supportsFeatureStyles('MapInfo MIF'))
852+
845853

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

0 commit comments

Comments
 (0)