OSM plugin & provider update from Lukas Berka:
- new OSM style files !! map looks pretty good now... (finally) - new icons ! - some texts on dialogs were changed and completed - "Saving OSM into file" functionality was improved a little... - now OSM Plugin verify if osm provider is available... - fixed some problems with encoding... ascii --> utf-8 - removing all OSM layers automatically after disabling OSM plugin in plugin manager - some dialogs has been renamed - other small bugfixes ... Thanks. git-svn-id: http://svn.osgeo.org/qgis/trunk@11603 c8812cc2-4d05-0410-92ff-de0c093fc19c
@ -18,6 +18,7 @@ from qgis.core import *
|
||||
from qgis.gui import *
|
||||
|
||||
import sqlite3
|
||||
import unicodedata
|
||||
|
||||
|
||||
|
||||
@ -47,9 +48,9 @@ class OsmAddRelationDlg(QDialog, Ui_OsmAddRelationDlg):
|
||||
|
||||
# set icons for tool buttons (identify,move,createPoint,createLine,createPolygon)
|
||||
self.chooseMemberButton.setIcon(QIcon(":/plugins/osm_plugin/images/osm_identify.png"))
|
||||
self.removeMemberButton.setIcon(QIcon(":/plugins/osm_plugin/images/osm_remove.png"))
|
||||
self.removeTagButton.setIcon(QIcon(":/plugins/osm_plugin/images/osm_remove.png"))
|
||||
self.loadStandardTagsButton.setIcon(QIcon(":/plugins/osm_plugin/images/osm_star.png"))
|
||||
self.removeMemberButton.setIcon(QIcon(":/plugins/osm_plugin/images/osm_removeMember.png"))
|
||||
self.removeTagButton.setIcon(QIcon(":/plugins/osm_plugin/images/osm_removeTag.png"))
|
||||
self.loadStandardTagsButton.setIcon(QIcon(":/plugins/osm_plugin/images/osm_generateTags.png"))
|
||||
self.typeInfoButton.setIcon(QIcon(":/plugins/osm_plugin/images/osm_questionMark.png"))
|
||||
|
||||
self.info = dict()
|
||||
@ -101,6 +102,7 @@ class OsmAddRelationDlg(QDialog, Ui_OsmAddRelationDlg):
|
||||
self.relTagsTable.setSelectionMode(QAbstractItemView.ExtendedSelection)
|
||||
self.relMembersTable.setSelectionBehavior(QAbstractItemView.SelectRows)
|
||||
self.relTagsTable.setSelectionBehavior(QAbstractItemView.SelectRows)
|
||||
self.typeInfoButton.setEnabled(False)
|
||||
|
||||
|
||||
def connectDlgSignals(self):
|
||||
@ -283,6 +285,11 @@ class OsmAddRelationDlg(QDialog, Ui_OsmAddRelationDlg):
|
||||
|
||||
# adding new tag to table
|
||||
if column==0:
|
||||
|
||||
# only ascii keys are allowed
|
||||
nkfd_form=unicodedata.normalize('NFKD', unicode(key.toUtf8(),'utf-8'))
|
||||
key_only_ascii=nkfd_form.encode('ASCII', 'ignore')
|
||||
|
||||
newLastRow = row+1
|
||||
self.relTagsTable.setRowCount(row+2)
|
||||
self.relTagsTable.setItem(newLastRow,0,QTableWidgetItem(self.newTagLabel))
|
||||
@ -292,6 +299,7 @@ class OsmAddRelationDlg(QDialog, Ui_OsmAddRelationDlg):
|
||||
|
||||
self.relTagsTable.item(row,0).setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)
|
||||
self.relTagsTable.item(row,1).setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled | Qt.ItemIsEditable)
|
||||
self.relTagsTable.item(row,0).setText(QString(key_only_ascii))
|
||||
|
||||
|
||||
def __onMembersCellChanged(self,row,column):
|
||||
@ -426,8 +434,10 @@ class OsmAddRelationDlg(QDialog, Ui_OsmAddRelationDlg):
|
||||
# if non-standard typename was set up, loadStandardTagsButton is useless
|
||||
if typeName.toAscii().data() in self.relationTypes:
|
||||
self.loadStandardTagsButton.setEnabled(True)
|
||||
self.typeInfoButton.setEnabled(True)
|
||||
else:
|
||||
self.loadStandardTagsButton.setEnabled(False)
|
||||
self.typeInfoButton.setEnabled(False)
|
||||
|
||||
|
||||
def determineSuitableMemberRoles(self,relType):
|
||||
|
@ -40,7 +40,6 @@ class OsmDatabaseManager:
|
||||
|
||||
Initializes inner structures of OsmDatabaseManager and connect signals to appropriate slots.
|
||||
"""
|
||||
|
||||
self.plugin=plugin
|
||||
self.canvas=plugin.canvas
|
||||
|
||||
@ -50,6 +49,7 @@ class OsmDatabaseManager:
|
||||
self.polygonLayers={}
|
||||
self.currentKey=None
|
||||
self.removing=False
|
||||
self.mapReg=QgsMapLayerRegistry.instance()
|
||||
|
||||
QObject.connect(self.plugin.iface,SIGNAL("currentLayerChanged(QgsMapLayer*)"),self.currLayerChanged)
|
||||
QObject.connect(QgsMapLayerRegistry.instance(),SIGNAL("layerWillBeRemoved(QString)"),self.layerRemoved)
|
||||
@ -72,14 +72,18 @@ class OsmDatabaseManager:
|
||||
# set new currentKey and tell all other plugin components
|
||||
if not layer:
|
||||
self.currentKey=None
|
||||
self.plugin.undoredo.databaseChanged(None)
|
||||
self.plugin.dockWidget.databaseChanged(None)
|
||||
if self.plugin.undoredo<>None:
|
||||
self.plugin.undoredo.databaseChanged(None)
|
||||
if self.plugin.dockWidget<>None:
|
||||
self.plugin.dockWidget.databaseChanged(None)
|
||||
return
|
||||
|
||||
if layer.type() != QgsMapLayer.VectorLayer or layer.dataProvider().name()<>"osm":
|
||||
self.currentKey=None
|
||||
self.plugin.undoredo.databaseChanged(None)
|
||||
self.plugin.dockWidget.databaseChanged(None)
|
||||
if self.plugin.undoredo<>None:
|
||||
self.plugin.undoredo.databaseChanged(None)
|
||||
if self.plugin.dockWidget<>None:
|
||||
self.plugin.dockWidget.databaseChanged(None)
|
||||
return
|
||||
|
||||
# find out filename of new current database
|
||||
@ -89,12 +93,18 @@ class OsmDatabaseManager:
|
||||
|
||||
if dbFileName not in self.dbConns.keys():
|
||||
self.currentKey=None
|
||||
if self.plugin.undoredo<>None:
|
||||
self.plugin.undoredo.databaseChanged(None)
|
||||
if self.plugin.dockWidget<>None:
|
||||
self.plugin.dockWidget.databaseChanged(None)
|
||||
return
|
||||
|
||||
if dbFileName.toLatin1().data()<>self.currentKey:
|
||||
self.currentKey=dbFileName.toLatin1().data()
|
||||
self.plugin.undoredo.databaseChanged(self.currentKey)
|
||||
self.plugin.dockWidget.databaseChanged(self.currentKey)
|
||||
if self.plugin.undoredo<>None:
|
||||
self.plugin.undoredo.databaseChanged(self.currentKey)
|
||||
if self.plugin.dockWidget<>None:
|
||||
self.plugin.dockWidget.databaseChanged(self.currentKey)
|
||||
|
||||
|
||||
def layerRemoved(self,layerID):
|
||||
@ -112,7 +122,7 @@ class OsmDatabaseManager:
|
||||
return
|
||||
|
||||
# get appropriate qgsvectorlayer object
|
||||
layer=QgsMapLayerRegistry.instance().mapLayer(layerID)
|
||||
layer=self.mapReg.mapLayer(layerID)
|
||||
|
||||
if not layer:
|
||||
return # strange situation
|
||||
@ -126,21 +136,49 @@ class OsmDatabaseManager:
|
||||
dbFileName=layerSource.left(pos)+".db"
|
||||
key=dbFileName.toLatin1().data()
|
||||
|
||||
# remove all map layers that belong to dbFileName database
|
||||
self.removing=True
|
||||
if layer.getLayerID()<>self.pointLayers[key].getLayerID():
|
||||
QgsMapLayerRegistry.instance().removeMapLayer(self.pointLayers[key].getLayerID(),True)
|
||||
if layer.getLayerID()<>self.lineLayers[key].getLayerID():
|
||||
QgsMapLayerRegistry.instance().removeMapLayer(self.lineLayers[key].getLayerID(),True)
|
||||
if layer.getLayerID()<>self.polygonLayers[key].getLayerID():
|
||||
QgsMapLayerRegistry.instance().removeMapLayer(self.polygonLayers[key].getLayerID(),True)
|
||||
self.removing=False
|
||||
# remove map layers that belong to dbFileName database
|
||||
if key in self.lineLayers.keys() and layer.getLayerID()==self.lineLayers[key].getLayerID():
|
||||
del self.lineLayers[key]
|
||||
|
||||
# removed map items of key <dbFileName>
|
||||
del self.dbConns[key]
|
||||
del self.pointLayers[key]
|
||||
del self.lineLayers[key]
|
||||
del self.polygonLayers[key]
|
||||
elif key in self.pointLayers.keys() and layer.getLayerID()==self.pointLayers[key].getLayerID():
|
||||
del self.pointLayers[key]
|
||||
if key in self.lineLayers.keys():
|
||||
if self.lineLayers[key]:
|
||||
lineLayID=self.lineLayers[key].getLayerID()
|
||||
self.mapReg.removeMapLayer(lineLayID,True)
|
||||
|
||||
elif key in self.polygonLayers.keys() and layer.getLayerID()==self.polygonLayers[key].getLayerID():
|
||||
del self.polygonLayers[key]
|
||||
if key in self.pointLayers.keys():
|
||||
if self.pointLayers[key]:
|
||||
pointLayID=self.pointLayers[key].getLayerID()
|
||||
self.mapReg.removeMapLayer(pointLayID,True)
|
||||
|
||||
if key in self.dbConns.keys():
|
||||
del self.dbConns[key]
|
||||
|
||||
|
||||
def removeAllOsmLayers(self):
|
||||
|
||||
# remove all map layers with osm provider set
|
||||
self.removing=True
|
||||
allLayers=QgsMapLayerRegistry.instance().mapLayers()
|
||||
|
||||
for ix in allLayers.keys():
|
||||
|
||||
layer=allLayers[ix] # layer object
|
||||
if not layer:
|
||||
continue
|
||||
|
||||
if layer.type()==QgsMapLayer.VectorLayer and layer.dataProvider().name()=="osm":
|
||||
QgsMapLayerRegistry.instance().removeMapLayer(layer.getLayerID(),True)
|
||||
|
||||
self.dbConns={} # map dbFileName->sqlite3ConnectionObject
|
||||
self.pointLayers={}
|
||||
self.lineLayers={}
|
||||
self.polygonLayers={}
|
||||
self.currentKey=None
|
||||
self.removing=False
|
||||
|
||||
|
||||
def addDatabase(self,dbFileName,pointLayer,lineLayer,polygonLayer):
|
||||
@ -1661,7 +1699,7 @@ class OsmDatabaseManager:
|
||||
,{"objId":str(featId),"objType":str(osmType)})
|
||||
|
||||
for tagRec in c:
|
||||
tags.append((tagRec[0],tagRec[1]))
|
||||
tags.append((tagRec[0],tagRec[1].encode('utf-8')))
|
||||
|
||||
c.close()
|
||||
return tags
|
||||
@ -1709,7 +1747,7 @@ class OsmDatabaseManager:
|
||||
c=self.getConnection().cursor()
|
||||
|
||||
c.execute("update tag set val=:tagVal where object_id=:objId and object_type=:objType and key=:tagKey and u=1"
|
||||
,{"tagVal":tagValue,"objId":str(featId),"objType":osmType,"tagKey":tagKey})
|
||||
,{"tagVal":unicode(tagValue,'utf-8'),"objId":str(featId),"objType":osmType,"tagKey":tagKey})
|
||||
|
||||
for rec in c:
|
||||
val=rec[0]
|
||||
@ -1889,7 +1927,7 @@ class OsmDatabaseManager:
|
||||
osmType=self.convertToOsmType(featType)
|
||||
c=self.getConnection().cursor()
|
||||
c.execute("update tag set val=:val where object_id=:objId and object_type=:objType and key=:key and u=1"
|
||||
,{"val":value,"objId":str(featId),"objType":osmType,"key":key})
|
||||
,{"val":unicode(value,'utf-8'),"objId":str(featId),"objType":osmType,"key":str(key)})
|
||||
c.close()
|
||||
self.commit()
|
||||
|
||||
@ -1902,6 +1940,11 @@ class OsmDatabaseManager:
|
||||
@return True if given tag already exists for given feature; False otherwise
|
||||
"""
|
||||
|
||||
if key==None:
|
||||
return False
|
||||
if len(key)==0:
|
||||
return False
|
||||
|
||||
tagEx=False
|
||||
osmType=self.convertToOsmType(featType)
|
||||
c=self.getConnection().cursor()
|
||||
@ -1990,10 +2033,14 @@ class OsmDatabaseManager:
|
||||
@param doCommit if True then commit is performed after tag insertion
|
||||
"""
|
||||
|
||||
val=''
|
||||
if value<>None:
|
||||
val=unicode(value,'utf-8')
|
||||
|
||||
osmType=self.convertToOsmType(featType)
|
||||
c=self.getConnection().cursor()
|
||||
c.execute("insert into tag (object_id, object_type, key, val) values (:objId, :objType, :key, :val)"
|
||||
,{"objId":str(featId),"objType":osmType,"key":key,"val":value})
|
||||
,{"objId":str(featId),"objType":osmType,"key":str(key),"val":val})
|
||||
c.close()
|
||||
if doCommit:
|
||||
self.commit()
|
||||
@ -2029,7 +2076,7 @@ class OsmDatabaseManager:
|
||||
osmType=self.convertToOsmType(featType)
|
||||
c=self.getConnection().cursor()
|
||||
c.execute("delete from tag where object_id=:objId and object_type=:objType and key=:key and u=1"
|
||||
,{"objId":str(featId),"objType":osmType,"key":key})
|
||||
,{"objId":str(featId),"objType":osmType,"key":str(key)})
|
||||
c.close()
|
||||
self.commit()
|
||||
|
||||
|
@ -1,3 +1,4 @@
|
||||
# -*- coding: utf-8 -*-99
|
||||
"""@package OsmFeatureDW
|
||||
This module is descendant of "OSM Feature" dockable widget and makes user able
|
||||
to view and edit information on selected OSM feature.
|
||||
@ -24,6 +25,7 @@ from map_tools.OsmCreateLineMT import OsmCreateLineMT
|
||||
from map_tools.OsmCreatePolygonMT import OsmCreatePolygonMT
|
||||
from map_tools.OsmMoveMT import OsmMoveMT
|
||||
from map_tools.OsmIdentifyMT import OsmIdentifyMT
|
||||
import unicodedata
|
||||
|
||||
|
||||
class OsmFeatureDW(QDockWidget, Ui_OsmFeatureDW, object):
|
||||
@ -54,8 +56,8 @@ class OsmFeatureDW(QDockWidget, Ui_OsmFeatureDW, object):
|
||||
self.createLineButton.setIcon(QIcon(":/plugins/osm_plugin/images/osm_createLine.png"))
|
||||
self.createPolygonButton.setIcon(QIcon(":/plugins/osm_plugin/images/osm_createPolygon.png"))
|
||||
self.createRelationButton.setIcon(QIcon(":/plugins/osm_plugin/images/osm_createRelation.png"))
|
||||
self.removeButton.setIcon(QIcon(":/plugins/osm_plugin/images/osm_remove.png"))
|
||||
self.deleteTagsButton.setIcon(QIcon(":/plugins/osm_plugin/images/osm_remove.png"))
|
||||
self.removeButton.setIcon(QIcon(":/plugins/osm_plugin/images/osm_removeFeat.png"))
|
||||
self.deleteTagsButton.setIcon(QIcon(":/plugins/osm_plugin/images/osm_removeTag.png"))
|
||||
self.undoButton.setIcon(QIcon(":/plugins/osm_plugin/images/osm_undo.png"))
|
||||
self.redoButton.setIcon(QIcon(":/plugins/osm_plugin/images/osm_redo.png"))
|
||||
self.addRelationButton.setIcon(QIcon(":/plugins/osm_plugin/images/osm_addRelation.png"))
|
||||
@ -432,7 +434,7 @@ class OsmFeatureDW(QDockWidget, Ui_OsmFeatureDW, object):
|
||||
|
||||
# store tag's change into database
|
||||
self.plugin.undoredo.startAction("Change tag value.")
|
||||
self.plugin.dbm.changeTagValue(self.feature.id(),self.featureType,key.toUtf8().data(),value.toUtf8().data())
|
||||
self.plugin.dbm.changeTagValue(self.feature.id(),self.featureType,key.toAscii().data(),value.toUtf8())
|
||||
else:
|
||||
key = self.tagTable.item(row,0).text()
|
||||
if key=="" or key==self.newTagLabel:
|
||||
@ -441,23 +443,28 @@ class OsmFeatureDW(QDockWidget, Ui_OsmFeatureDW, object):
|
||||
# adding new tag and setting its key
|
||||
if column==0:
|
||||
|
||||
# only ascii keys are allowed
|
||||
nkfd_form=unicodedata.normalize('NFKD', unicode(key.toUtf8(),'utf-8'))
|
||||
key_only_ascii=nkfd_form.encode('ASCII', 'ignore')
|
||||
|
||||
# store it into database
|
||||
isAlreadyDef=self.plugin.dbm.isTagDefined(self.feature.id(),self.featureType,key.toUtf8().data())
|
||||
isAlreadyDef=self.plugin.dbm.isTagDefined(self.feature.id(),self.featureType,key_only_ascii)
|
||||
if isAlreadyDef:
|
||||
# such a key already exists for this relation
|
||||
self.tagTable.setItem(row,0,QTableWidgetItem(self.newTagLabel))
|
||||
QMessageBox.information(self, self.tr("OSM Feature Dock Widget")
|
||||
,self.tr("Property '%1' cannot be added twice.").arg(key.toUtf8().data()))
|
||||
,self.tr(QString("Property '").append(key_only_ascii).append("' cannot be added twice.")))
|
||||
return
|
||||
|
||||
# well, insert new tag into database
|
||||
self.plugin.undoredo.startAction("Insert new tag.")
|
||||
self.plugin.dbm.insertTag(self.feature.id(),self.featureType,key.toUtf8().data(),'')
|
||||
self.plugin.dbm.insertTag(self.feature.id(),self.featureType,key_only_ascii,None)
|
||||
|
||||
self.__tagsLoaded=False
|
||||
|
||||
self.tagTable.item(row,0).setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)
|
||||
self.tagTable.item(row,1).setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled | Qt.ItemIsEditable)
|
||||
self.tagTable.item(row,0).setText(QString(key_only_ascii))
|
||||
|
||||
newLastRow = row+1
|
||||
self.tagTable.setRowCount(row+2)
|
||||
@ -488,7 +495,8 @@ class OsmFeatureDW(QDockWidget, Ui_OsmFeatureDW, object):
|
||||
self.plugin.dbm.recacheAffectedNow(affected)
|
||||
|
||||
# refresh map canvas so that changes take effect
|
||||
self.plugin.canvas.refresh()
|
||||
if column==1:
|
||||
self.plugin.canvas.refresh()
|
||||
|
||||
|
||||
def __onTagsItemDoubleClicked(self,item):
|
||||
@ -1236,7 +1244,7 @@ class OsmFeatureDW(QDockWidget, Ui_OsmFeatureDW, object):
|
||||
self.plugin.dbm.changeRelationStatus(self.feature.id(),'N','U')
|
||||
|
||||
# perform tag removing
|
||||
self.plugin.dbm.removeTag(self.feature.id(),self.featureType,key.toUtf8().data())
|
||||
self.plugin.dbm.removeTag(self.feature.id(),self.featureType,key.toAscii().data())
|
||||
|
||||
self.tagTable.removeRow(ix)
|
||||
|
||||
@ -1425,8 +1433,8 @@ class OsmFeatureDW(QDockWidget, Ui_OsmFeatureDW, object):
|
||||
self.tagTable.setHorizontalHeaderItem(1,QTableWidgetItem("Value"))
|
||||
|
||||
for i in range(0,rowCount):
|
||||
self.tagTable.setItem(i,0,QTableWidgetItem(tableData[i][0]))
|
||||
self.tagTable.setItem(i,1,QTableWidgetItem(tableData[i][1]))
|
||||
self.tagTable.setItem(i,0,QTableWidgetItem(QString.fromUtf8(tableData[i][0])))
|
||||
self.tagTable.setItem(i,1,QTableWidgetItem(QString.fromUtf8(tableData[i][1])))
|
||||
self.tagTable.item(i,0).setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)
|
||||
self.tagTable.item(i,1).setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled | Qt.ItemIsEditable)
|
||||
|
||||
|
@ -214,11 +214,9 @@ class OsmLoadDlg(QDialog, Ui_OsmLoadDlg):
|
||||
|
||||
st=self.styles[self.styleCombo.currentIndex()]
|
||||
if st=="Small scale":
|
||||
rect=QgsRectangle(midX-rX/6,midY-rY/6,midX+rX/6,midY+rY/6)
|
||||
rect=QgsRectangle(midX-rX/5,midY-rY/5,midX+rX/5,midY+rY/5)
|
||||
elif st=="Medium scale":
|
||||
rect=QgsRectangle(midX-rX/3,midY-rY/3,midX+rX/3,midY+rY/3)
|
||||
else:
|
||||
rect=QgsRectangle(midX-rX/1.2,midY-rY/1.2,midX+rX/1.2,midY+rY/1.2)
|
||||
rect=QgsRectangle(midX-rX/2,midY-rY/2,midX+rX/2,midY+rY/2)
|
||||
|
||||
self.canvas.setExtent(rect)
|
||||
self.canvas.refresh()
|
||||
@ -310,6 +308,7 @@ class OsmLoadDlg(QDialog, Ui_OsmLoadDlg):
|
||||
self.progress = None
|
||||
QMessageBox.information(self,"Error",QString("Failed to load layers: %1")
|
||||
.arg(self.property("osm_failure").toString()))
|
||||
self.buttonBox.setEnabled(True)
|
||||
|
||||
qApp.processEvents()
|
||||
return QDialog.event(self,e)
|
||||
|
@ -34,6 +34,15 @@ import resources_rc
|
||||
|
||||
|
||||
|
||||
def versionNumber():
|
||||
"""Returns current version number of OpenStreetMap plugin.
|
||||
|
||||
@return current version number of the plugin
|
||||
"""
|
||||
return "0.5"
|
||||
|
||||
|
||||
|
||||
class OsmPlugin:
|
||||
"""OsmPlugin is the main class OSM Plugin module.
|
||||
|
||||
@ -164,10 +173,15 @@ class OsmPlugin:
|
||||
|
||||
del self.dockWidget
|
||||
del self.undoredo
|
||||
self.dockWidget=None
|
||||
self.undoredo=None
|
||||
|
||||
# remove toolbar
|
||||
del self.toolBar
|
||||
|
||||
# w/o osm plugin we don't need osm layers
|
||||
self.dbm.removeAllOsmLayers()
|
||||
|
||||
|
||||
def loadOsmFromFile(self):
|
||||
"""Function shows up the "Load OSM from file" dialog.
|
||||
@ -206,6 +220,10 @@ class OsmPlugin:
|
||||
according to dialog's return code.
|
||||
"""
|
||||
|
||||
if 'osm' not in QgsProviderRegistry.instance().providerList():
|
||||
QMessageBox.critical(None, "Sorry", "You don't have OSM provider installed!")
|
||||
return
|
||||
|
||||
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. \
|
||||
@ -227,6 +245,10 @@ Please change this situation first, because OSM Plugin doesn't know what to save
|
||||
according to dialog's return code.
|
||||
"""
|
||||
|
||||
if 'osm' not in QgsProviderRegistry.instance().providerList():
|
||||
QMessageBox.critical(None, "Sorry", "You don't have OSM provider installed!")
|
||||
return
|
||||
|
||||
self.dlgDownload=OsmDownloadDlg(self)
|
||||
self.dlgDownload.exec_()
|
||||
if not self.dlgDownload.httpSuccess:
|
||||
@ -270,6 +292,10 @@ Please change this situation first, because OSM Plugin doesn't know what to save
|
||||
according to dialog's return code.
|
||||
"""
|
||||
|
||||
if 'osm' not in QgsProviderRegistry.instance().providerList():
|
||||
QMessageBox.critical(None, "Sorry", "You don't have OSM provider installed!")
|
||||
return
|
||||
|
||||
# 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")
|
||||
@ -288,6 +314,10 @@ Please change this situation first, because OSM Plugin doesn't know what to uplo
|
||||
according to dialog's return code.
|
||||
"""
|
||||
|
||||
if 'osm' not in QgsProviderRegistry.instance().providerList():
|
||||
QMessageBox.critical(None, "Sorry", "You don't have OSM provider installed!")
|
||||
return
|
||||
|
||||
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. \
|
||||
|
@ -14,7 +14,6 @@ from PyQt4.QtXml import *
|
||||
from PyQt4 import *
|
||||
from sip import unwrapinstance
|
||||
from qgis.core import QgsVectorLayer, QgsMapLayerRegistry
|
||||
#from sip import *
|
||||
|
||||
import sqlite3
|
||||
|
||||
@ -44,6 +43,10 @@ class OsmSaveDlg(QDialog, Ui_OsmSaveDlg):
|
||||
self.progressDialog.setModal(True)
|
||||
self.progressDialog.setAutoClose(False)
|
||||
|
||||
# variables for identifiers of all objects that will be saved to output file
|
||||
self.nodeIds=set()
|
||||
|
||||
# connecting dialog and progressbar signals
|
||||
QObject.connect(self.browseOSMButton,SIGNAL("clicked()"),self.showSaveFileDialog)
|
||||
QObject.connect(self.buttonBox,SIGNAL("accepted()"),self.onOK)
|
||||
QObject.connect(self.progressDialog, SIGNAL("canceled()"), self.cancelSaving)
|
||||
@ -62,14 +65,9 @@ class OsmSaveDlg(QDialog, Ui_OsmSaveDlg):
|
||||
self.outFile.remove()
|
||||
self.outFile=None
|
||||
|
||||
# if self.xml.device().isOpen():
|
||||
# self.xml.device().close()
|
||||
|
||||
# close the whole Save OSM dialog
|
||||
self.close()
|
||||
|
||||
# todo: segfault... why????
|
||||
|
||||
|
||||
def showSaveFileDialog(self):
|
||||
"""Function opens dialog for selecting XML file.
|
||||
@ -98,7 +96,8 @@ class OsmSaveDlg(QDialog, Ui_OsmSaveDlg):
|
||||
It performs all actions neccessary for OSM data saving.
|
||||
"""
|
||||
|
||||
# after closing a dialog, we want to save data into osm
|
||||
# prepare data
|
||||
|
||||
self.fname=self.OSMFileEdit.text()
|
||||
self.outFile=QFile(self.fname)
|
||||
|
||||
@ -118,8 +117,7 @@ class OsmSaveDlg(QDialog, Ui_OsmSaveDlg):
|
||||
self.xml.setCodec(QTextCodec.codecForName("utf-8"))
|
||||
self.xml.setAutoFormatting(True)
|
||||
|
||||
self.dbConnection=sqlite3.connect(self.plugin.dbFileName.toLatin1().data())
|
||||
c=self.dbConnection.cursor()
|
||||
c=self.dbm.getConnection().cursor()
|
||||
|
||||
cntPoints=cntLines=cntPolys=cntRels=0
|
||||
c.execute("select count(*) from node")
|
||||
@ -146,8 +144,15 @@ class OsmSaveDlg(QDialog, Ui_OsmSaveDlg):
|
||||
self.progressDialog.setValue(0)
|
||||
self.progressDialog.show()
|
||||
|
||||
# todo: <bounds> element?
|
||||
# todo: and what about uid? changeset? are they compulsory?
|
||||
# <bounds> element
|
||||
dataExtent=self.plugin.canvas.extent()
|
||||
self.xml.writeEmptyElement("bounds")
|
||||
self.xml.writeAttribute("minlat",str(dataExtent.yMinimum()))
|
||||
self.xml.writeAttribute("minlon",str(dataExtent.xMinimum()))
|
||||
self.xml.writeAttribute("maxlat",str(dataExtent.yMaximum()))
|
||||
self.xml.writeAttribute("maxlon",str(dataExtent.xMaximum()))
|
||||
|
||||
# todo: uid and changeset attributes are not compulsory! support for them in future!
|
||||
|
||||
if points:
|
||||
self.progressDialog.setLabelText(self.tr("Saving nodes..."))
|
||||
@ -155,14 +160,20 @@ class OsmSaveDlg(QDialog, Ui_OsmSaveDlg):
|
||||
self.progressDialog.setValue(0)
|
||||
i=0
|
||||
|
||||
c.execute("select n.id,n.lat,n.lon,v.version_id,n.user,n.timestamp from \
|
||||
node n,version v where v.object_id=n.id and v.object_type='node'")
|
||||
for rec in c:
|
||||
c.execute("select n.id,n.lat,n.lon,v.version_id,n.user,n.timestamp from node n, version v \
|
||||
where n.status<>'R' and n.u=1 and v.object_id=n.id and v.object_type='node' \
|
||||
and n.lat>=:minLat AND n.lat<=:maxLat AND n.lon>=:minLon AND n.lon<=:maxLon"
|
||||
,{"minLat":dataExtent.yMinimum(),"maxLat":dataExtent.yMaximum()
|
||||
,"minLon":dataExtent.xMinimum(),"maxLon":dataExtent.xMaximum()})
|
||||
|
||||
for (nid,lat,lon,ver,usr,tms) in c:
|
||||
anyTags=False
|
||||
tagList=[]
|
||||
|
||||
self.nodeIds.add(nid)
|
||||
|
||||
if tags:
|
||||
tagList=self.dbm.getFeatureTags(rec[0],'Point')
|
||||
tagList=self.dbm.getFeatureTags(nid,'Point')
|
||||
if len(tagList)>0:
|
||||
anyTags=True
|
||||
|
||||
@ -171,22 +182,22 @@ class OsmSaveDlg(QDialog, Ui_OsmSaveDlg):
|
||||
else:
|
||||
self.xml.writeEmptyElement("node")
|
||||
|
||||
self.xml.writeAttribute("id",str(rec[0]))
|
||||
self.xml.writeAttribute("lat",str(rec[1]))
|
||||
self.xml.writeAttribute("lon",str(rec[2]))
|
||||
self.xml.writeAttribute("version",str(rec[3]))
|
||||
self.xml.writeAttribute("user",rec[4])
|
||||
self.xml.writeAttribute("id",str(nid))
|
||||
self.xml.writeAttribute("lat",str(lat))
|
||||
self.xml.writeAttribute("lon",str(lon))
|
||||
self.xml.writeAttribute("version",str(ver))
|
||||
if usr<>"":
|
||||
self.xml.writeAttribute("user",usr)
|
||||
self.xml.writeAttribute("visible","true")
|
||||
self.xml.writeAttribute("timestamp",rec[5])
|
||||
self.xml.writeAttribute("timestamp",tms)
|
||||
|
||||
if anyTags:
|
||||
for r in tagList:
|
||||
self.xml.writeEmptyElement("tag")
|
||||
self.xml.writeAttribute("k",r[0])
|
||||
self.xml.writeAttribute("v",r[1])
|
||||
|
||||
if anyTags:
|
||||
self.xml.writeEndElement()
|
||||
|
||||
i=i+1
|
||||
self.progressDialog.setValue(i)
|
||||
|
||||
@ -197,31 +208,90 @@ class OsmSaveDlg(QDialog, Ui_OsmSaveDlg):
|
||||
i=0
|
||||
|
||||
c.execute("select w.id,v.version_id,w.user,w.timestamp from way w,version v \
|
||||
where w.closed=0 and v.object_id=w.id and v.object_type='way'")
|
||||
for rec in c:
|
||||
self.xml.writeStartElement("way")
|
||||
self.xml.writeAttribute("id",str(rec[0]))
|
||||
self.xml.writeAttribute("visible","true")
|
||||
self.xml.writeAttribute("timestamp",rec[3])
|
||||
self.xml.writeAttribute("version",str(rec[1]))
|
||||
self.xml.writeAttribute("user",rec[2])
|
||||
where w.closed=0 and w.status<>'R' and w.u=1 and v.object_id=w.id and v.object_type='way' \
|
||||
and (((w.max_lat between :minLat and :maxLat) or (w.min_lat between :minLat and :maxLat) or (w.min_lat<:minLat and w.max_lat>:maxLat)) \
|
||||
and ((w.max_lon between :minLon and :maxLon) or (w.min_lon between :minLon and :maxLon) or (w.min_lon<:minLon and w.max_lon>:maxLon)))"
|
||||
,{"minLat":dataExtent.yMinimum(),"maxLat":dataExtent.yMaximum()
|
||||
,"minLon":dataExtent.xMinimum(),"maxLon":dataExtent.xMaximum()})
|
||||
|
||||
d=self.dbConnection.cursor()
|
||||
d.execute("select node_id from way_member where way_id=:wayId",{"wayId":rec[0]})
|
||||
for (lid,ver,usr,tms) in c:
|
||||
|
||||
geom=self.dbm.getFeatureGeometry(lid,'Line')
|
||||
if not geom.intersects(dataExtent):
|
||||
continue
|
||||
|
||||
self.xml.writeStartElement("way")
|
||||
self.xml.writeAttribute("id",str(lid))
|
||||
self.xml.writeAttribute("visible","true")
|
||||
self.xml.writeAttribute("timestamp",tms)
|
||||
self.xml.writeAttribute("version",str(ver))
|
||||
if usr<>"":
|
||||
self.xml.writeAttribute("user",usr)
|
||||
|
||||
d=self.dbm.getConnection().cursor()
|
||||
d.execute("select node_id from way_member where way_id=:wayId",{"wayId":lid})
|
||||
for r in d:
|
||||
self.xml.writeStartElement("nd")
|
||||
self.xml.writeEmptyElement("nd")
|
||||
self.xml.writeAttribute("ref",str(r[0]))
|
||||
self.xml.writeEndElement()
|
||||
d.close()
|
||||
|
||||
if tags:
|
||||
tagList=self.dbm.getFeatureTags(rec[0],'Line')
|
||||
tagList=self.dbm.getFeatureTags(lid,'Line')
|
||||
for r in tagList:
|
||||
self.xml.writeEmptyElement("tag")
|
||||
self.xml.writeAttribute("k",r[0])
|
||||
self.xml.writeAttribute("v",r[1])
|
||||
|
||||
self.xml.writeEndElement()
|
||||
|
||||
d=self.dbm.getConnection().cursor()
|
||||
d.execute("select node_id from way_member where way_id=:wayId",{"wayId":lid})
|
||||
for r in d:
|
||||
if r[0] not in self.nodeIds:
|
||||
|
||||
e=self.dbm.getConnection().cursor()
|
||||
e.execute("select n.id,n.lat,n.lon,v.version_id,n.user,n.timestamp from node n, version v \
|
||||
where n.id=:nid",{"nid":r[0]})
|
||||
for nodeRec in e:
|
||||
nid=nodeRec[0]
|
||||
lat=nodeRec[1]
|
||||
lon=nodeRec[2]
|
||||
ver=nodeRec[3]
|
||||
usr=nodeRec[4]
|
||||
tms=nodeRec[5]
|
||||
e.close()
|
||||
|
||||
anyTags=False
|
||||
tagList=[]
|
||||
self.nodeIds.add(nid)
|
||||
|
||||
if tags:
|
||||
tagList=self.dbm.getFeatureTags(nid,'Point')
|
||||
if len(tagList)>0:
|
||||
anyTags=True
|
||||
|
||||
if anyTags:
|
||||
self.xml.writeStartElement("node")
|
||||
else:
|
||||
self.xml.writeEmptyElement("node")
|
||||
|
||||
self.xml.writeAttribute("id",str(nid))
|
||||
self.xml.writeAttribute("lat",str(lat))
|
||||
self.xml.writeAttribute("lon",str(lon))
|
||||
self.xml.writeAttribute("version",str(ver))
|
||||
if usr<>"":
|
||||
self.xml.writeAttribute("user",usr)
|
||||
self.xml.writeAttribute("visible","true")
|
||||
self.xml.writeAttribute("timestamp",tms)
|
||||
|
||||
if anyTags:
|
||||
for r in tagList:
|
||||
self.xml.writeEmptyElement("tag")
|
||||
self.xml.writeAttribute("k",r[0])
|
||||
self.xml.writeAttribute("v",r[1])
|
||||
self.xml.writeEndElement()
|
||||
|
||||
d.close()
|
||||
i=i+1
|
||||
self.progressDialog.setValue(i)
|
||||
|
||||
@ -232,32 +302,95 @@ class OsmSaveDlg(QDialog, Ui_OsmSaveDlg):
|
||||
i=0
|
||||
|
||||
c.execute("select w.id,v.version_id,w.user,w.timestamp from way w,version v \
|
||||
where w.closed=1 and v.object_id=w.id and v.object_type='way'")
|
||||
for rec in c:
|
||||
where w.closed=1 and w.status<>'R' and w.u=1 and v.object_id=w.id and v.object_type='way' \
|
||||
and (((w.max_lat between :minLat and :maxLat) or (w.min_lat between :minLat and :maxLat) or (w.min_lat<:minLat and w.max_lat>:maxLat)) \
|
||||
and ((w.max_lon between :minLon and :maxLon) or (w.min_lon between :minLon and :maxLon) or (w.min_lon<:minLon and w.max_lon>:maxLon)))"
|
||||
,{"minLat":dataExtent.yMinimum(),"maxLat":dataExtent.yMaximum()
|
||||
,"minLon":dataExtent.xMinimum(),"maxLon":dataExtent.xMaximum()})
|
||||
|
||||
for (pid,ver,usr,tms) in c:
|
||||
|
||||
geom=self.dbm.getFeatureGeometry(pid,'Polygon')
|
||||
if not geom.intersects(dataExtent):
|
||||
continue
|
||||
|
||||
self.xml.writeStartElement("way")
|
||||
self.xml.writeAttribute("id",str(rec[0]))
|
||||
self.xml.writeAttribute("id",str(pid))
|
||||
self.xml.writeAttribute("visible","true")
|
||||
self.xml.writeAttribute("timestamp",rec[3])
|
||||
self.xml.writeAttribute("version",str(rec[1]))
|
||||
self.xml.writeAttribute("user",rec[2])
|
||||
self.xml.writeAttribute("timestamp",tms)
|
||||
self.xml.writeAttribute("version",str(ver))
|
||||
if usr<>"":
|
||||
self.xml.writeAttribute("user",usr)
|
||||
|
||||
d=self.dbConnection.cursor()
|
||||
d.execute("select node_id from way_member where way_id=:wayId",{"wayId":rec[0]})
|
||||
d=self.dbm.getConnection().cursor()
|
||||
d.execute("select node_id from way_member where way_id=:wayId",{"wayId":pid})
|
||||
first=None
|
||||
for r in d:
|
||||
self.xml.writeStartElement("nd")
|
||||
self.xml.writeEmptyElement("nd")
|
||||
self.xml.writeAttribute("ref",str(r[0]))
|
||||
self.xml.writeEndElement()
|
||||
|
||||
if first==None:
|
||||
first=r[0]
|
||||
d.close()
|
||||
self.xml.writeEmptyElement("nd")
|
||||
self.xml.writeAttribute("ref",str(first))
|
||||
|
||||
if tags:
|
||||
tagList=self.dbm.getFeatureTags(rec[0],'Polygon')
|
||||
tagList=self.dbm.getFeatureTags(pid,'Polygon')
|
||||
for r in tagList:
|
||||
self.xml.writeEmptyElement("tag")
|
||||
self.xml.writeAttribute("k",r[0])
|
||||
self.xml.writeAttribute("v",r[1])
|
||||
|
||||
self.xml.writeEndElement()
|
||||
|
||||
d=self.dbm.getConnection().cursor()
|
||||
d.execute("select node_id from way_member where way_id=:wayId",{"wayId":pid})
|
||||
for r in d:
|
||||
if r[0] not in self.nodeIds:
|
||||
|
||||
e=self.dbm.getConnection().cursor()
|
||||
e.execute("select n.id,n.lat,n.lon,v.version_id,n.user,n.timestamp from node n, version v \
|
||||
where n.id=:nid",{"nid":r[0]})
|
||||
for nodeRec in e:
|
||||
nid=nodeRec[0]
|
||||
lat=nodeRec[1]
|
||||
lon=nodeRec[2]
|
||||
ver=nodeRec[3]
|
||||
usr=nodeRec[4]
|
||||
tms=nodeRec[5]
|
||||
e.close()
|
||||
|
||||
anyTags=False
|
||||
tagList=[]
|
||||
self.nodeIds.add(nid)
|
||||
|
||||
if tags:
|
||||
tagList=self.dbm.getFeatureTags(nid,'Point')
|
||||
if len(tagList)>0:
|
||||
anyTags=True
|
||||
|
||||
if anyTags:
|
||||
self.xml.writeStartElement("node")
|
||||
else:
|
||||
self.xml.writeEmptyElement("node")
|
||||
|
||||
self.xml.writeAttribute("id",str(nid))
|
||||
self.xml.writeAttribute("lat",str(lat))
|
||||
self.xml.writeAttribute("lon",str(lon))
|
||||
self.xml.writeAttribute("version",str(ver))
|
||||
if usr<>"":
|
||||
self.xml.writeAttribute("user",usr)
|
||||
self.xml.writeAttribute("visible","true")
|
||||
self.xml.writeAttribute("timestamp",tms)
|
||||
|
||||
if anyTags:
|
||||
for r in tagList:
|
||||
self.xml.writeEmptyElement("tag")
|
||||
self.xml.writeAttribute("k",r[0])
|
||||
self.xml.writeAttribute("v",r[1])
|
||||
self.xml.writeEndElement()
|
||||
|
||||
d.close()
|
||||
i=i+1
|
||||
self.progressDialog.setValue(i)
|
||||
|
||||
@ -268,36 +401,52 @@ class OsmSaveDlg(QDialog, Ui_OsmSaveDlg):
|
||||
i=0
|
||||
|
||||
c.execute("select r.id,v.version_id,r.user,r.timestamp from relation r,version v \
|
||||
where v.object_id=r.id and v.object_type='relation'")
|
||||
for rec in c:
|
||||
self.xml.writeStartElement("relation")
|
||||
self.xml.writeAttribute("id",str(rec[0]))
|
||||
self.xml.writeAttribute("visible","true")
|
||||
self.xml.writeAttribute("timestamp",rec[3])
|
||||
self.xml.writeAttribute("version",str(rec[1]))
|
||||
self.xml.writeAttribute("user",rec[2])
|
||||
where r.status<>'R' and r.u=1 and v.object_id=r.id and v.object_type='relation' \
|
||||
and ( \
|
||||
exists ( \
|
||||
select 1 from node n, relation_member rm \
|
||||
where rm.relation_id=r.id and n.status<>'R' and n.u=1 and rm.member_id=n.id and rm.member_type='node' \
|
||||
and n.lat>=:minLat and n.lat<=:maxLat and n.lon>=:minLon and n.lon<=:maxLon ) \
|
||||
or exists ( \
|
||||
select 1 from way w, relation_member rm \
|
||||
where rm.relation_id=r.id and w.status<>'R' and w.u=1 and rm.member_id=w.id and rm.member_type='way' \
|
||||
and (((w.max_lat between :minLat and :maxLat) or (w.min_lat between :minLat and :maxLat) or (w.min_lat<:minLat and w.max_lat>:maxLat)) \
|
||||
and ((w.max_lon between :minLon and :maxLon) or (w.min_lon between :minLon and :maxLon) or (w.min_lon<:minLon and w.max_lon>:maxLon))) \
|
||||
))"
|
||||
,{"minLat":dataExtent.yMinimum(),"maxLat":dataExtent.yMaximum()
|
||||
,"minLon":dataExtent.xMinimum(),"maxLon":dataExtent.xMaximum()})
|
||||
|
||||
d=self.dbConnection.cursor()
|
||||
d.execute("select member_id,member_type,role from relation_member where relation_id=:relId",{"relId":rec[0]})
|
||||
for (rid,ver,usr,tms) in c:
|
||||
|
||||
self.xml.writeStartElement("relation")
|
||||
self.xml.writeAttribute("id",str(rid))
|
||||
self.xml.writeAttribute("visible","true")
|
||||
self.xml.writeAttribute("timestamp",tms)
|
||||
self.xml.writeAttribute("version",str(ver))
|
||||
if usr<>"":
|
||||
self.xml.writeAttribute("user",usr)
|
||||
|
||||
d=self.dbm.getConnection().cursor()
|
||||
d.execute("select member_id,member_type,role from relation_member where relation_id=:relId",{"relId":rid})
|
||||
for r in d:
|
||||
self.xml.writeStartElement("member")
|
||||
self.xml.writeEmptyElement("member")
|
||||
self.xml.writeAttribute("type",r[1])
|
||||
self.xml.writeAttribute("ref",str(r[0]))
|
||||
self.xml.writeAttribute("role",r[2])
|
||||
self.xml.writeEndElement()
|
||||
d.close()
|
||||
|
||||
if tags:
|
||||
tagList=self.dbm.getFeatureTags(rec[0],'Relation')
|
||||
tagList=self.dbm.getFeatureTags(rid,'Relation')
|
||||
for r in tagList:
|
||||
self.xml.writeEmptyElement("tag")
|
||||
self.xml.writeAttribute("k",r[0])
|
||||
self.xml.writeAttribute("v",r[1])
|
||||
|
||||
self.xml.writeEndElement()
|
||||
|
||||
i=i+1
|
||||
self.progressDialog.setValue(i)
|
||||
|
||||
|
||||
self.xml.writeEndElement() # osm
|
||||
self.xml.writeEndDocument()
|
||||
|
||||
|
@ -43,7 +43,7 @@ class OsmUndoRedoDW(QDockWidget, Ui_OsmUndoRedoDW, object):
|
||||
|
||||
self.undoButton.setIcon(QIcon(":/plugins/osm_plugin/images/osm_undo.png"))
|
||||
self.redoButton.setIcon(QIcon(":/plugins/osm_plugin/images/osm_redo.png"))
|
||||
self.clearButton.setIcon(QIcon(":/plugins/osm_plugin/images/osm_remove.png"))
|
||||
self.clearButton.setIcon(QIcon(":/plugins/osm_plugin/images/osm_clearUndoRedo.png"))
|
||||
|
||||
self.canvas=plugin.canvas
|
||||
self.iface=plugin.iface
|
||||
|
@ -16,6 +16,7 @@ Upload phases and their exact order:
|
||||
|
||||
|
||||
from ui_OsmUploadDlg import Ui_OsmUploadDlg
|
||||
import OsmPlugin
|
||||
|
||||
from PyQt4.QtCore import *
|
||||
from PyQt4.QtGui import *
|
||||
@ -24,7 +25,6 @@ from PyQt4 import *
|
||||
from sys import *
|
||||
|
||||
|
||||
|
||||
class OsmUploadDlg(QDialog, Ui_OsmUploadDlg):
|
||||
"""Class provides simple way of uploading current OSM data.
|
||||
|
||||
@ -917,7 +917,7 @@ class OsmUploadDlg(QDialog, Ui_OsmUploadDlg):
|
||||
userCommentBytes=userComment.toUtf8()
|
||||
|
||||
# create http request's body (create XML with info about uploaded way)
|
||||
requestXml=QString("<osm>\n<changeset>\n<tag k=\"created_by\" v=\"QGIS OSM v0.5\"/>\n<tag k=\"comment\" v=\""+userCommentBytes.data()+"\"/>\n</changeset>\n</osm>")
|
||||
requestXml=QString("<osm>\n<changeset>\n<tag k=\"created_by\" v=\"QGIS OSM v"+OsmPlugin.versionNumber()+"\"/>\n<tag k=\"comment\" v=\""+userCommentBytes.data()+"\"/>\n</changeset>\n</osm>")
|
||||
|
||||
# send prepared request
|
||||
requestBytes=requestXml.toAscii()
|
||||
|
@ -38,8 +38,8 @@ def version():
|
||||
|
||||
@return version of this plugin
|
||||
"""
|
||||
|
||||
return "Version 0.5"
|
||||
from OsmPlugin import versionNumber
|
||||
return "Version "+versionNumber()
|
||||
|
||||
|
||||
def qgisMinimumVersion():
|
||||
@ -58,7 +58,6 @@ def classFactory(iface):
|
||||
@return instance of OSM Plugin
|
||||
"""
|
||||
|
||||
# load TestPlugin class from file testplug.py
|
||||
from OsmPlugin import OsmPlugin
|
||||
# return object of our plugin with reference to QGIS interface as the only argument
|
||||
return OsmPlugin(iface)
|
||||
|
BIN
python/plugins/osm/images/osm_clearUndoRedo.png
Normal file
After Width: | Height: | Size: 634 B |
BIN
python/plugins/osm/images/osm_generateTags.png
Normal file
After Width: | Height: | Size: 731 B |
Before Width: | Height: | Size: 982 B After Width: | Height: | Size: 938 B |
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 859 B |
Before Width: | Height: | Size: 715 B After Width: | Height: | Size: 480 B |
BIN
python/plugins/osm/images/osm_removeFeat.png
Normal file
After Width: | Height: | Size: 839 B |
BIN
python/plugins/osm/images/osm_removeMember.png
Normal file
After Width: | Height: | Size: 815 B |
BIN
python/plugins/osm/images/osm_removeTag.png
Normal file
After Width: | Height: | Size: 646 B |
Before Width: | Height: | Size: 561 B After Width: | Height: | Size: 565 B |
@ -51,7 +51,16 @@
|
||||
<file>images/osm_remove.png</file>
|
||||
</qresource>
|
||||
<qresource prefix="/plugins/osm_plugin" >
|
||||
<file>images/osm_star.png</file>
|
||||
<file>images/osm_removeFeat.png</file>
|
||||
</qresource>
|
||||
<qresource prefix="/plugins/osm_plugin" >
|
||||
<file>images/osm_removeTag.png</file>
|
||||
</qresource>
|
||||
<qresource prefix="/plugins/osm_plugin" >
|
||||
<file>images/osm_removeMember.png</file>
|
||||
</qresource>
|
||||
<qresource prefix="/plugins/osm_plugin" >
|
||||
<file>images/osm_generateTags.png</file>
|
||||
</qresource>
|
||||
<qresource prefix="/plugins/osm_plugin" >
|
||||
<file>images/osm_questionMark.png</file>
|
||||
@ -62,4 +71,7 @@
|
||||
<qresource prefix="/plugins/osm_plugin" >
|
||||
<file>images/osm_redo.png</file>
|
||||
</qresource>
|
||||
<qresource prefix="/plugins/osm_plugin" >
|
||||
<file>images/osm_clearUndoRedo.png</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
|
@ -1,34 +1,62 @@
|
||||
#LINE
|
||||
highway trunk 3 1 150,0,0
|
||||
highway primary 2 1 219,112,147
|
||||
highway secondary 1 1 255,120,0
|
||||
highway tertiary 0 0 238,230,133
|
||||
highway pedestrian 0 0 255,255,0
|
||||
highway residential 0 0 100,100,100
|
||||
highway footway 0 0 170,170,170
|
||||
highway * 1 1 210,200,210
|
||||
railway subway 1 2 131,111,255
|
||||
railway rail 1 4 0,0,0
|
||||
railway * 1 0 0,0,0
|
||||
highway trunk 1.3 1 170,221,170
|
||||
highway trunk_link 1.3 1 170,221,170
|
||||
highway primary 1.2 1 219,112,147
|
||||
highway secondary 1.2 1 255,221,170
|
||||
highway tertiary 1 1 238,230,133
|
||||
highway pedestrian 0.02 1 230,214,182
|
||||
highway residential 0.02 1 100,100,100
|
||||
highway living_street 0.05 1 207,207,190
|
||||
highway cycleway 0.05 3 0,115,255
|
||||
highway construction 0.05 2 204,238,221
|
||||
tracktype grade2 0.05 3 0,115,255
|
||||
highway track 0.04 2 181,164,130
|
||||
highway unsurfaced 0.08 2 230,214,182
|
||||
railway subway 0.01 2 187,187,187
|
||||
railway rail 0.01 4 120,120,120
|
||||
railway tram 0.01 1 119,136,119
|
||||
railway preserved 0.05 2 187,187,187
|
||||
boundary administrative 1 3 85,26,139
|
||||
power line 1 0 139,139,131
|
||||
waterway drain 0.2 1 135,206,255
|
||||
power line 0.1 1 139,139,131
|
||||
#POLYGON
|
||||
leisure park 0 1 0,0,0 88,245,168
|
||||
leisure garden 0 1 0,0,0 88,245,168
|
||||
landuse forest 0 1 0,0,0 88,245,168
|
||||
landuse allotments 0 1 0,0,0 222,184,135
|
||||
tourism zoo 0 1 0,0,0 108,255,185
|
||||
building yes 0 1 0,0,0 226,226,226
|
||||
natural water 0 1 0,0,0 135,206,255
|
||||
waterway riverbank 0 1 0,0,0 135,206,255
|
||||
place island 0 1 0,0,0 255,255,255
|
||||
highway trunk 3 1 150,0,0 255,255,255
|
||||
highway primary 2 1 219,112,147 255,255,255
|
||||
highway secondary 1 1 255,120,0 255,255,255
|
||||
highway tertiary 0 0 238,230,133 255,255,255
|
||||
highway pedestrian 0 0 255,255,0 255,255,255
|
||||
highway residential 0 0 100,100,100 255,255,255
|
||||
highway footway 0 0 170,170,170 255,255,255
|
||||
* * 1 1 0,0,255 255,255,255
|
||||
leisure park 0 0 0,0,0 88,245,168
|
||||
leisure garden 0 0 0,0,0 88,245,168
|
||||
leisure pitch 0 0 0,0,0 136,204,170
|
||||
leisure track 0 0 0,0,0 119,221,187
|
||||
leisure playground 0 0 0,0,0 221,255,255
|
||||
leisure golf_course 0 0 0,0,0 187,221,187
|
||||
leisure stadium 0 0 0,0,0 102,204,170
|
||||
landuse forest 0 0 0,0,0 139,207,102
|
||||
landuse allotments 0 0 0,0,0 222,184,135
|
||||
landuse construction 0 0 0,0,0 153,153,102
|
||||
landuse cemetery 0 0 0,0,0 170,204,170
|
||||
landuse brownfield 0 0 0,0,0 153,153,102
|
||||
landuse village_green 0 0 0,0,0 204,238,170
|
||||
landuse industrial 0 0 0,0,0 221,221,238
|
||||
landuse recreation_ground 0 0 0,0,0 204,238,170
|
||||
tourism zoo 0 0 0,0,0 180,238,180
|
||||
natural water 0 0 0,0,0 135,206,255
|
||||
natural wood 0.1 1 40,40,40 170,204,153
|
||||
natural land 0 0 0,0,0 170,170,170
|
||||
waterway riverbank 0 0 0,0,0 135,206,255
|
||||
place island 0.2 1 0,0,0 255,255,255
|
||||
highway trunk 3 1 150,0,0 170,221,170
|
||||
highway primary 3 1 219,112,147 255,255,255
|
||||
highway secondary 1.5 1 255,120,0 255,255,255
|
||||
highway tertiary 2 1 238,230,133 255,255,255
|
||||
highway pedestrian 0.8 1 230,214,182 255,255,255
|
||||
highway residential 1 1 100,100,100 235,235,235
|
||||
highway service 1 1 100,100,100 235,235,235
|
||||
highway footway 1.4 3 255,160,140 255,255,255
|
||||
amenity place_of_worship 0 0 0,0,0 123,140,123
|
||||
amenity grave_yard 0 0 0,0,0 157,191,157
|
||||
amenity school 0 0 0,0,0 221,221,170
|
||||
power station 0 0 0,0,0 187,187,187
|
||||
area yes 0.2 1 100,100,100 235,235,235
|
||||
building yes 0 0 0,0,0 204,153,153
|
||||
amenity parking 0 0 0,0,0 255,255,153
|
||||
boundary administrative 0.8 3 85,26,139 255,255,255
|
||||
* * 0.01 1 40,40,40 255,255,255
|
||||
#POINT
|
||||
amenity hospital emergency/amenity=hospital.svg 6
|
||||
|
@ -1,45 +1,70 @@
|
||||
#LINE
|
||||
highway trunk 6 1 150,0,0
|
||||
highway primary 6 1 219,112,147
|
||||
highway secondary 4.5 1 255,120,0
|
||||
highway tertiary 3 1 238,230,133
|
||||
highway pedestrian 1 1 255,255,0
|
||||
highway residential 1 1 100,100,100
|
||||
highway footway 2 3 170,170,170
|
||||
highway * 1 1 0,255,0
|
||||
railway subway 1 2 131,111,255
|
||||
railway rail 2 4 0,0,0
|
||||
railway * 1 0 0,0,0
|
||||
boundary administrative 2 3 85,26,139
|
||||
power line 2 1 139,139,131
|
||||
highway trunk 2.7 1 170,221,170
|
||||
highway trunk_link 2.7 1 170,221,170
|
||||
highway primary 2.5 1 219,112,147
|
||||
highway secondary 2.3 1 255,221,170
|
||||
highway tertiary 2.0 1 238,230,133
|
||||
highway pedestrian 0.25 1 230,214,182
|
||||
highway residential 0.25 1 100,100,100
|
||||
highway unclassified 0.25 1 100,100,100
|
||||
highway service 0.25 1 100,100,100
|
||||
highway footway 0.15 3 255,160,140
|
||||
highway path 0.15 3 255,160,140
|
||||
highway steps 0.15 3 255,160,140
|
||||
highway living_street 0.8 1 207,207,190
|
||||
highway cycleway 0.8 3 0,115,255
|
||||
highway construction 0.5 2 204,238,221
|
||||
tracktype grade2 0.8 3 0,115,255
|
||||
highway track 1.4 2 181,164,130
|
||||
highway unsurfaced 0.8 2 230,214,182
|
||||
highway * 0.5 1 0,255,0
|
||||
railway subway 0.1 2 187,187,187
|
||||
railway rail 0.01 4 120,120,120
|
||||
railway tram 0.1 1 119,136,119
|
||||
railway preserved 0.05 2 187,187,187
|
||||
railway * 0.1 0 0,0,0
|
||||
boundary administrative 1 3 85,26,139
|
||||
waterway drain 0.5 1 135,206,255
|
||||
power line 1.4 1 139,139,131
|
||||
* * 1 1 200,200,200
|
||||
#POLYGON
|
||||
leisure park 0 1 0,0,0 88,245,168
|
||||
leisure garden 0 1 0,0,0 88,245,168
|
||||
landuse forest 0 1 0,0,0 88,245,168
|
||||
leisure park 0 0 0,0,0 88,245,168
|
||||
leisure garden 0 0 0,0,0 88,245,168
|
||||
leisure pitch 0 0 0,0,0 136,204,170
|
||||
leisure track 0.05 1 40,40,40 119,221,187
|
||||
leisure playground 0.05 1 40,40,40 221,255,255
|
||||
leisure golf_course 0 0 0,0,0 187,221,187
|
||||
leisure stadium 0 0 0,0,0 102,204,170
|
||||
landuse forest 0 0 0,0,0 139,207,102
|
||||
landuse allotments 0 1 0,0,0 222,184,135
|
||||
tourism zoo 0 1 0,0,0 108,255,
|
||||
building yes 0.01 1 0,0,0 226,226,226
|
||||
natural water 0 1 0,0,0 135,206,255
|
||||
waterway riverbank 0 1 0,0,0 135,206,255
|
||||
landuse construction 0 0 0,0,0 153,153,102
|
||||
landuse cemetery 0 0 0,0,0 170,204,170
|
||||
landuse brownfield 0 0 0,0,0 153,153,102
|
||||
landuse village_green 0 0 0,0,0 204,238,170
|
||||
landuse industrial 0 0 0,0,0 221,221,238
|
||||
landuse recreation_ground 0 0 0,0,0 204,238,170
|
||||
tourism zoo 0 0 0,0,0 180,238,180
|
||||
natural water 0 0 0,0,0 135,206,255
|
||||
natural wood 0.1 1 40,40,40 170,204,153
|
||||
natural land 0 0 0,0,0 170,170,170
|
||||
waterway riverbank 0 0 0,0,0 135,206,255
|
||||
place island 1 1 0,0,0 255,255,255
|
||||
highway trunk 6 1 150,0,0 255,255,255
|
||||
highway trunk 6 1 150,0,0 170,221,170
|
||||
highway primary 6 1 219,112,147 255,255,255
|
||||
highway secondary 4.5 1 255,120,0 255,255,255
|
||||
highway tertiary 3 1 238,230,133 255,255,255
|
||||
highway pedestrian 1 1 255,255,0 255,255,255
|
||||
highway residential 1 1 100,100,100 255,255,255
|
||||
highway footway 2 3 170,170,170 255,255,255
|
||||
* * 1 1 0,0,255 255,255,255
|
||||
highway pedestrian 0.8 1 230,214,182 255,255,255
|
||||
highway residential 1 1 100,100,100 235,235,235
|
||||
highway service 1 1 100,100,100 235,235,235
|
||||
highway footway 1.4 3 255,160,140 255,255,255
|
||||
amenity place_of_worship 0.02 1 0,0,0 123,140,123
|
||||
amenity grave_yard 0 0 0,0,0 157,191,157
|
||||
amenity school 0.05 1 160,160,110 221,221,170
|
||||
power station 0.05 1 170,170,170 187,187,187
|
||||
area yes 0.2 1 100,100,100 235,235,235
|
||||
building yes 0 0 0,0,0 204,153,153
|
||||
amenity parking 0 0 0,0,0 255,255,153
|
||||
boundary administrative 1 3 85,26,139 255,255,255
|
||||
* * 0.01 1 40,40,40 255,255,255
|
||||
#POINT
|
||||
source:addr uir_adr gpsicons/house.svg 15
|
||||
power tower symbol/Cross4.svg 15
|
||||
amenity hospital emergency/amenity=hospital.svg 15
|
||||
amenity parking transport/amenity=parking.svg 15
|
||||
amenity bus_station transport/highway=bus_stop.svg 15
|
||||
amenity restaurant entertainment/amenity=restaurant.svg 15
|
||||
amenity theatre entertainment/amenity=theatre.svg 15
|
||||
amenity pub entertainment/amenity=pub.svg 15
|
||||
amenity fast_food entertainment/amenity=fast_food.svg 15
|
||||
amenity cinema entertainment/amenity=cinema.svg 15
|
||||
amenity cafe entertainment/amenity=cafe.svg 15
|
||||
amenity bar entertainment/amenity=bar.svg 15
|
||||
amenity hospital emergency/amenity=hospital.svg 6
|
||||
|
@ -1,41 +1,74 @@
|
||||
#LINE
|
||||
highway trunk 4.3 1 150,0,0
|
||||
highway trunk 4.6 1 170,221,170
|
||||
highway trunk_link 4.6 1 170,221,170
|
||||
highway primary 4.3 1 219,112,147
|
||||
highway secondary 3.5 1 255,120,0
|
||||
highway tertiary 2.2 1 238,230,133
|
||||
highway pedestrian 0.8 1 255,255,0
|
||||
highway secondary 4 1 255,221,170
|
||||
highway tertiary 2.8 1 238,230,133
|
||||
highway pedestrian 0.8 1 230,214,182
|
||||
highway residential 0.8 1 100,100,100
|
||||
highway footway 1.4 3 170,170,170
|
||||
highway unclassified 0.8 1 100,100,100
|
||||
highway service 0.8 1 100,100,100
|
||||
highway footway 1.4 3 255,160,140
|
||||
highway path 1.4 3 255,160,140
|
||||
highway steps 1.4 3 255,160,140
|
||||
highway living_street 2.2 1 207,207,190
|
||||
highway cycleway 2 3 0,115,255
|
||||
highway construction 3 2 204,238,221
|
||||
tracktype grade2 2 3 0,115,255
|
||||
highway track 2 2 181,164,130
|
||||
highway unsurfaced 2 2 230,214,182
|
||||
highway * 1 1 0,255,0
|
||||
railway subway 0.7 2 131,111,255
|
||||
railway subway 1.5 2 187,187,187
|
||||
railway rail 1 4 0,0,0
|
||||
railway tram 1 4 175,0,0
|
||||
railway tram 1.5 1 119,136,119
|
||||
railway preserved 1.5 2 187,187,187
|
||||
railway * 0.7 0 0,0,0
|
||||
boundary administrative 2 3 85,26,139
|
||||
waterway drain 1 1 135,206,255
|
||||
power line 2 1 139,139,131
|
||||
* * 1 1 200,200,200
|
||||
#POLYGON
|
||||
leisure park 0 1 0,0,0 88,245,168
|
||||
leisure garden 0 1 0,0,0 88,245,168
|
||||
landuse forest 0 1 0,0,0 88,245,168
|
||||
leisure park 0 0 0,0,0 88,245,168
|
||||
leisure garden 0 0 0,0,0 88,245,168
|
||||
leisure pitch 0 0 0,0,0 136,204,170
|
||||
leisure track 0.05 1 40,40,40 119,221,187
|
||||
leisure playground 0.05 1 40,40,40 221,255,255
|
||||
leisure golf_course 0 0 0,0,0 187,221,187
|
||||
leisure stadium 0 0 0,0,0 102,204,170
|
||||
landuse forest 0 0 0,0,0 139,207,102
|
||||
landuse allotments 0 1 0,0,0 222,184,135
|
||||
tourism zoo 0 1 0,0,0 108,255,185
|
||||
building yes 0.01 1 0,0,0 226,226,226
|
||||
natural water 0 1 0,0,0 135,206,255
|
||||
waterway riverbank 0 1 0,0,0 135,206,255
|
||||
landuse construction 0 0 0,0,0 153,153,102
|
||||
landuse cemetery 0 0 0,0,0 170,204,170
|
||||
landuse brownfield 0 0 0,0,0 153,153,102
|
||||
landuse village_green 0 0 0,0,0 204,238,170
|
||||
landuse industrial 0 0 0,0,0 221,221,238
|
||||
landuse recreation_ground 0 0 0,0,0 204,238,170
|
||||
tourism zoo 0 0 0,0,0 180,238,180
|
||||
natural water 0 0 0,0,0 135,206,255
|
||||
natural wood 0.1 1 40,40,40 170,204,153
|
||||
natural land 0 0 0,0,0 170,170,170
|
||||
waterway riverbank 0 0 0,0,0 135,206,255
|
||||
place island 1 1 0,0,0 255,255,255
|
||||
highway trunk 6 1 150,0,0 255,255,255
|
||||
highway trunk 6 1 150,0,0 170,221,170
|
||||
highway primary 6 1 219,112,147 255,255,255
|
||||
highway secondary 4.5 1 255,120,0 255,255,255
|
||||
highway tertiary 3 1 238,230,133 255,255,255
|
||||
highway pedestrian 1 1 255,255,0 255,255,255
|
||||
highway residential 1 1 100,100,100 255,255,255
|
||||
highway footway 2 3 170,170,170 255,255,255
|
||||
highway pedestrian 0.8 1 230,214,182 255,255,255
|
||||
highway residential 1 1 100,100,100 235,235,235
|
||||
highway service 1 1 100,100,100 235,235,235
|
||||
highway footway 1.4 3 255,160,140 255,255,255
|
||||
amenity place_of_worship 0.1 1 0,0,0 123,140,123
|
||||
amenity grave_yard 0 0 0,0,0 157,191,157
|
||||
amenity school 0.05 1 160,160,110 221,221,170
|
||||
power station 0.05 1 170,170,170 187,187,187
|
||||
area yes 1 1 100,100,100 235,235,235
|
||||
building yes 0 0 0,0,0 204,153,153
|
||||
amenity parking 0 0 0,0,0 255,255,153
|
||||
* * 1 1 0,0,255 255,255,255
|
||||
#POINT
|
||||
source:addr uir_adr gpsicons/point.svg 7
|
||||
power tower symbol/Cross4.svg 10
|
||||
amenity hospital emergency/amenity=hospital.svg 10
|
||||
amenity police emergency/amenity=police.svg 10
|
||||
amenity parking transport/amenity=parking.svg 10
|
||||
amenity bus_station transport/highway=bus_stop.svg 10
|
||||
amenity restaurant entertainment/amenity=restaurant.svg 10
|
||||
@ -45,4 +78,11 @@ amenity fast_food entertainment/amenity=fast_food.svg 10
|
||||
amenity cinema entertainment/amenity=cinema.svg 10
|
||||
amenity cafe entertainment/amenity=cafe.svg 10
|
||||
amenity bar entertainment/amenity=bar.svg 10
|
||||
* * gpsicons/point.svg 7
|
||||
amenity pharmacy services/amenity=pharmacy.svg 10
|
||||
amenity telephone services/amenity=telephone.svg 10
|
||||
amenity atm services/amenity=atm.svg 10
|
||||
amenity bank gpsicons/bank.svg 10
|
||||
amenity post_box services/amenity=post_box.svg 10
|
||||
tourism hostel services/tourism=hotel.svg 10
|
||||
source:addr uir_adr gpsicons/point.svg 5
|
||||
* * gpsicons/point.svg 5
|
||||
|
@ -39,7 +39,7 @@
|
||||
<property name="sizeType" >
|
||||
<enum>QSizePolicy::Fixed</enum>
|
||||
</property>
|
||||
<property name="sizeHint" >
|
||||
<property name="sizeHint" stdset="0" >
|
||||
<size>
|
||||
<width>24</width>
|
||||
<height>20</height>
|
||||
@ -74,6 +74,15 @@
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QToolButton" name="typeInfoButton" >
|
||||
<property name="toolTip" >
|
||||
<string>Show type description</string>
|
||||
</property>
|
||||
<property name="statusTip" >
|
||||
<string>Shows brief description of selected relation type.</string>
|
||||
</property>
|
||||
<property name="whatsThis" >
|
||||
<string>Shows brief description of selected relation type.</string>
|
||||
</property>
|
||||
<property name="text" >
|
||||
<string>...</string>
|
||||
</property>
|
||||
@ -84,7 +93,7 @@
|
||||
<property name="orientation" >
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" >
|
||||
<property name="sizeHint" stdset="0" >
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
@ -112,7 +121,7 @@
|
||||
<property name="orientation" >
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" >
|
||||
<property name="sizeHint" stdset="0" >
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
@ -122,6 +131,15 @@
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QToolButton" name="loadStandardTagsButton" >
|
||||
<property name="toolTip" >
|
||||
<string>Generate tags</string>
|
||||
</property>
|
||||
<property name="statusTip" >
|
||||
<string>Fills tag table with tags that are typical for relation of specified type.</string>
|
||||
</property>
|
||||
<property name="whatsThis" >
|
||||
<string>Fills tag table with tags that are typical for relation of specified type.</string>
|
||||
</property>
|
||||
<property name="text" >
|
||||
<string>...</string>
|
||||
</property>
|
||||
@ -129,6 +147,15 @@
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QToolButton" name="removeTagButton" >
|
||||
<property name="toolTip" >
|
||||
<string>Remove all selected tags</string>
|
||||
</property>
|
||||
<property name="statusTip" >
|
||||
<string>Removes all selected tags.</string>
|
||||
</property>
|
||||
<property name="whatsThis" >
|
||||
<string>Removes all selected tags.</string>
|
||||
</property>
|
||||
<property name="text" >
|
||||
<string>...</string>
|
||||
</property>
|
||||
@ -164,7 +191,7 @@
|
||||
<property name="orientation" >
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" >
|
||||
<property name="sizeHint" stdset="0" >
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
@ -174,6 +201,15 @@
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QToolButton" name="chooseMemberButton" >
|
||||
<property name="toolTip" >
|
||||
<string>Select member on map</string>
|
||||
</property>
|
||||
<property name="statusTip" >
|
||||
<string>Starts process of selecting next relation member on map.</string>
|
||||
</property>
|
||||
<property name="whatsThis" >
|
||||
<string>Starts process of selecting next relation member on map.</string>
|
||||
</property>
|
||||
<property name="text" >
|
||||
<string>...</string>
|
||||
</property>
|
||||
@ -184,6 +220,15 @@
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QToolButton" name="removeMemberButton" >
|
||||
<property name="toolTip" >
|
||||
<string>Remove all selected members</string>
|
||||
</property>
|
||||
<property name="statusTip" >
|
||||
<string>Removes all selected members.</string>
|
||||
</property>
|
||||
<property name="whatsThis" >
|
||||
<string>Removes all selected members.</string>
|
||||
</property>
|
||||
<property name="text" >
|
||||
<string>...</string>
|
||||
</property>
|
||||
@ -234,7 +279,7 @@
|
||||
<property name="orientation" >
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" >
|
||||
<property name="sizeHint" stdset="0" >
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
|
@ -37,6 +37,14 @@
|
||||
<string>OSM Feature</string>
|
||||
</property>
|
||||
<widget class="QWidget" name="dockWidgetContents" >
|
||||
<property name="geometry" >
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>21</y>
|
||||
<width>265</width>
|
||||
<height>715</height>
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" >
|
||||
<item>
|
||||
<layout class="QHBoxLayout" >
|
||||
@ -89,13 +97,13 @@
|
||||
<enum>Qt::NoFocus</enum>
|
||||
</property>
|
||||
<property name="toolTip" >
|
||||
<string>Identify object</string>
|
||||
<string>Identify feature</string>
|
||||
</property>
|
||||
<property name="statusTip" >
|
||||
<string>Identify object</string>
|
||||
<string>Identify feature</string>
|
||||
</property>
|
||||
<property name="whatsThis" >
|
||||
<string>Identify object</string>
|
||||
<string>Identify feature</string>
|
||||
</property>
|
||||
<property name="text" >
|
||||
<string>...</string>
|
||||
@ -123,7 +131,13 @@
|
||||
<enum>Qt::NoFocus</enum>
|
||||
</property>
|
||||
<property name="toolTip" >
|
||||
<string>Move object</string>
|
||||
<string>Move feature</string>
|
||||
</property>
|
||||
<property name="statusTip" >
|
||||
<string>Move feature</string>
|
||||
</property>
|
||||
<property name="whatsThis" >
|
||||
<string>Move feature</string>
|
||||
</property>
|
||||
<property name="text" >
|
||||
<string>...</string>
|
||||
@ -348,10 +362,7 @@
|
||||
</property>
|
||||
<item>
|
||||
<layout class="QGridLayout" >
|
||||
<property name="horizontalSpacing" >
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="verticalSpacing" >
|
||||
<property name="spacing" >
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item row="0" column="0" >
|
||||
@ -405,13 +416,13 @@
|
||||
</size>
|
||||
</property>
|
||||
<property name="toolTip" >
|
||||
<string>Remove feature</string>
|
||||
<string>Remove this feature</string>
|
||||
</property>
|
||||
<property name="statusTip" >
|
||||
<string>Remove feature</string>
|
||||
<string>Remove this feature</string>
|
||||
</property>
|
||||
<property name="whatsThis" >
|
||||
<string>Remove feature</string>
|
||||
<string>Remove this feature</string>
|
||||
</property>
|
||||
<property name="text" >
|
||||
<string>...</string>
|
||||
@ -456,6 +467,14 @@
|
||||
<number>1</number>
|
||||
</property>
|
||||
<widget class="QWidget" name="Properties" >
|
||||
<property name="geometry" >
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>640</width>
|
||||
<height>320</height>
|
||||
</rect>
|
||||
</property>
|
||||
<attribute name="title" >
|
||||
<string>Properties</string>
|
||||
</attribute>
|
||||
@ -492,7 +511,7 @@
|
||||
<property name="orientation" >
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" >
|
||||
<property name="sizeHint" stdset="0" >
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
@ -521,6 +540,14 @@
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="Relations" >
|
||||
<property name="geometry" >
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>243</width>
|
||||
<height>534</height>
|
||||
</rect>
|
||||
</property>
|
||||
<attribute name="title" >
|
||||
<string>Relations</string>
|
||||
</attribute>
|
||||
@ -607,7 +634,7 @@
|
||||
<property name="sizeType" >
|
||||
<enum>QSizePolicy::Minimum</enum>
|
||||
</property>
|
||||
<property name="sizeHint" >
|
||||
<property name="sizeHint" stdset="0" >
|
||||
<size>
|
||||
<width>26</width>
|
||||
<height>0</height>
|
||||
|
@ -90,6 +90,9 @@ OsmHandler::OsmHandler( QFile *f, sqlite3 *database )
|
||||
OsmHandler::~OsmHandler()
|
||||
{
|
||||
sqlite3_finalize( mStmtInsertTag );
|
||||
sqlite3_finalize( mStmtInsertNode );
|
||||
sqlite3_finalize( mStmtInsertWay );
|
||||
sqlite3_finalize( mStmtInsertWayMember );
|
||||
sqlite3_finalize( mStmtInsertRelation );
|
||||
sqlite3_finalize( mStmtInsertRelationMember );
|
||||
sqlite3_finalize( mStmtInsertVersion );
|
||||
@ -170,11 +173,6 @@ bool OsmHandler::startElement( const QString & pUri, const QString & pLocalName,
|
||||
}
|
||||
else if ( name == "way" )
|
||||
{
|
||||
if ( mObjectType != "way" )
|
||||
{
|
||||
sqlite3_finalize( mStmtInsertNode );
|
||||
}
|
||||
|
||||
mObjectId = pAttrs.value( "id" );
|
||||
mObjectType = "way";
|
||||
mPosId = 1;
|
||||
@ -227,12 +225,6 @@ bool OsmHandler::startElement( const QString & pUri, const QString & pLocalName,
|
||||
}
|
||||
else if ( name == "relation" )
|
||||
{
|
||||
if ( mObjectType != "relation" )
|
||||
{
|
||||
sqlite3_finalize( mStmtInsertWay );
|
||||
sqlite3_finalize( mStmtInsertWayMember );
|
||||
}
|
||||
|
||||
mObjectId = pAttrs.value( "id" );
|
||||
mRelationType = "";
|
||||
mObjectType = "relation";
|
||||
@ -305,7 +297,6 @@ bool OsmHandler::startElement( const QString & pUri, const QString & pLocalName,
|
||||
else if ( name == "bounds" )
|
||||
{
|
||||
// e.g. <bounds minlat="41.388625" minlon="2.15426" maxlat="41.391732" maxlon="2.158192"/>
|
||||
// notice: getting boundaries from OSM file <bounds> tag was not correct for some maps - cannot be used
|
||||
|
||||
// xMin = pAttrs.value("minlon").toDouble();
|
||||
// xMax = pAttrs.value("maxlon").toDouble();
|
||||
|
@ -27,6 +27,8 @@
|
||||
#include <QDateTime>
|
||||
#include <QByteArray>
|
||||
|
||||
using namespace std;
|
||||
|
||||
|
||||
static const QString TEXT_PROVIDER_KEY = "osm";
|
||||
static const QString TEXT_PROVIDER_DESCRIPTION = "Open Street Map data provider";
|
||||
@ -142,8 +144,11 @@ QgsOSMDataProvider::QgsOSMDataProvider( QString uri )
|
||||
// flag determining if OSM file parsing is neccessary
|
||||
bool shouldParse = true;
|
||||
|
||||
if ( mFeatureType != PolygonType )
|
||||
shouldParse = false;
|
||||
|
||||
// test if db file that belongs to source OSM file already exists and if it has the right version
|
||||
if ( databaseExists && isDatabaseCompatibleWithInput( mFileName ) && isDatabaseCompatibleWithPlugin() )
|
||||
if ( shouldParse && databaseExists && isDatabaseCompatibleWithInput( mFileName ) && isDatabaseCompatibleWithProvider() )
|
||||
shouldParse = false;
|
||||
|
||||
if ( shouldParse )
|
||||
@ -178,16 +183,16 @@ QgsOSMDataProvider::QgsOSMDataProvider( QString uri )
|
||||
// no OSM file parsing was done, we must find out default area boundaries from database meta information
|
||||
char sqlSelectBoundary[] = "SELECT val FROM meta WHERE key='default-area-boundaries';";
|
||||
sqlite3_stmt *stmtSelectBoundary;
|
||||
if ( sqlite3_prepare_v2( mDatabase, sqlSelectBoundary, sizeof(sqlSelectBoundary), &stmtSelectBoundary, 0 ) != SQLITE_OK )
|
||||
if ( sqlite3_prepare_v2( mDatabase, sqlSelectBoundary, sizeof( sqlSelectBoundary ), &stmtSelectBoundary, 0 ) != SQLITE_OK )
|
||||
{
|
||||
QgsDebugMsg( "Getting default area boundary failed." );
|
||||
// don't worry, we just let default values in xMax, yMax, xMin and yMin variables
|
||||
}
|
||||
else
|
||||
{
|
||||
if (sqlite3_step( stmtSelectBoundary ) != SQLITE_ROW)
|
||||
if ( sqlite3_step( stmtSelectBoundary ) != SQLITE_ROW )
|
||||
{
|
||||
QgsDebugMsg("Getting default area boundary failed.");
|
||||
QgsDebugMsg( "Getting default area boundary failed." );
|
||||
// don't worry again, we just let default values in boundary variables
|
||||
}
|
||||
else
|
||||
@ -213,35 +218,35 @@ QgsOSMDataProvider::QgsOSMDataProvider( QString uri )
|
||||
|
||||
// prepare statement for tag retrieval
|
||||
char sqlSelectTags[] = "SELECT key, val FROM tag WHERE object_id=? AND object_type=?";
|
||||
int rc = sqlite3_prepare_v2( mDatabase, sqlSelectTags, sizeof(sqlSelectTags), &mTagsStmt, 0 );
|
||||
int rc = sqlite3_prepare_v2( mDatabase, sqlSelectTags, sizeof( sqlSelectTags ), &mTagsStmt, 0 );
|
||||
if ( rc != SQLITE_OK )
|
||||
{
|
||||
QgsDebugMsg("sqlite3 statement for feature tags selection - prepare failed.");
|
||||
QgsDebugMsg( "sqlite3 statement for feature tags selection - prepare failed." );
|
||||
return;
|
||||
}
|
||||
|
||||
char sqlSelectTagValue[] = "SELECT val FROM tag WHERE object_id=? AND object_type=? AND key=?";
|
||||
rc = sqlite3_prepare_v2( mDatabase, sqlSelectTagValue, sizeof(sqlSelectTagValue), &mCustomTagsStmt, 0 );
|
||||
rc = sqlite3_prepare_v2( mDatabase, sqlSelectTagValue, sizeof( sqlSelectTagValue ), &mCustomTagsStmt, 0 );
|
||||
if ( rc != SQLITE_OK )
|
||||
{
|
||||
QgsDebugMsg("sqlite3 statement for tag value selection - prepare failed.");
|
||||
QgsDebugMsg( "sqlite3 statement for tag value selection - prepare failed." );
|
||||
return;
|
||||
}
|
||||
|
||||
// prepare statements for feature retrieval
|
||||
char sqlSelectWay[] = "SELECT id, wkb, timestamp, user FROM way WHERE id=? AND status<>'R' AND u=1";
|
||||
rc = sqlite3_prepare_v2( mDatabase, sqlSelectWay, sizeof(sqlSelectWay), &mWayStmt, 0 );
|
||||
rc = sqlite3_prepare_v2( mDatabase, sqlSelectWay, sizeof( sqlSelectWay ), &mWayStmt, 0 );
|
||||
if ( rc != SQLITE_OK )
|
||||
{
|
||||
QgsDebugMsg("sqlite3 statement for way retrieval - prepare failed.");
|
||||
QgsDebugMsg( "sqlite3 statement for way retrieval - prepare failed." );
|
||||
return;
|
||||
}
|
||||
|
||||
char sqlSelectNode[] = "SELECT id, lat, lon, timestamp, user FROM node WHERE id=? AND usage=0 AND status<>'R' AND u=1";
|
||||
rc = sqlite3_prepare_v2( mDatabase, sqlSelectNode, sizeof(sqlSelectNode), &mNodeStmt, 0 );
|
||||
rc = sqlite3_prepare_v2( mDatabase, sqlSelectNode, sizeof( sqlSelectNode ), &mNodeStmt, 0 );
|
||||
if ( rc != SQLITE_OK )
|
||||
{
|
||||
QgsDebugMsg("sqlite3 statement for node retrieval - prepare failed.");
|
||||
QgsDebugMsg( "sqlite3 statement for node retrieval - prepare failed." );
|
||||
return;
|
||||
}
|
||||
|
||||
@ -251,14 +256,14 @@ QgsOSMDataProvider::QgsOSMDataProvider( QString uri )
|
||||
char sqlSelectPointsIn[] = "SELECT id, lat, lon, timestamp, user FROM node WHERE usage=0 AND status<>'R' AND u=1 \
|
||||
AND lat>=? AND lat<=? AND lon>=? AND lon<=?";
|
||||
|
||||
if ( sqlite3_prepare_v2( mDatabase, sqlSelectPoints, sizeof(sqlSelectPoints), &mSelectFeatsStmt, 0 ) != SQLITE_OK )
|
||||
if ( sqlite3_prepare_v2( mDatabase, sqlSelectPoints, sizeof( sqlSelectPoints ), &mSelectFeatsStmt, 0 ) != SQLITE_OK )
|
||||
{
|
||||
QgsDebugMsg("sqlite3 statement for points retrieval - prepare failed.");
|
||||
QgsDebugMsg( "sqlite3 statement for points retrieval - prepare failed." );
|
||||
return;
|
||||
}
|
||||
if ( sqlite3_prepare_v2( mDatabase, sqlSelectPointsIn, sizeof(sqlSelectPointsIn), &mSelectFeatsInStmt, 0 ) != SQLITE_OK )
|
||||
if ( sqlite3_prepare_v2( mDatabase, sqlSelectPointsIn, sizeof( sqlSelectPointsIn ), &mSelectFeatsInStmt, 0 ) != SQLITE_OK )
|
||||
{
|
||||
QgsDebugMsg("sqlite3 statement for points in boundary retrieval - prepare failed.");
|
||||
QgsDebugMsg( "sqlite3 statement for points in boundary retrieval - prepare failed." );
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -267,16 +272,16 @@ QgsOSMDataProvider::QgsOSMDataProvider( QString uri )
|
||||
char sqlSelectLines[] = "SELECT w.id, w.wkb, w.timestamp, w.user FROM way w WHERE w.closed=0 AND w.status<>'R' AND w.u=1";
|
||||
char sqlSelectLinesIn[] = "SELECT w.id, w.wkb, w.timestamp, w.user FROM way w WHERE w.closed=0 AND w.status<>'R' AND w.u=1 \
|
||||
AND (((w.max_lat between ? AND ?) OR (w.min_lat between ? AND ?) OR (w.min_lat<? AND w.max_lat>?)) \
|
||||
OR ((w.max_lon between ? AND ?) OR (w.min_lon between ? AND ?) OR (w.min_lon<? AND w.max_lon>?)))";
|
||||
AND ((w.max_lon between ? AND ?) OR (w.min_lon between ? AND ?) OR (w.min_lon<? AND w.max_lon>?)))";
|
||||
|
||||
if ( sqlite3_prepare_v2( mDatabase, sqlSelectLines, sizeof(sqlSelectLines), &mSelectFeatsStmt, 0 ) != SQLITE_OK )
|
||||
if ( sqlite3_prepare_v2( mDatabase, sqlSelectLines, sizeof( sqlSelectLines ), &mSelectFeatsStmt, 0 ) != SQLITE_OK )
|
||||
{
|
||||
QgsDebugMsg("sqlite3 statement for lines retrieval - prepare failed.");
|
||||
QgsDebugMsg( "sqlite3 statement for lines retrieval - prepare failed." );
|
||||
return;
|
||||
}
|
||||
if ( sqlite3_prepare_v2( mDatabase, sqlSelectLinesIn, sizeof(sqlSelectLinesIn), &mSelectFeatsInStmt, 0 ) != SQLITE_OK )
|
||||
if ( sqlite3_prepare_v2( mDatabase, sqlSelectLinesIn, sizeof( sqlSelectLinesIn ), &mSelectFeatsInStmt, 0 ) != SQLITE_OK )
|
||||
{
|
||||
QgsDebugMsg("sqlite3 statement for lines in boundary retrieval - prepare failed.");
|
||||
QgsDebugMsg( "sqlite3 statement for lines in boundary retrieval - prepare failed." );
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -285,16 +290,16 @@ QgsOSMDataProvider::QgsOSMDataProvider( QString uri )
|
||||
char sqlSelectPolys[] = "SELECT w.id, w.wkb, w.timestamp, w.user FROM way w WHERE w.closed=1 AND w.status<>'R' AND w.u=1";
|
||||
char sqlSelectPolysIn[] = "SELECT w.id, w.wkb, w.timestamp, w.user FROM way w WHERE w.closed=1 AND w.status<>'R' AND w.u=1 \
|
||||
AND (((w.max_lat between ? AND ?) OR (w.min_lat between ? AND ?) OR (w.min_lat<? AND w.max_lat>?)) \
|
||||
OR ((w.max_lon between ? AND ?) OR (w.min_lon between ? AND ?) OR (w.min_lon<? AND w.max_lon>?)))";
|
||||
AND ((w.max_lon between ? AND ?) OR (w.min_lon between ? AND ?) OR (w.min_lon<? AND w.max_lon>?)))";
|
||||
|
||||
if ( sqlite3_prepare_v2( mDatabase, sqlSelectPolys, sizeof(sqlSelectPolys), &mSelectFeatsStmt, 0 ) != SQLITE_OK )
|
||||
if ( sqlite3_prepare_v2( mDatabase, sqlSelectPolys, sizeof( sqlSelectPolys ), &mSelectFeatsStmt, 0 ) != SQLITE_OK )
|
||||
{
|
||||
QgsDebugMsg("sqlite3 statement for polygons retrieval - prepare failed.");
|
||||
QgsDebugMsg( "sqlite3 statement for polygons retrieval - prepare failed." );
|
||||
return;
|
||||
}
|
||||
if ( sqlite3_prepare_v2( mDatabase, sqlSelectPolysIn, sizeof(sqlSelectPolysIn), &mSelectFeatsInStmt, 0 ) != SQLITE_OK )
|
||||
if ( sqlite3_prepare_v2( mDatabase, sqlSelectPolysIn, sizeof( sqlSelectPolysIn ), &mSelectFeatsInStmt, 0 ) != SQLITE_OK )
|
||||
{
|
||||
QgsDebugMsg("sqlite3 statement for polygons in boundary retrieval - prepare failed.");
|
||||
QgsDebugMsg( "sqlite3 statement for polygons in boundary retrieval - prepare failed." );
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -318,7 +323,10 @@ QgsOSMDataProvider::~QgsOSMDataProvider()
|
||||
sqlite3_finalize( mSelectFeatsInStmt );
|
||||
|
||||
// close opened sqlite3 database
|
||||
closeDatabase();
|
||||
if ( mDatabase )
|
||||
{
|
||||
closeDatabase();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -331,9 +339,9 @@ bool QgsOSMDataProvider::isDatabaseCompatibleWithInput( QString mFileName )
|
||||
char sqlSelectLastModif[] = "SELECT val FROM meta WHERE key='osm-file-last-modified';";
|
||||
sqlite3_stmt *stmtSelectLastModif;
|
||||
|
||||
if ( sqlite3_prepare_v2( mDatabase, sqlSelectLastModif, sizeof(sqlSelectLastModif), &stmtSelectLastModif, 0 ) == SQLITE_OK )
|
||||
if ( sqlite3_prepare_v2( mDatabase, sqlSelectLastModif, sizeof( sqlSelectLastModif ), &stmtSelectLastModif, 0 ) == SQLITE_OK )
|
||||
{
|
||||
if ( sqlite3_step(stmtSelectLastModif) == SQLITE_ROW )
|
||||
if ( sqlite3_step( stmtSelectLastModif ) == SQLITE_ROW )
|
||||
{
|
||||
QString oldOsmLastModifString = ( const char * ) sqlite3_column_text( stmtSelectLastModif, 0 );
|
||||
QDateTime oldOsmFileLastModif = QDateTime::fromString( oldOsmLastModifString, DATE_TIME_FMT );
|
||||
@ -354,28 +362,28 @@ bool QgsOSMDataProvider::isDatabaseCompatibleWithInput( QString mFileName )
|
||||
}
|
||||
|
||||
|
||||
bool QgsOSMDataProvider::isDatabaseCompatibleWithPlugin()
|
||||
bool QgsOSMDataProvider::isDatabaseCompatibleWithProvider()
|
||||
{
|
||||
char sqlSelectPluginVer[] = "SELECT val FROM meta WHERE key='osm-plugin-version';";
|
||||
sqlite3_stmt *stmtSelectPluginVer;
|
||||
char sqlSelectProviderVer[] = "SELECT val FROM meta WHERE key='osm-provider-version';";
|
||||
sqlite3_stmt *stmtSelectProviderVer;
|
||||
|
||||
if ( sqlite3_prepare_v2( mDatabase, sqlSelectPluginVer, sizeof(sqlSelectPluginVer), &stmtSelectPluginVer, 0 ) == SQLITE_OK )
|
||||
if ( sqlite3_prepare_v2( mDatabase, sqlSelectProviderVer, sizeof( sqlSelectProviderVer ), &stmtSelectProviderVer, 0 ) == SQLITE_OK )
|
||||
{
|
||||
if ( sqlite3_step( stmtSelectPluginVer ) == SQLITE_ROW )
|
||||
if ( sqlite3_step( stmtSelectProviderVer ) == SQLITE_ROW )
|
||||
{
|
||||
QString osmPluginVersion = ( const char * ) sqlite3_column_text( stmtSelectPluginVer, 0 );
|
||||
QString osmProviderVersion = ( const char * ) sqlite3_column_text( stmtSelectProviderVer, 0 );
|
||||
|
||||
// each OSM database schema carry info on version of QGIS OSM plugin from which database was created;
|
||||
// this provider must be of the same version to be able to manage OSM data correctly
|
||||
if ( osmPluginVersion == PROVIDER_VERSION )
|
||||
if ( osmProviderVersion == PROVIDER_VERSION )
|
||||
{
|
||||
sqlite3_finalize( stmtSelectPluginVer );
|
||||
sqlite3_finalize( stmtSelectProviderVer );
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
// destroy database statement
|
||||
sqlite3_finalize( stmtSelectPluginVer );
|
||||
sqlite3_finalize( stmtSelectProviderVer );
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -470,7 +478,7 @@ int QgsOSMDataProvider::wayMemberCount( int wayId )
|
||||
char sqlWayMemberCnt[] = "SELECT count(n.id) FROM way_member wm, node n WHERE wm.way_id=? AND wm.node_id=n.id AND wm.u=1 AND n.u=1;";
|
||||
sqlite3_stmt *stmtWayMemberCnt;
|
||||
|
||||
if ( sqlite3_prepare_v2( mDatabase, sqlWayMemberCnt, sizeof(sqlWayMemberCnt), &stmtWayMemberCnt, 0 ) != SQLITE_OK )
|
||||
if ( sqlite3_prepare_v2( mDatabase, sqlWayMemberCnt, sizeof( sqlWayMemberCnt ), &stmtWayMemberCnt, 0 ) != SQLITE_OK )
|
||||
{
|
||||
QgsDebugMsg( "sqlite3 statement for selecting waymember count - prepare failed." );
|
||||
sqlite3_finalize( stmtWayMemberCnt );
|
||||
@ -579,11 +587,11 @@ bool QgsOSMDataProvider::fetchNode( QgsFeature& feature, sqlite3_stmt* stmt, boo
|
||||
if ( fetchGeometry )
|
||||
{
|
||||
char* geo = new char[21];
|
||||
memset( geo, 0, 21 );
|
||||
std::memset( geo, 0, 21 );
|
||||
geo[0] = QgsApplication::endian();
|
||||
geo[geo[0] == QgsApplication::NDR ? 1 : 4] = QGis::WKBPoint;
|
||||
memcpy( geo + 5, &selLon, sizeof( double ) );
|
||||
memcpy( geo + 13, &selLat, sizeof( double ) );
|
||||
std::memcpy( geo + 5, &selLon, sizeof( double ) );
|
||||
std::memcpy( geo + 13, &selLat, sizeof( double ) );
|
||||
feature.setGeometryAndOwnership(( unsigned char * )geo, 24 ); // 24 is size of wkb point structure!
|
||||
}
|
||||
|
||||
@ -1009,11 +1017,11 @@ bool QgsOSMDataProvider::updateWayWKB( int wayId, int isClosed, char **geo, int
|
||||
( *geo ) = new char[9 + 16 * memberCnt];
|
||||
( *geolen ) = 9 + 16 * memberCnt;
|
||||
|
||||
memset(( *geo ), 0, 9 + 16 * memberCnt );
|
||||
std::memset(( *geo ), 0, 9 + 16 * memberCnt );
|
||||
|
||||
( *geo )[0] = QgsApplication::endian();
|
||||
( *geo )[( *geo )[0] == QgsApplication::NDR ? 1 : 4] = QGis::WKBLineString;
|
||||
memcpy(( *geo ) + 5, &memberCnt, 4 );
|
||||
std::memcpy(( *geo ) + 5, &memberCnt, 4 );
|
||||
|
||||
sqlite3_bind_int( stmtSelectMembers, 1, wayId );
|
||||
|
||||
@ -1035,8 +1043,8 @@ bool QgsOSMDataProvider::updateWayWKB( int wayId, int isClosed, char **geo, int
|
||||
if ( selLat > maxLat ) maxLat = selLat;
|
||||
if ( selLon > maxLon ) maxLon = selLon;
|
||||
|
||||
memcpy(( *geo ) + 9 + 16 * i, &selLon, sizeof( double ) );
|
||||
memcpy(( *geo ) + 9 + 16 * i + 8, &selLat, sizeof( double ) );
|
||||
std::memcpy(( *geo ) + 9 + 16 * i, &selLon, sizeof( double ) );
|
||||
std::memcpy(( *geo ) + 9 + 16 * i + 8, &selLat, sizeof( double ) );
|
||||
i++;
|
||||
}
|
||||
|
||||
@ -1049,11 +1057,11 @@ bool QgsOSMDataProvider::updateWayWKB( int wayId, int isClosed, char **geo, int
|
||||
memberCnt++;
|
||||
( *geo ) = new char[13 + 16 * memberCnt];
|
||||
( *geolen ) = 13 + 16 * memberCnt;
|
||||
memset(( *geo ), 0, 13 + 16 * memberCnt );
|
||||
std::memset(( *geo ), 0, 13 + 16 * memberCnt );
|
||||
( *geo )[0] = QgsApplication::endian();
|
||||
( *geo )[( *geo )[0] == QgsApplication::NDR ? 1 : 4] = QGis::WKBPolygon;
|
||||
memcpy(( *geo ) + 5, &ringsCnt, 4 );
|
||||
memcpy(( *geo ) + 9, &memberCnt, 4 );
|
||||
std::memcpy(( *geo ) + 5, &ringsCnt, 4 );
|
||||
std::memcpy(( *geo ) + 9, &memberCnt, 4 );
|
||||
|
||||
sqlite3_bind_int( stmtSelectMembers, 1, wayId );
|
||||
|
||||
@ -1077,8 +1085,8 @@ bool QgsOSMDataProvider::updateWayWKB( int wayId, int isClosed, char **geo, int
|
||||
if ( selLat > maxLat ) maxLat = selLat;
|
||||
if ( selLon > maxLon ) maxLon = selLon;
|
||||
|
||||
memcpy(( *geo ) + 13 + 16 * i, &selLon, sizeof( double ) );
|
||||
memcpy(( *geo ) + 13 + 16 * i + 8, &selLat, sizeof( double ) );
|
||||
std::memcpy(( *geo ) + 13 + 16 * i, &selLon, sizeof( double ) );
|
||||
std::memcpy(( *geo ) + 13 + 16 * i + 8, &selLat, sizeof( double ) );
|
||||
|
||||
if ( firstLat == -1000.0 )
|
||||
firstLat = selLat;
|
||||
@ -1087,8 +1095,8 @@ bool QgsOSMDataProvider::updateWayWKB( int wayId, int isClosed, char **geo, int
|
||||
i++;
|
||||
}
|
||||
// add last polygon line
|
||||
memcpy(( *geo ) + 13 + 16 * i, &firstLon, sizeof( double ) );
|
||||
memcpy(( *geo ) + 13 + 16 * i + 8, &firstLat, sizeof( double ) );
|
||||
std::memcpy(( *geo ) + 13 + 16 * i, &firstLon, sizeof( double ) );
|
||||
std::memcpy(( *geo ) + 13 + 16 * i + 8, &firstLat, sizeof( double ) );
|
||||
|
||||
sqlite3_bind_blob( stmtUpdateWay, 1, ( *geo ), 13 + 16 * memberCnt, SQLITE_TRANSIENT );
|
||||
}
|
||||
@ -1360,17 +1368,17 @@ bool QgsOSMDataProvider::loadOsmFile( QString osm_filename )
|
||||
|
||||
if ( sqlite3_exec( mDatabase, ptr, 0, 0, 0 ) != SQLITE_OK )
|
||||
{
|
||||
QgsDebugMsg("Storing osm-file-last-modified info into database failed.");
|
||||
cout << "Storing osm-file-last-modified info into database failed." << endl;
|
||||
// its not fatal situation, lets continue..
|
||||
}
|
||||
|
||||
QString cmd2 = "INSERT INTO meta ( key, val ) VALUES ('osm-plugin-version','" + PROVIDER_VERSION + "');";
|
||||
QString cmd2 = "INSERT INTO meta ( key, val ) VALUES ('osm-provider-version','" + PROVIDER_VERSION + "');";
|
||||
QByteArray cmd_bytes2 = cmd2.toAscii();
|
||||
const char *ptr2 = cmd_bytes2.data();
|
||||
|
||||
if ( sqlite3_exec( mDatabase, ptr2, 0, 0, 0 ) != SQLITE_OK )
|
||||
{
|
||||
QgsDebugMsg("Storing osm-plugin-version info into database failed.");
|
||||
cout << "Storing osm-provider-version info into database failed." << endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -1388,7 +1396,7 @@ bool QgsOSMDataProvider::loadOsmFile( QString osm_filename )
|
||||
|
||||
if ( sqlite3_exec( mDatabase, ptr3, 0, 0, 0 ) != SQLITE_OK )
|
||||
{
|
||||
QgsDebugMsg("Storing default area boundaries information into database failed.");
|
||||
cout << "Storing default area boundaries information into database failed." << endl;
|
||||
// its not critical situation
|
||||
}
|
||||
|
||||
@ -1655,6 +1663,7 @@ bool QgsOSMDataProvider::closeDatabase()
|
||||
mError = ( char * ) "Closing SQLite3 database failed.";
|
||||
return false;
|
||||
}
|
||||
mDatabase = NULL;
|
||||
return true;
|
||||
};
|
||||
|
||||
|
@ -24,6 +24,7 @@
|
||||
class QgsOSMDataProvider: public QgsVectorDataProvider
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
private:
|
||||
|
||||
//! provider manages features with one of three geometry types; variable determines feature type of this provider
|
||||
@ -237,17 +238,17 @@ class QgsOSMDataProvider: public QgsVectorDataProvider
|
||||
|
||||
private:
|
||||
/**
|
||||
* Finds out if database (provider is connected to) belongs to (was created from) specified input file.
|
||||
* Finds out if current database belongs to (was created from) specified input file.
|
||||
* @param mFileName name of input OSM file
|
||||
* @return answer to that question
|
||||
*/
|
||||
bool isDatabaseCompatibleWithInput( QString mFileName );
|
||||
|
||||
/**
|
||||
* Finds out if database and provider versions are compatible.
|
||||
* Finds out if current database and provider versions are compatible.
|
||||
* @return answer to that question
|
||||
*/
|
||||
bool isDatabaseCompatibleWithPlugin();
|
||||
bool isDatabaseCompatibleWithProvider();
|
||||
|
||||
/**
|
||||
* Creates Open Street Map database schema, using c++ library for attempt to sqlite database.
|
||||
|
@ -16,6 +16,11 @@
|
||||
|
||||
// python should be first include
|
||||
// otherwise issues some warnings
|
||||
#ifdef _MSC_VER
|
||||
#ifdef _DEBUG
|
||||
#undef _DEBUG
|
||||
#endif
|
||||
#endif
|
||||
#include <Python.h>
|
||||
|
||||
#include "qgspythonutilsimpl.h"
|
||||
|