def testOgrDriverList(self): # test with drivers in recommended order drivers = QgsVectorFileWriter.ogrDriverList( QgsVectorFileWriter.SortRecommended) self.assertEqual(drivers[0].longName, 'GeoPackage') 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]) # ensure that XLSX comes before SQLite, because we should sort on longName, not driverName! ms_xlsx_index = next(i for i, v in enumerate(drivers) if v.driverName == 'XLSX') sqlite_index = next(i for i, v in enumerate(drivers) if v.driverName == 'SQLite') self.assertLess(ms_xlsx_index, sqlite_index) self.assertIn('[XLSX]', drivers[ms_xlsx_index].longName) # 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 testOgrDriverList(self): # test with drivers in recommended order drivers = QgsVectorFileWriter.ogrDriverList(QgsVectorFileWriter.SortRecommended) self.assertEqual(drivers[0].longName, 'GeoPackage') 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]) # ensure that XLSX comes before SQLite, because we should sort on longName, not driverName! ms_xlsx_index = next(i for i, v in enumerate(drivers) if v.driverName == 'XLSX') sqlite_index = next(i for i, v in enumerate(drivers) if v.driverName == 'SQLite') self.assertLess(ms_xlsx_index, sqlite_index) self.assertIn('[XLSX]', drivers[ms_xlsx_index].longName) # 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 __init__(self, parent=None): super(DirectoryWriterWidget, self).__init__(parent) self.setupUi(self) drivers = QgsVectorFileWriter.ogrDriverList() self.cmbVectorFormat.blockSignals(True) for driver in drivers: self.cmbVectorFormat.addItem(driver.longName, driver.driverName) self.cmbVectorFormat.blockSignals(False) topPriority = [] lowPriority = [] gdal.AllRegister() driverCount = gdal.GetDriverCount() for i in range(driverCount): driver = gdal.GetDriver(i) metadata = driver.GetMetadata() if ('DCAP_CREATE' in metadata and metadata['DCAP_CREATE'] == 'YES') and ('DCAP_RASTER' in metadata and metadata['DCAP_RASTER'] == 'YES'): shortName = driver.ShortName longName = driver.LongName if shortName in ('MEM', 'VRT'): continue elif shortName == 'GTiff': topPriority.insert(1, (longName, shortName)) elif shortName == 'GPKG': topPriority.insert(2, (longName, shortName)) else: lowPriority.append((longName, shortName)) topPriority.extend(sorted(lowPriority)) self.cmbRasterFormat.blockSignals(True) for driver in topPriority: self.cmbRasterFormat.addItem(driver[0], driver[1]) self.cmbRasterFormat.blockSignals(False)
def defaultVectorFileExtension(self, hasGeometry=True): # By default,'gpkg', but if OGR has not been compiled with sqlite3, then # we take "SHP" if 'GPKG' in [o.driverName for o in QgsVectorFileWriter.ogrDriverList()]: return 'gpkg' else: return 'shp' if hasGeometry else 'dbf'
def testOgrDriverList(self): # test with drivers in recommended order drivers = QgsVectorFileWriter.ogrDriverList(QgsVectorFileWriter.SortRecommended) self.assertEqual(drivers[0].longName, 'GeoPackage') 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 on_file_browse(self): settings = QSettings() # look for directory path = QgsProject.instance().homePath() if path == '': path = settings.value("mask/file_dir", '') if path == '': path = QDir.homePath() drivers = QgsVectorFileWriter.ogrDriverList() filterList = [] filterMap = {} for ln, n in drivers.items(): # grrr, driverMetadata is not really consistent if n == "ESRI Shapefile": ext = "shp" glob = "*.shp" else: md = QgsVectorFileWriter.MetaData() if QgsVectorFileWriter.driverMetadata(n, md): ext = md.ext glob = md.glob else: continue fn = "%s (%s)" % (ln, glob) filterMap[fn] = (n, ext, glob) filterList += [fn] fileFilters = ';;'.join(filterList) fd = QFileDialog(None, self.tr("Select a filename to save the mask layer to"), path, fileFilters) save_format_name = self.parameters.file_format self.save_format = None for k, v in filterMap.items(): if v[0] == save_format_name: self.save_format = v fd.selectNameFilter(k) break def on_filter_selected(ff): self.save_format = filterMap[ff] fd.filterSelected.connect(on_filter_selected) fd.setAcceptMode(QFileDialog.AcceptSave) r = fd.exec_() if r == 1: fn = fd.selectedFiles()[0] driver, ext, glob = self.save_format if not fn.endswith("." + ext): fn += "." + ext self.ui.filePath.setText(fn) self.ui.formatLbl.setText(self.save_format[0]) self.parameters.file_format = self.save_format[0] self.parameters.file_path = fn
def populateFileFilters(self): # populate the combo with supported vector file formats for name, filt in QgsVectorFileWriter.ogrDriverList().items(): self.cboFileFormat.addItem(name, filt) # set the last used filter settings = QSettings() filt = settings.value(self.lastUsedVectorFilterSettingsKey, "ESRI Shapefile") idx = self.cboFileFormat.findText(filt) if idx < 0: idx = 0 self.cboFileFormat.setCurrentIndex(idx)
def populateFileFilters(self): # populate the combo with supported vector file formats for driver in QgsVectorFileWriter.ogrDriverList(): self.cboFileFormat.addItem(driver.longName, driver.driverName) # set the last used filter settings = QgsSettings() filt = settings.value(self.lastUsedVectorFilterSettingsKey, "GPKG") idx = self.cboFileFormat.findText(filt) if idx < 0: idx = 0 self.cboFileFormat.setCurrentIndex(idx)
def populateFileFilters(self): # populate the combo with supported vector file formats for name, filt in list(QgsVectorFileWriter.ogrDriverList().items()): self.cboFileFormat.addItem(name, filt) # set the last used filter settings = QgsSettings() filt = settings.value(self.lastUsedVectorFilterSettingsKey, "ESRI Shapefile") idx = self.cboFileFormat.findText(filt) if idx < 0: idx = 0 self.cboFileFormat.setCurrentIndex(idx)
def createEmptyVectorLayer(path, formatDriver, fields=None, srcCrs=QgsCoordinateReferenceSystem( 4326, QgsCoordinateReferenceSystem.EpsgCrsId), shape=QgsWkbTypes.Polygon, encoding="UTF-8"): """ Create empty vector layer. """ validDriver = False drivers = QgsVectorFileWriter.ogrDriverList() for driver in drivers: validDriver = driver.longName == formatDriver if not formatDriver: print("Not applicable formatDriver" + str(drivers)) return False writer = QgsVectorFileWriter(path, encoding, fields, shape, srcCrs, formatDriver) if writer.hasError() != QgsVectorFileWriter.NoError: print("Error when creating shapefile: ", writer.hasError()) del writer return False return writer
def on_file_browse(self): settings = QSettings() # look for directory path = QgsProject.instance().homePath() if path == "": path = settings.value("mask/file_dir", "") if path == "": path = QDir.homePath() drivers = QgsVectorFileWriter.ogrDriverList() filterList = [] filterMap = {} for driver in drivers: # grrr, driverMetadata is not really consistent if driver.driverName == "ESRI Shapefile": ext = "shp" glob = "*.shp" else: md = QgsVectorFileWriter.MetaData() if QgsVectorFileWriter.driverMetadata(driver.driverName, md): ext = md.ext glob = md.glob else: continue fn = "%s (%s)" % (driver.longName, glob) filterMap[fn] = (driver.driverName, ext, glob) filterList += [fn] fileFilters = ";;".join(filterList) fd = QFileDialog( None, self.tr("Select a filename to save the mask layer to"), path, fileFilters, ) save_format_name = self.parameters.file_format self.save_format = None for k, v in filterMap.items(): if v[0] == save_format_name: self.save_format = v fd.selectNameFilter(k) break def on_filter_selected(ff): self.save_format = filterMap[ff] fd.filterSelected.connect(on_filter_selected) fd.setAcceptMode(QFileDialog.AcceptSave) r = fd.exec_() if r == 1: fn = fd.selectedFiles()[0] driver, ext, glob = self.save_format if not fn.endswith("." + ext): fn += "." + ext self.ui.filePath.setText(fn) self.ui.formatLbl.setText(self.save_format[0]) self.parameters.file_format = self.save_format[0] self.parameters.file_path = fn