diff --git a/python/core/qgsvectorfilewriter.sip b/python/core/qgsvectorfilewriter.sip index 6a160ce8030..6423073d3db 100644 --- a/python/core/qgsvectorfilewriter.sip +++ b/python/core/qgsvectorfilewriter.sip @@ -147,6 +147,7 @@ Some formats require a compulsory encoding, typically UTF-8. If no compulsory en enum VectorFormatOption { SortRecommended, + SkipNonSpatialFormats, }; typedef QFlags VectorFormatOptions; diff --git a/src/core/qgsvectorfilewriter.cpp b/src/core/qgsvectorfilewriter.cpp index a7645eca22d..bb624d09a3e 100644 --- a/src/core/qgsvectorfilewriter.cpp +++ b/src/core/qgsvectorfilewriter.cpp @@ -2699,6 +2699,14 @@ QList< QgsVectorFileWriter::FilterFormatDetails > QgsVectorFileWriter::supported QString drvName = OGR_Dr_GetName( drv ); if ( OGR_Dr_TestCapability( drv, "CreateDataSource" ) != 0 ) { + if ( options & SkipNonSpatialFormats ) + { + // skip non-spatial formats + // TODO - use GDAL metadata to determine this, when support exists in GDAL + if ( drvName == QStringLiteral( "ODS" ) || drvName == QStringLiteral( "XLSX" ) || drvName == QStringLiteral( "XLS" ) ) + continue; + } + QString filterString = filterForDriver( drvName ); if ( filterString.isEmpty() ) continue; @@ -2780,6 +2788,15 @@ QList< QgsVectorFileWriter::DriverDetails > QgsVectorFileWriter::ogrDriverList( if ( drv ) { QString drvName = OGR_Dr_GetName( drv ); + + if ( options & SkipNonSpatialFormats ) + { + // skip non-spatial formats + // TODO - use GDAL metadata to determine this, when support exists in GDAL + if ( drvName == QStringLiteral( "ODS" ) || drvName == QStringLiteral( "XLSX" ) || drvName == QStringLiteral( "XLS" ) ) + continue; + } + if ( drvName == QLatin1String( "ESRI Shapefile" ) ) { writableDrivers << QStringLiteral( "DBF file" ); diff --git a/src/core/qgsvectorfilewriter.h b/src/core/qgsvectorfilewriter.h index d243b4d623a..ef7952a365d 100644 --- a/src/core/qgsvectorfilewriter.h +++ b/src/core/qgsvectorfilewriter.h @@ -191,6 +191,7 @@ class CORE_EXPORT QgsVectorFileWriter : public QgsFeatureSink enum VectorFormatOption { SortRecommended = 1 << 1, //!< Use recommended sort order, with extremely commonly used formats listed first + SkipNonSpatialFormats = 1 << 2, //!< Filter out any formats which do not have spatial support (e.g. those which cannot save geometries) }; Q_DECLARE_FLAGS( VectorFormatOptions, VectorFormatOption ) diff --git a/src/plugins/geometry_checker/qgsgeometrycheckersetuptab.cpp b/src/plugins/geometry_checker/qgsgeometrycheckersetuptab.cpp index 455dcad4fca..d801a170870 100644 --- a/src/plugins/geometry_checker/qgsgeometrycheckersetuptab.cpp +++ b/src/plugins/geometry_checker/qgsgeometrycheckersetuptab.cpp @@ -54,7 +54,7 @@ QgsGeometryCheckerSetupTab::QgsGeometryCheckerSetupTab( QgisInterface *iface, QD mAbortButton = new QPushButton( tr( "Abort" ) ); mRunButton->setEnabled( false ); - const auto filterFormatMap = QgsVectorFileWriter::supportedFiltersAndFormats(); + const auto filterFormatMap = QgsVectorFileWriter::supportedFiltersAndFormats( QgsVectorFileWriter::SortRecommended | QgsVectorFileWriter::SkipNonSpatialFormats ); for ( const QgsVectorFileWriter::FilterFormatDetails &filter : filterFormatMap ) { QString driverName = filter.driverName; @@ -216,7 +216,7 @@ void QgsGeometryCheckerSetupTab::validateInput() void QgsGeometryCheckerSetupTab::selectOutputDirectory() { QString filterString = QgsVectorFileWriter::filterForDriver( QStringLiteral( "GPKG" ) ); - const auto filterFormatMap = QgsVectorFileWriter::supportedFiltersAndFormats(); + const auto filterFormatMap = QgsVectorFileWriter::supportedFiltersAndFormats( QgsVectorFileWriter::SortRecommended | QgsVectorFileWriter::SkipNonSpatialFormats ); for ( const QgsVectorFileWriter::FilterFormatDetails &filter : filterFormatMap ) { QString driverName = filter.driverName; diff --git a/tests/src/python/test_qgsvectorfilewriter.py b/tests/src/python/test_qgsvectorfilewriter.py index 89c0bbd2893..36a53fc0bf1 100644 --- a/tests/src/python/test_qgsvectorfilewriter.py +++ b/tests/src/python/test_qgsvectorfilewriter.py @@ -730,12 +730,18 @@ class TestQgsVectorFileWriter(unittest.TestCase): self.assertEqual(formats[0].driverName, 'GPKG') self.assertEqual(formats[1].filterString, 'ESRI Shapefile (*.shp *.SHP)') self.assertEqual(formats[1].driverName, 'ESRI Shapefile') + self.assertTrue('ODS' in [f.driverName for f in formats]) + # alphabetical sorting formats2 = QgsVectorFileWriter.supportedFiltersAndFormats(QgsVectorFileWriter.VectorFormatOptions()) self.assertTrue(formats2[0].driverName < formats2[1].driverName) self.assertCountEqual([f.driverName for f in formats], [f.driverName for f in formats2]) self.assertNotEqual(formats2[0].driverName, 'GeoPackage') + # skip non-spatial + formats = QgsVectorFileWriter.supportedFiltersAndFormats(QgsVectorFileWriter.SkipNonSpatialFormats) + self.assertFalse('ODS' in [f.driverName for f in formats]) + def testOgrDriverList(self): # test with drivers in recommended order drivers = QgsVectorFileWriter.ogrDriverList(QgsVectorFileWriter.SortRecommended) @@ -743,18 +749,24 @@ class TestQgsVectorFileWriter(unittest.TestCase): self.assertEqual(drivers[0].driverName, 'GPKG') self.assertEqual(drivers[1].longName, 'ESRI Shapefile') self.assertEqual(drivers[1].driverName, 'ESRI Shapefile') + self.assertTrue('ODS' in [f.driverName for f in drivers]) # alphabetical sorting drivers2 = QgsVectorFileWriter.ogrDriverList(QgsVectorFileWriter.VectorFormatOptions()) self.assertTrue(drivers2[0].longName < drivers2[1].longName) self.assertCountEqual([d.driverName for d in drivers], [d.driverName for d in drivers2]) self.assertNotEqual(drivers2[0].driverName, 'GPKG') + # skip non-spatial + formats = QgsVectorFileWriter.ogrDriverList(QgsVectorFileWriter.SkipNonSpatialFormats) + self.assertFalse('ODS' in [f.driverName for f in formats]) + def testSupportedFormatExtensions(self): formats = QgsVectorFileWriter.supportedFormatExtensions() self.assertTrue('gpkg' in formats) self.assertFalse('exe' in formats) self.assertEqual(formats[0], 'gpkg') self.assertEqual(formats[1], 'shp') + self.assertTrue('ods' in formats) # alphabetical sorting formats2 = QgsVectorFileWriter.supportedFormatExtensions(QgsVectorFileWriter.VectorFormatOptions()) @@ -762,16 +774,24 @@ class TestQgsVectorFileWriter(unittest.TestCase): self.assertCountEqual(formats, formats2) self.assertNotEqual(formats2[0], 'gpkg') + formats = QgsVectorFileWriter.supportedFormatExtensions(QgsVectorFileWriter.SkipNonSpatialFormats) + self.assertFalse('ods' in formats) + def testFileFilterString(self): formats = QgsVectorFileWriter.fileFilterString() self.assertTrue('gpkg' in formats) self.assertTrue('shp' in formats) self.assertTrue(formats.index('gpkg') < formats.index('shp')) + self.assertTrue('ods' in formats) # alphabetical sorting formats2 = QgsVectorFileWriter.fileFilterString(QgsVectorFileWriter.VectorFormatOptions()) self.assertNotEqual(formats.index('gpkg'), formats2.index('gpkg')) + # hide non spatial + formats = QgsVectorFileWriter.fileFilterString(QgsVectorFileWriter.SkipNonSpatialFormats) + self.assertFalse('ods' in formats) + def testDriverForExtension(self): self.assertEqual(QgsVectorFileWriter.driverForExtension('shp'), 'ESRI Shapefile') self.assertEqual(QgsVectorFileWriter.driverForExtension('SHP'), 'ESRI Shapefile')