Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
dbmanager: allow to import layer from canvas (fix #6824),
add dialog to choose vector file to be imported (fix #6825), allow to export table to vector file (fix #6826) Thanks to Silvio Grosso for the sponsorship!
- Loading branch information
1 parent
fcf108d
commit de3ea74
Showing
6 changed files
with
990 additions
and
139 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,173 @@ | ||
# -*- coding: utf-8 -*- | ||
|
||
""" | ||
/*************************************************************************** | ||
Name : DB Manager | ||
Description : Database manager plugin for QuantumGIS | ||
Date : Oct 13, 2011 | ||
copyright : (C) 2011 by Giuseppe Sucameli | ||
email : brush.tyler@gmail.com | ||
The content of this file is based on | ||
- PG_Manager by Martin Dobias (GPLv2 license) | ||
***************************************************************************/ | ||
/*************************************************************************** | ||
* * | ||
* This program is free software; you can redistribute it and/or modify * | ||
* it under the terms of the GNU General Public License as published by * | ||
* the Free Software Foundation; either version 2 of the License, or * | ||
* (at your option) any later version. * | ||
* * | ||
***************************************************************************/ | ||
""" | ||
|
||
from PyQt4.QtCore import * | ||
from PyQt4.QtGui import * | ||
|
||
import qgis.core | ||
from qgis.utils import iface | ||
|
||
from .ui.ui_DlgExportVector import Ui_DlgExportVector | ||
|
||
class DlgExportVector(QDialog, Ui_DlgExportVector): | ||
|
||
def __init__(self, inLayer, inDb, parent=None): | ||
QDialog.__init__(self, parent) | ||
self.inLayer = inLayer | ||
self.db = inDb | ||
self.setupUi(self) | ||
|
||
# update UI | ||
self.setupWorkingMode() | ||
self.populateEncodings() | ||
|
||
def setupWorkingMode(self): | ||
# set default values | ||
inCrs = self.inLayer.crs() | ||
srid = inCrs.postgisSrid() if inCrs.isValid() else 4236 | ||
self.editSourceSrid.setText( "%s" % srid ) | ||
self.editTargetSrid.setText( "%s" % srid ) | ||
|
||
QObject.connect( self.btnChooseOutputFile, SIGNAL("clicked()"), self.chooseOutputFile ) | ||
self.checkSupports() | ||
|
||
def checkSupports(self): | ||
""" update options available for the current input layer """ | ||
allowSpatial = self.db.connector.hasSpatialSupport() | ||
hasGeomType = self.inLayer and self.inLayer.hasGeometryType() | ||
self.chkSourceSrid.setEnabled(allowSpatial and hasGeomType) | ||
self.chkTargetSrid.setEnabled(allowSpatial and hasGeomType) | ||
self.chkSpatialIndex.setEnabled(allowSpatial and hasGeomType) | ||
|
||
|
||
def chooseOutputFile(self): | ||
# get last used dir and format | ||
settings = QSettings() | ||
lastDir = settings.value("/db_manager/lastUsedDir", "").toString() | ||
# ask for a filename | ||
filename = QFileDialog.getSaveFileName(self, "Choose where to save the file", lastDir, "Shapefiles (*.shp)") | ||
if filename == "": | ||
return | ||
if filename[:-4] != ".shp": | ||
filename += ".shp" | ||
# store the last used dir and format | ||
settings.setValue("/db_manager/lastUsedDir", QFileInfo(filename).filePath()) | ||
|
||
self.editOutputFile.setText( filename ) | ||
|
||
def populateEncodings(self): | ||
# populate the combo with supported encodings | ||
self.cboEncoding.addItems(qgis.core.QgsVectorDataProvider.availableEncodings()) | ||
|
||
# set the last used encoding | ||
settings = QSettings() | ||
enc = self.inLayer.dataProvider().encoding() | ||
idx = self.cboEncoding.findText( enc ) | ||
if idx < 0: | ||
self.cboEncoding.insertItem( 0, enc ) | ||
idx = 0 | ||
self.cboEncoding.setCurrentIndex( idx ) | ||
|
||
def accept(self): | ||
# sanity checks | ||
if self.editOutputFile.text() == "": | ||
QMessageBox.information(self, "Export to file", "Output table name is required") | ||
return | ||
|
||
if self.chkSourceSrid.isEnabled() and self.chkSourceSrid.isChecked(): | ||
sourceSrid, ok = self.editSourceSrid.text().toInt() | ||
if not ok: | ||
QMessageBox.information(self, "Export to file", "Invalid source srid: must be an integer") | ||
return | ||
|
||
if self.chkTargetSrid.isEnabled() and self.chkTargetSrid.isChecked(): | ||
targetSrid, ok = self.editTargetSrid.text().toInt() | ||
if not ok: | ||
QMessageBox.information(self, "Export to file", "Invalid target srid: must be an integer") | ||
return | ||
|
||
# override cursor | ||
QApplication.setOverrideCursor(QCursor(Qt.WaitCursor)) | ||
# store current input layer crs, so I can restore it later | ||
prevInCrs = self.inLayer.crs() | ||
try: | ||
uri = self.editOutputFile.text() | ||
providerName = "ogr" | ||
driverName = "ESRI Shapefile" | ||
|
||
options = {} | ||
|
||
# set the OGR driver will be used | ||
options['driverName'] = driverName | ||
# set the output file encoding | ||
if self.chkEncoding.isEnabled() and self.chkEncoding.isChecked(): | ||
enc = self.cboEncoding.currentText() | ||
options['fileEncoding'] = enc | ||
|
||
if self.radCreate.isChecked() and self.chkDropTable.isChecked(): | ||
options['overwrite'] = True | ||
elif self.radAppend.isChecked(): | ||
options['append'] = True | ||
|
||
outCrs = None | ||
if self.chkTargetSrid.isEnabled() and self.chkTargetSrid.isChecked(): | ||
targetSrid = self.editTargetSrid.text().toInt()[0] | ||
outCrs = qgis.core.QgsCoordinateReferenceSystem(targetSrid) | ||
|
||
# update input layer crs | ||
if self.chkSourceSrid.isEnabled() and self.chkSourceSrid.isChecked(): | ||
sourceSrid = self.editSourceSrid.text().toInt()[0] | ||
inCrs = qgis.core.QgsCoordinateReferenceSystem(sourceSrid) | ||
self.inLayer.setCrs( inCrs ) | ||
|
||
# do the export! | ||
ret, errMsg = qgis.core.QgsVectorLayerImport.importLayer( self.inLayer, uri, providerName, outCrs, False, False, options ) | ||
except Exception as e: | ||
ret = -1 | ||
errMsg = unicode( e ) | ||
|
||
finally: | ||
# restore input layer crs and encoding | ||
self.inLayer.setCrs( prevInCrs ) | ||
# restore cursor | ||
QApplication.restoreOverrideCursor() | ||
|
||
if ret != 0: | ||
QMessageBox.warning(self, "Export to file", u"Error %d\n%s" % (ret, errMsg) ) | ||
return | ||
|
||
# create spatial index | ||
if self.chkSpatialIndex.isEnabled() and self.chkSpatialIndex.isChecked(): | ||
self.db.connector.createSpatialIndex( (schema, table), geom ) | ||
|
||
QMessageBox.information(self, "Export to file", "Export finished.") | ||
return QDialog.accept(self) | ||
|
||
|
||
if __name__ == '__main__': | ||
import sys | ||
a = QApplication(sys.argv) | ||
dlg = DlgLoadData() | ||
dlg.show() | ||
sys.exit(a.exec_()) |
Oops, something went wrong.