2009-08-14 14:47:49 +00:00
|
|
|
"""@package OsmPlugin
|
2009-07-30 11:08:18 +00:00
|
|
|
This is the main module of the OSM Plugin.
|
|
|
|
|
|
|
|
It shows/hides all tool buttons, widgets and dialogs.
|
|
|
|
|
|
|
|
After closing dialogs it does all actions related with their return codes.
|
|
|
|
|
|
|
|
/***************************************************************************
|
|
|
|
* *
|
|
|
|
* 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 *
|
|
|
|
from PyQt4.QtNetwork import *
|
|
|
|
from qgis.core import *
|
|
|
|
|
2009-08-14 14:47:49 +00:00
|
|
|
from OsmLoadDlg import OsmLoadDlg
|
|
|
|
from OsmSaveDlg import OsmSaveDlg
|
|
|
|
from OsmDownloadDlg import OsmDownloadDlg
|
|
|
|
from OsmUploadDlg import OsmUploadDlg
|
|
|
|
from OsmImportDlg import OsmImportDlg
|
|
|
|
from OsmFeatureDW import *
|
|
|
|
from OsmUndoRedoDW import *
|
2009-07-30 11:08:18 +00:00
|
|
|
|
|
|
|
# initialize Qt resources from file resouces.py
|
|
|
|
import resources
|
|
|
|
|
|
|
|
|
|
|
|
|
2009-08-14 14:47:49 +00:00
|
|
|
class OsmPlugin:
|
|
|
|
"""OsmPlugin is the main class OSM Plugin module.
|
2009-07-30 11:08:18 +00:00
|
|
|
|
|
|
|
It shows/hides all tool buttons, widgets and dialogs and after closing dialogs
|
|
|
|
it does all actions related with their return codes.
|
|
|
|
"""
|
|
|
|
|
|
|
|
def __init__(self, iface):
|
|
|
|
"""The constructor.
|
|
|
|
|
|
|
|
@param iface QgisInterface object
|
|
|
|
"""
|
|
|
|
|
|
|
|
self.iface=iface
|
|
|
|
self.canvas=self.iface.mapCanvas()
|
|
|
|
self.http=QHttp()
|
|
|
|
self.outFile=None
|
|
|
|
self.httpGetId=0
|
|
|
|
self.httpRequestAborted=False
|
|
|
|
self.fname=""
|
|
|
|
|
|
|
|
|
|
|
|
def initGui(self):
|
|
|
|
"""Function initalizes GUI of the OSM Plugin.
|
|
|
|
"""
|
|
|
|
|
|
|
|
self.dockWidgetVisible = False
|
|
|
|
|
|
|
|
# create action for loading OSM file
|
|
|
|
self.actionLoad=QAction(QIcon(":/plugins/osm_plugin/images/osm_load.png")
|
|
|
|
,"Load OSM from file", self.iface.mainWindow())
|
|
|
|
self.actionLoad.setWhatsThis("Load OpenStreetMap from file")
|
|
|
|
# create action for import of a layer into OSM
|
|
|
|
self.actionImport=QAction(QIcon(":/plugins/osm_plugin/images/osm_import.png")
|
|
|
|
,"Import data from a layer", self.iface.mainWindow())
|
|
|
|
self.actionImport.setWhatsThis("Import data from a layer to OpenStreetMap")
|
|
|
|
# create action for saving OSM file
|
|
|
|
self.actionSave=QAction(QIcon(":/plugins/osm_plugin/images/osm_save.png")
|
|
|
|
,"Save OSM to file", self.iface.mainWindow())
|
|
|
|
self.actionSave.setWhatsThis("Save OpenStreetMap to file")
|
|
|
|
# create action for OSM data downloading
|
|
|
|
self.actionDownload=QAction(QIcon(":/plugins/osm_plugin/images/osm_download.png")
|
|
|
|
,"Download OSM data", self.iface.mainWindow())
|
|
|
|
self.actionDownload.setWhatsThis("Download OpenStreetMap data")
|
|
|
|
# create action for OSM data downloading
|
|
|
|
self.actionUpload=QAction(QIcon(":/plugins/osm_plugin/images/osm_upload.png")
|
|
|
|
,"Upload OSM data", self.iface.mainWindow())
|
|
|
|
self.actionUpload.setWhatsThis("Upload OpenStreetMap data")
|
|
|
|
# create action for OSM dockable window
|
|
|
|
self.actionDockWidget=QAction(QIcon(":/plugins/osm_plugin/images/osm_featureManager.png")
|
|
|
|
,"Show/Hide OSM Feature Manager",self.iface.mainWindow())
|
|
|
|
self.actionDockWidget.setWhatsThis("Show/Hide OpenStreetMap Feature Manager")
|
|
|
|
self.actionDockWidget.setCheckable(True)
|
|
|
|
|
|
|
|
# connect new action to plugin function - when action is triggered
|
|
|
|
QObject.connect(self.actionLoad, SIGNAL("triggered()"), self.loadOsmFromFile)
|
|
|
|
QObject.connect(self.actionSave, SIGNAL("triggered()"), self.saveOsmToFile)
|
|
|
|
QObject.connect(self.actionDownload, SIGNAL("triggered()"), self.downloadOsmData)
|
|
|
|
QObject.connect(self.actionUpload, SIGNAL("triggered()"), self.uploadOsmData)
|
|
|
|
QObject.connect(self.actionDockWidget, SIGNAL("triggered()"), self.showHideDockWidget)
|
|
|
|
QObject.connect(self.actionImport, SIGNAL("triggered()"), self.importData)
|
|
|
|
|
|
|
|
# create a toolbar
|
|
|
|
self.toolBar=self.iface.addToolBar("OpenStreetMap")
|
|
|
|
self.toolBar.setObjectName("OpenStreetMap")
|
|
|
|
self.toolBar.addAction(self.actionLoad)
|
|
|
|
self.toolBar.addAction(self.actionDockWidget)
|
|
|
|
self.toolBar.addAction(self.actionDownload)
|
|
|
|
self.toolBar.addAction(self.actionUpload)
|
|
|
|
self.toolBar.addAction(self.actionImport)
|
|
|
|
self.toolBar.addAction(self.actionSave)
|
|
|
|
|
|
|
|
# populate plugins menu
|
|
|
|
self.iface.addPluginToMenu("&OpenStreetMap", self.actionLoad)
|
|
|
|
self.iface.addPluginToMenu("&OpenStreetMap", self.actionDockWidget)
|
|
|
|
self.iface.addPluginToMenu("&OpenStreetMap", self.actionDownload)
|
|
|
|
self.iface.addPluginToMenu("&OpenStreetMap", self.actionUpload)
|
|
|
|
self.iface.addPluginToMenu("&OpenStreetMap", self.actionImport)
|
|
|
|
self.iface.addPluginToMenu("&OpenStreetMap", self.actionSave)
|
|
|
|
|
|
|
|
# create manager of sqlite database(-s)
|
2009-08-14 14:47:49 +00:00
|
|
|
self.dbm=OsmDatabaseManager(self)
|
2009-07-30 11:08:18 +00:00
|
|
|
|
|
|
|
self.undoredo=None
|
|
|
|
self.dockWidget=None
|
|
|
|
|
|
|
|
# create widget for undo/redo actions
|
2009-08-14 14:47:49 +00:00
|
|
|
self.undoredo=OsmUndoRedoDW(self)
|
2009-07-30 11:08:18 +00:00
|
|
|
self.iface.addDockWidget(Qt.LeftDockWidgetArea,self.undoredo)
|
|
|
|
self.undoredo.hide()
|
|
|
|
QObject.connect(self.undoredo,SIGNAL("visibilityChanged(bool)"),self.__urVisibilityChanged)
|
|
|
|
self.undoredo.setContentEnabled(False)
|
|
|
|
|
|
|
|
# create widget for osm feature info
|
2009-08-14 14:47:49 +00:00
|
|
|
self.dockWidget=OsmFeatureDW(self)
|
2009-07-30 11:08:18 +00:00
|
|
|
self.iface.addDockWidget(Qt.RightDockWidgetArea, self.dockWidget)
|
|
|
|
QObject.connect(self.dockWidget,SIGNAL("visibilityChanged(bool)"),self.__ofVisibilityChanged)
|
|
|
|
self.dockWidget.setContentEnabled(False)
|
|
|
|
|
|
|
|
|
|
|
|
def unload(self):
|
|
|
|
"""Function unloads the OSM Plugin.
|
|
|
|
"""
|
|
|
|
|
2009-08-14 14:47:49 +00:00
|
|
|
self.canvas.unsetMapTool(self.dockWidget.mapTool)
|
|
|
|
del self.dockWidget.mapTool
|
|
|
|
self.dockWidget.mapTool=None
|
|
|
|
|
2009-07-30 11:08:18 +00:00
|
|
|
# remove the plugin menu items
|
|
|
|
self.iface.removePluginMenu("&OpenStreetMap",self.actionLoad)
|
|
|
|
self.iface.removePluginMenu("&OpenStreetMap",self.actionSave)
|
|
|
|
self.iface.removePluginMenu("&OpenStreetMap",self.actionDownload)
|
|
|
|
self.iface.removePluginMenu("&OpenStreetMap",self.actionUpload)
|
|
|
|
self.iface.removePluginMenu("&OpenStreetMap",self.actionImport)
|
|
|
|
self.iface.removePluginMenu("&OpenStreetMap",self.actionDockWidget)
|
|
|
|
|
|
|
|
self.dockWidget.close()
|
|
|
|
if self.dockWidget.rubBand:
|
|
|
|
self.dockWidget.rubBand.reset(False)
|
|
|
|
if self.dockWidget.rubBandPol:
|
|
|
|
self.dockWidget.rubBandPol.reset(True)
|
|
|
|
|
|
|
|
self.undoredo.clear()
|
|
|
|
self.undoredo.close()
|
|
|
|
|
2009-08-14 14:47:49 +00:00
|
|
|
self.iface.removeDockWidget(self.dockWidget)
|
|
|
|
self.iface.removeDockWidget(self.undoredo)
|
|
|
|
|
2009-07-30 11:08:18 +00:00
|
|
|
del self.dockWidget
|
|
|
|
del self.undoredo
|
|
|
|
|
|
|
|
# remove toolbar
|
|
|
|
del self.toolBar
|
|
|
|
|
|
|
|
|
|
|
|
def loadOsmFromFile(self):
|
|
|
|
"""Function shows up the "Load OSM from file" dialog.
|
|
|
|
|
|
|
|
After closing it, function calls the appropriate actions
|
|
|
|
according to dialog's return code.
|
|
|
|
"""
|
|
|
|
|
|
|
|
# sanity check whether we're able to load osm data
|
|
|
|
if 'osm' not in QgsProviderRegistry.instance().providerList():
|
|
|
|
QMessageBox.critical(None, "Sorry", "You don't have OSM provider installed!")
|
|
|
|
return
|
|
|
|
|
|
|
|
# show modal dialog with OSM file selection
|
2009-08-14 14:47:49 +00:00
|
|
|
self.dlgLoad=OsmLoadDlg(self)
|
2009-07-30 11:08:18 +00:00
|
|
|
|
|
|
|
# continue only if OK button was clicked
|
|
|
|
if self.dlgLoad.exec_()==0:
|
|
|
|
return
|
|
|
|
|
|
|
|
self.fname=self.dlgLoad.OSMFileEdit.text()
|
|
|
|
self.dbFileName=self.fname+".db"
|
|
|
|
self.dbm.addDatabase(self.dbFileName,self.dlgLoad.pointLayer,self.dlgLoad.lineLayer,self.dlgLoad.polygonLayer)
|
|
|
|
self.undoredo.clear()
|
|
|
|
|
|
|
|
self.dockWidget.setContentEnabled(True)
|
|
|
|
self.undoredo.setContentEnabled(True)
|
|
|
|
|
|
|
|
self.dataLoaded=True
|
|
|
|
|
|
|
|
|
|
|
|
def saveOsmToFile(self):
|
|
|
|
"""Function shows up the "Save OSM to file" dialog.
|
|
|
|
|
|
|
|
After closing it, function calls the appropriate actions
|
|
|
|
according to dialog's return code.
|
|
|
|
"""
|
|
|
|
|
|
|
|
if not self.dbm.currentKey:
|
|
|
|
QMessageBox.information(QWidget(), QString("OSM Save to file")
|
|
|
|
,"No OSM data are loaded/downloaded or no OSM layer is selected in Layers panel. \
|
|
|
|
Please change this situation first, because OSM Plugin doesn't know what to save.")
|
|
|
|
return
|
|
|
|
|
|
|
|
# show modal dialog with OSM file selection
|
2009-08-14 14:47:49 +00:00
|
|
|
self.dlgSave=OsmSaveDlg(self)
|
2009-07-30 11:08:18 +00:00
|
|
|
|
|
|
|
# continue only if OK button was clicked
|
|
|
|
if self.dlgSave.exec_()==0:
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
|
|
def downloadOsmData(self):
|
|
|
|
"""Function shows up the "Download OSM data" dialog.
|
|
|
|
|
|
|
|
After closing it, function calls the appropriate actions
|
|
|
|
according to dialog's return code.
|
|
|
|
"""
|
|
|
|
|
2009-08-14 14:47:49 +00:00
|
|
|
self.dlgDownload=OsmDownloadDlg(self)
|
2009-07-30 11:08:18 +00:00
|
|
|
self.dlgDownload.exec_()
|
|
|
|
if not self.dlgDownload.httpSuccess:
|
|
|
|
return
|
|
|
|
|
|
|
|
if not self.dlgDownload.autoLoadCheckBox.isChecked():
|
|
|
|
return
|
|
|
|
|
|
|
|
# create loading dialog, submit it
|
2009-08-14 14:47:49 +00:00
|
|
|
self.dlgLoad=OsmLoadDlg(self)
|
2009-07-30 11:08:18 +00:00
|
|
|
self.dlgLoad.setModal(True)
|
|
|
|
self.dlgLoad.show()
|
|
|
|
self.dlgLoad.close()
|
|
|
|
self.dlgLoad.OSMFileEdit.setText(self.dlgDownload.destdirLineEdit.text())
|
|
|
|
self.dlgLoad.styleCombo.setCurrentIndex(self.dlgDownload.styleCombo.currentIndex())
|
|
|
|
|
|
|
|
if self.dlgDownload.chkCustomRenderer.isChecked():
|
|
|
|
self.dlgLoad.chkCustomRenderer.setChecked(True)
|
|
|
|
else:
|
|
|
|
self.dlgLoad.chkCustomRenderer.setChecked(False)
|
|
|
|
|
|
|
|
for row in xrange(self.dlgLoad.lstTags.count()):
|
|
|
|
self.dlgLoad.lstTags.item(row).setCheckState(Qt.Checked)
|
|
|
|
|
|
|
|
if self.dlgDownload.chkReplaceData.isChecked():
|
|
|
|
self.dlgLoad.chkReplaceData.setChecked(True)
|
|
|
|
else:
|
|
|
|
self.dlgLoad.chkReplaceData.setChecked(False)
|
|
|
|
|
|
|
|
self.dlgLoad.onOK()
|
|
|
|
|
|
|
|
self.fname=self.dlgLoad.OSMFileEdit.text()
|
|
|
|
self.dbFileName=self.fname+".db"
|
|
|
|
self.dbm.addDatabase(self.dbFileName,self.dlgLoad.pointLayer,self.dlgLoad.lineLayer,self.dlgLoad.polygonLayer)
|
|
|
|
|
|
|
|
|
|
|
|
def uploadOsmData(self):
|
|
|
|
"""Function shows up the "Upload OSM data" dialog.
|
|
|
|
|
|
|
|
After closing it, function calls the appropriate actions
|
|
|
|
according to dialog's return code.
|
|
|
|
"""
|
|
|
|
|
|
|
|
# first check if there are some data; if not upload doesn't have sense
|
|
|
|
if not self.dbm.currentKey:
|
|
|
|
QMessageBox.information(QWidget(), QString("OSM Upload")
|
|
|
|
,"No OSM data are loaded/downloaded or no OSM layer is selected in Layers panel. \
|
|
|
|
Please change this situation first, because OSM Plugin doesn't know what to upload.")
|
|
|
|
return
|
|
|
|
|
2009-08-14 14:47:49 +00:00
|
|
|
self.dlgUpload=OsmUploadDlg(self)
|
2009-07-30 11:08:18 +00:00
|
|
|
self.dlgUpload.exec_()
|
|
|
|
|
|
|
|
|
|
|
|
def importData(self):
|
|
|
|
"""Function shows up the "Import OSM data" dialog.
|
|
|
|
|
|
|
|
After closing it, function calls the appropriate actions
|
|
|
|
according to dialog's return code.
|
|
|
|
"""
|
|
|
|
|
|
|
|
if self.dbm.currentKey is None:
|
|
|
|
QMessageBox.information(self.iface.mainWindow(), "OSM Import"
|
|
|
|
,"No OSM data are loaded/downloaded or no OSM layer is selected in Layers panel. \
|
|
|
|
Please change this situation first, because OSM Plugin doesn't know what layer will be destination of the import.")
|
|
|
|
return
|
|
|
|
|
2009-08-14 14:47:49 +00:00
|
|
|
dlg=OsmImportDlg(self)
|
2009-07-30 11:08:18 +00:00
|
|
|
if dlg.cboLayer.count()==0:
|
|
|
|
QMessageBox.information(self.iface.mainWindow(), "OSM Import", "There are currently no available vector layers.")
|
|
|
|
return
|
|
|
|
|
|
|
|
dlg.exec_()
|
|
|
|
|
|
|
|
|
|
|
|
def showHideDockWidget(self):
|
|
|
|
"""Function shows/hides main dockable widget of the plugin ("OSM Feature" widget)
|
|
|
|
"""
|
|
|
|
|
|
|
|
if self.dockWidget.isVisible():
|
|
|
|
self.dockWidget.hide()
|
|
|
|
else:
|
|
|
|
self.dockWidget.show()
|
|
|
|
|
|
|
|
|
|
|
|
def __urVisibilityChanged(self):
|
|
|
|
"""Function is called after visibilityChanged(...) signal is emitted on OSM Edit History widget.
|
|
|
|
|
|
|
|
Function changes state of related checkbox according to the fact
|
|
|
|
if widget is currently visible of not.
|
|
|
|
"""
|
|
|
|
|
|
|
|
if self.undoredo.isVisible():
|
|
|
|
self.dockWidget.urDetailsButton.setChecked(True)
|
|
|
|
else:
|
|
|
|
self.dockWidget.urDetailsButton.setChecked(False)
|
|
|
|
|
|
|
|
|
|
|
|
def __ofVisibilityChanged(self):
|
|
|
|
"""Function is called after visibilityChanged(...) signal is emitted on OSM Feature widget.
|
|
|
|
|
|
|
|
Function changes state of appropriate tool button according to the fact
|
|
|
|
if widget is currently visible of not.
|
|
|
|
"""
|
|
|
|
|
|
|
|
if self.dockWidget.isVisible():
|
|
|
|
self.actionDockWidget.setChecked(True)
|
|
|
|
else:
|
|
|
|
self.actionDockWidget.setChecked(False)
|
|
|
|
|
|
|
|
|