Skip to content

Commit 8499d7f

Browse files
committed
Add option to hide non-spatial formats from driver lists
And hide non-spatial formats from geometry checker available formats
1 parent fe05660 commit 8499d7f

File tree

5 files changed

+41
-2
lines changed

5 files changed

+41
-2
lines changed

python/core/qgsvectorfilewriter.sip

+1
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ Some formats require a compulsory encoding, typically UTF-8. If no compulsory en
147147
enum VectorFormatOption
148148
{
149149
SortRecommended,
150+
SkipNonSpatialFormats,
150151
};
151152
typedef QFlags<QgsVectorFileWriter::VectorFormatOption> VectorFormatOptions;
152153

src/core/qgsvectorfilewriter.cpp

+17
Original file line numberDiff line numberDiff line change
@@ -2699,6 +2699,14 @@ QList< QgsVectorFileWriter::FilterFormatDetails > QgsVectorFileWriter::supported
26992699
QString drvName = OGR_Dr_GetName( drv );
27002700
if ( OGR_Dr_TestCapability( drv, "CreateDataSource" ) != 0 )
27012701
{
2702+
if ( options & SkipNonSpatialFormats )
2703+
{
2704+
// skip non-spatial formats
2705+
// TODO - use GDAL metadata to determine this, when support exists in GDAL
2706+
if ( drvName == QStringLiteral( "ODS" ) || drvName == QStringLiteral( "XLSX" ) || drvName == QStringLiteral( "XLS" ) )
2707+
continue;
2708+
}
2709+
27022710
QString filterString = filterForDriver( drvName );
27032711
if ( filterString.isEmpty() )
27042712
continue;
@@ -2780,6 +2788,15 @@ QList< QgsVectorFileWriter::DriverDetails > QgsVectorFileWriter::ogrDriverList(
27802788
if ( drv )
27812789
{
27822790
QString drvName = OGR_Dr_GetName( drv );
2791+
2792+
if ( options & SkipNonSpatialFormats )
2793+
{
2794+
// skip non-spatial formats
2795+
// TODO - use GDAL metadata to determine this, when support exists in GDAL
2796+
if ( drvName == QStringLiteral( "ODS" ) || drvName == QStringLiteral( "XLSX" ) || drvName == QStringLiteral( "XLS" ) )
2797+
continue;
2798+
}
2799+
27832800
if ( drvName == QLatin1String( "ESRI Shapefile" ) )
27842801
{
27852802
writableDrivers << QStringLiteral( "DBF file" );

src/core/qgsvectorfilewriter.h

+1
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,7 @@ class CORE_EXPORT QgsVectorFileWriter : public QgsFeatureSink
191191
enum VectorFormatOption
192192
{
193193
SortRecommended = 1 << 1, //!< Use recommended sort order, with extremely commonly used formats listed first
194+
SkipNonSpatialFormats = 1 << 2, //!< Filter out any formats which do not have spatial support (e.g. those which cannot save geometries)
194195
};
195196
Q_DECLARE_FLAGS( VectorFormatOptions, VectorFormatOption )
196197

src/plugins/geometry_checker/qgsgeometrycheckersetuptab.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ QgsGeometryCheckerSetupTab::QgsGeometryCheckerSetupTab( QgisInterface *iface, QD
5454
mAbortButton = new QPushButton( tr( "Abort" ) );
5555
mRunButton->setEnabled( false );
5656

57-
const auto filterFormatMap = QgsVectorFileWriter::supportedFiltersAndFormats();
57+
const auto filterFormatMap = QgsVectorFileWriter::supportedFiltersAndFormats( QgsVectorFileWriter::SortRecommended | QgsVectorFileWriter::SkipNonSpatialFormats );
5858
for ( const QgsVectorFileWriter::FilterFormatDetails &filter : filterFormatMap )
5959
{
6060
QString driverName = filter.driverName;
@@ -216,7 +216,7 @@ void QgsGeometryCheckerSetupTab::validateInput()
216216
void QgsGeometryCheckerSetupTab::selectOutputDirectory()
217217
{
218218
QString filterString = QgsVectorFileWriter::filterForDriver( QStringLiteral( "GPKG" ) );
219-
const auto filterFormatMap = QgsVectorFileWriter::supportedFiltersAndFormats();
219+
const auto filterFormatMap = QgsVectorFileWriter::supportedFiltersAndFormats( QgsVectorFileWriter::SortRecommended | QgsVectorFileWriter::SkipNonSpatialFormats );
220220
for ( const QgsVectorFileWriter::FilterFormatDetails &filter : filterFormatMap )
221221
{
222222
QString driverName = filter.driverName;

tests/src/python/test_qgsvectorfilewriter.py

+20
Original file line numberDiff line numberDiff line change
@@ -730,48 +730,68 @@ def testSupportedFiltersAndFormat(self):
730730
self.assertEqual(formats[0].driverName, 'GPKG')
731731
self.assertEqual(formats[1].filterString, 'ESRI Shapefile (*.shp *.SHP)')
732732
self.assertEqual(formats[1].driverName, 'ESRI Shapefile')
733+
self.assertTrue('ODS' in [f.driverName for f in formats])
734+
733735
# alphabetical sorting
734736
formats2 = QgsVectorFileWriter.supportedFiltersAndFormats(QgsVectorFileWriter.VectorFormatOptions())
735737
self.assertTrue(formats2[0].driverName < formats2[1].driverName)
736738
self.assertCountEqual([f.driverName for f in formats], [f.driverName for f in formats2])
737739
self.assertNotEqual(formats2[0].driverName, 'GeoPackage')
738740

741+
# skip non-spatial
742+
formats = QgsVectorFileWriter.supportedFiltersAndFormats(QgsVectorFileWriter.SkipNonSpatialFormats)
743+
self.assertFalse('ODS' in [f.driverName for f in formats])
744+
739745
def testOgrDriverList(self):
740746
# test with drivers in recommended order
741747
drivers = QgsVectorFileWriter.ogrDriverList(QgsVectorFileWriter.SortRecommended)
742748
self.assertEqual(drivers[0].longName, 'GeoPackage')
743749
self.assertEqual(drivers[0].driverName, 'GPKG')
744750
self.assertEqual(drivers[1].longName, 'ESRI Shapefile')
745751
self.assertEqual(drivers[1].driverName, 'ESRI Shapefile')
752+
self.assertTrue('ODS' in [f.driverName for f in drivers])
746753
# alphabetical sorting
747754
drivers2 = QgsVectorFileWriter.ogrDriverList(QgsVectorFileWriter.VectorFormatOptions())
748755
self.assertTrue(drivers2[0].longName < drivers2[1].longName)
749756
self.assertCountEqual([d.driverName for d in drivers], [d.driverName for d in drivers2])
750757
self.assertNotEqual(drivers2[0].driverName, 'GPKG')
751758

759+
# skip non-spatial
760+
formats = QgsVectorFileWriter.ogrDriverList(QgsVectorFileWriter.SkipNonSpatialFormats)
761+
self.assertFalse('ODS' in [f.driverName for f in formats])
762+
752763
def testSupportedFormatExtensions(self):
753764
formats = QgsVectorFileWriter.supportedFormatExtensions()
754765
self.assertTrue('gpkg' in formats)
755766
self.assertFalse('exe' in formats)
756767
self.assertEqual(formats[0], 'gpkg')
757768
self.assertEqual(formats[1], 'shp')
769+
self.assertTrue('ods' in formats)
758770

759771
# alphabetical sorting
760772
formats2 = QgsVectorFileWriter.supportedFormatExtensions(QgsVectorFileWriter.VectorFormatOptions())
761773
self.assertTrue(formats2[0] < formats2[1])
762774
self.assertCountEqual(formats, formats2)
763775
self.assertNotEqual(formats2[0], 'gpkg')
764776

777+
formats = QgsVectorFileWriter.supportedFormatExtensions(QgsVectorFileWriter.SkipNonSpatialFormats)
778+
self.assertFalse('ods' in formats)
779+
765780
def testFileFilterString(self):
766781
formats = QgsVectorFileWriter.fileFilterString()
767782
self.assertTrue('gpkg' in formats)
768783
self.assertTrue('shp' in formats)
769784
self.assertTrue(formats.index('gpkg') < formats.index('shp'))
785+
self.assertTrue('ods' in formats)
770786

771787
# alphabetical sorting
772788
formats2 = QgsVectorFileWriter.fileFilterString(QgsVectorFileWriter.VectorFormatOptions())
773789
self.assertNotEqual(formats.index('gpkg'), formats2.index('gpkg'))
774790

791+
# hide non spatial
792+
formats = QgsVectorFileWriter.fileFilterString(QgsVectorFileWriter.SkipNonSpatialFormats)
793+
self.assertFalse('ods' in formats)
794+
775795
def testDriverForExtension(self):
776796
self.assertEqual(QgsVectorFileWriter.driverForExtension('shp'), 'ESRI Shapefile')
777797
self.assertEqual(QgsVectorFileWriter.driverForExtension('SHP'), 'ESRI Shapefile')

0 commit comments

Comments
 (0)