diff options
Diffstat (limited to 'chimere/external_utils/OsmApi.py')
| -rw-r--r-- | chimere/external_utils/OsmApi.py | 747 | 
1 files changed, 0 insertions, 747 deletions
| diff --git a/chimere/external_utils/OsmApi.py b/chimere/external_utils/OsmApi.py deleted file mode 100644 index 3b1b9b1..0000000 --- a/chimere/external_utils/OsmApi.py +++ /dev/null @@ -1,747 +0,0 @@ -#-*- coding: utf-8 -*- - -########################################################################### -##                                                                       ## -## Copyrights Etienne Chové <chove@crans.org> 2009-2010                  ## -##                                                                       ## -## 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 3 of the License, or     ## -## (at your option) any later version.                                   ## -##                                                                       ## -## This program is distributed in the hope that it will be useful,       ## -## but WITHOUT ANY WARRANTY; without even the implied warranty of        ## -## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         ## -## GNU General Public License for more details.                          ## -##                                                                       ## -## You should have received a copy of the GNU General Public License     ## -## along with this program.  If not, see <http://www.gnu.org/licenses/>. ## -##                                                                       ## -########################################################################### - -## HomePage : http://wiki.openstreetmap.org/wiki/PythonOsmApi - -########################################################################### -## History                                                               ## -########################################################################### -## 0.2.19  2010-05-24 Add debug message on ApiError                      ## -## 0.2.18  2010-04-20 Fix ChangesetClose and _http_request               ## -## 0.2.17  2010-01-02 Capabilities implementation                        ## -## 0.2.16  2010-01-02 ChangesetsGet by Alexander Rampp                   ## -## 0.2.15  2009-12-16 xml encoding error for < and >                     ## -## 0.2.14  2009-11-20 changesetautomulti parameter                       ## -## 0.2.13  2009-11-16 modify instead update for osc                      ## -## 0.2.12  2009-11-14 raise ApiError on 4xx errors -- Xoff               ## -## 0.2.11  2009-10-14 unicode error on ChangesetUpload                   ## -## 0.2.10  2009-10-14 RelationFullRecur definition                       ## -## 0.2.9   2009-10-13 automatic changeset management                     ## -##                    ChangesetUpload implementation                     ## -## 0.2.8   2009-10-13 *(Create|Update|Delete) use not unique _do method  ## -## 0.2.7   2009-10-09 implement all missing fonctions except             ## -##                    ChangesetsGet and GetCapabilities                  ## -## 0.2.6   2009-10-09 encoding clean-up                                  ## -## 0.2.5   2009-10-09 implements NodesGet, WaysGet, RelationsGet         ## -##                               ParseOsm, ParseOsc                      ## -## 0.2.4   2009-10-06 clean-up                                           ## -## 0.2.3   2009-09-09 keep http connection alive for multiple request    ## -##                    (Node|Way|Relation)Get return None when object     ## -##                    have been deleted (raising error before)           ## -## 0.2.2   2009-07-13 can identify applications built on top of the lib  ## -## 0.2.1   2009-05-05 some changes in constructor -- chove@crans.org     ## -## 0.2     2009-05-01 initial import                                     ## -########################################################################### - -__version__ = '0.2.19' - -import httplib, base64, xml.dom.minidom, time, sys, urllib - -class ApiError(Exception): -    	 -    def __init__(self, status, reason, payload): -        self.status  = status -        self.reason  = reason -        self.payload = payload -     -    def __str__(self): -        return "Request failed: " + str(self.status) + " - " + self.reason + " - " + self.payload - -########################################################################### -## Main class                                                            ## - -class OsmApi: -         -    def __init__(self, -        username = None, -        password = None, -        passwordfile = None, -        appid = "", -        created_by = "PythonOsmApi/"+__version__, -        api = "www.openstreetmap.org", -        changesetauto = False, -        changesetautotags = {}, -        changesetautosize = 500, -        changesetautomulti = 1, -        debug = False -        ): -     -        # debug -        self._debug = debug -         -        # Get username -        if username: -            self._username = username -        elif passwordfile: -            self._username =  open(passwordfile).readline().split(":")[0].strip()             -     -        # Get password -        if password: -            self._password   = password -        elif passwordfile: -            for l in open(passwordfile).readlines(): -                l = l.strip().split(":") -                if l[0] == self._username: -                    self._password = l[1] - -        # Changest informations -        self._changesetauto      = changesetauto      # auto create and close changesets -        self._changesetautotags  = changesetautotags  # tags for automatic created changesets -        self._changesetautosize  = changesetautosize  # change count for auto changeset -        self._changesetautosize  = changesetautosize  # change count for auto changeset -        self._changesetautomulti = changesetautomulti # close a changeset every # upload -        self._changesetautocpt   = 0 -        self._changesetautodata  = []                 # data to upload for auto group -         -        # Get API -        self._api = api - -        # Get created_by -        if not appid: -            self._created_by = created_by -        else: -            self._created_by = appid + " (" + created_by + ")" - -        # Initialisation      -        self._CurrentChangesetId = 0 -         -        # Http connection -        self._conn = httplib.HTTPConnection(self._api, 80) - -    def __del__(self): -        if self._changesetauto: -            self._changesetautoflush(True) -        return None - -    ####################################################################### -    # Capabilities                                                        # -    ####################################################################### -     -    def Capabilities(self): -        """ Returns ApiCapabilities. """ -        uri = "/api/capabilities" -        data = self._get(uri) -        data = xml.dom.minidom.parseString(data) -        print data.getElementsByTagName("osm") -        data = data.getElementsByTagName("osm")[0].getElementsByTagName("api")[0] -        result = {} -        for elem in data.childNodes: -            if elem.nodeType <> elem.ELEMENT_NODE: -                continue -            result[elem.nodeName] = {} -            print elem.nodeName -            for k, v in elem.attributes.items(): -                try: -                    result[elem.nodeName][k] = float(v) -                except: -                    result[elem.nodeName][k] = v -        return result - -    ####################################################################### -    # Node                                                                # -    ####################################################################### - -    def NodeGet(self, NodeId, NodeVersion = -1): -        """ Returns NodeData for node #NodeId. """ -        uri = "/api/0.6/node/"+str(NodeId) -        if NodeVersion <> -1: uri += "/"+str(NodeVersion) -        data = self._get(uri) -        if not data: return data -        data = xml.dom.minidom.parseString(data) -        data = data.getElementsByTagName("osm")[0].getElementsByTagName("node")[0] -        return self._DomParseNode(data) - -    def NodeCreate(self, NodeData): -        """ Creates a node. Returns updated NodeData (without timestamp). """ -        return self._do("create", "node", NodeData) -             -    def NodeUpdate(self, NodeData): -        """ Updates node with NodeData. Returns updated NodeData (without timestamp). """ -        return self._do("modify", "node", NodeData) - -    def NodeDelete(self, NodeData): -        """ Delete node with NodeData. Returns updated NodeData (without timestamp). """ -        return self._do("delete", "node", NodeData) - -    def NodeHistory(self, NodeId): -        """ Returns dict(NodeVerrsion: NodeData). """ -        uri = "/api/0.6/node/"+str(NodeId)+"/history" -        data = self._get(uri) -        data = xml.dom.minidom.parseString(data) -        result = {} -        for data in data.getElementsByTagName("osm")[0].getElementsByTagName("node"): -            data = self._DomParseNode(data) -            result[data[u"version"]] = data -        return result - -    def NodeWays(self, NodeId): -        """ Returns [WayData, ... ] containing node #NodeId. """ -        uri = "/api/0.6/node/%d/ways"%NodeId -        data = self._get(uri) -        data = xml.dom.minidom.parseString(data) -        result = [] -        for data in data.getElementsByTagName("osm")[0].getElementsByTagName("way"): -            data = self._DomParseRelation(data) -            result.append(data) -        return result -     -    def NodeRelations(self, NodeId): -        """ Returns [RelationData, ... ] containing node #NodeId. """ -        uri = "/api/0.6/node/%d/relations"%NodeId -        data = self._get(uri) -        data = xml.dom.minidom.parseString(data) -        result = [] -        for data in data.getElementsByTagName("osm")[0].getElementsByTagName("relation"): -            data = self._DomParseRelation(data) -            result.append(data) -        return result - -    def NodesGet(self, NodeIdList): -        """ Returns dict(NodeId: NodeData) for each node in NodeIdList """ -        uri  = "/api/0.6/nodes?nodes=" + ",".join([str(x) for x in NodeIdList]) -        data = self._get(uri) -        data = xml.dom.minidom.parseString(data) -        result = {} -        for data in data.getElementsByTagName("osm")[0].getElementsByTagName("node"): -            data = self._DomParseNode(data) -            result[data[u"id"]] = data -        return result - -    ####################################################################### -    # Way                                                                 # -    ####################################################################### - -    def WayGet(self, WayId, WayVersion = -1): -        """ Returns WayData for way #WayId. """ -        uri = "/api/0.6/way/"+str(WayId) -        if WayVersion <> -1: uri += "/"+str(WayVersion) -        data = self._get(uri) -        if not data: return data -        data = xml.dom.minidom.parseString(data) -        data = data.getElementsByTagName("osm")[0].getElementsByTagName("way")[0] -        return self._DomParseWay(data) -     -    def WayCreate(self, WayData): -        """ Creates a way. Returns updated WayData (without timestamp). """ -        return self._do("create", "way", WayData) - -    def WayUpdate(self, WayData): -        """ Updates way with WayData. Returns updated WayData (without timestamp). """ -        return self._do("modify", "way", WayData) - -    def WayDelete(self, WayData): -        """ Delete way with WayData. Returns updated WayData (without timestamp). """ -        return self._do("delete", "way", WayData) - -    def WayHistory(self, WayId): -        """ Returns dict(WayVerrsion: WayData). """ -        uri = "/api/0.6/way/"+str(WayId)+"/history" -        data = self._get(uri) -        data = xml.dom.minidom.parseString(data) -        result = {} -        for data in data.getElementsByTagName("osm")[0].getElementsByTagName("way"): -            data = self._DomParseWay(data) -            result[data[u"version"]] = data -        return result -     -    def WayRelations(self, WayId): -        """ Returns [RelationData, ...] containing way #WayId. """ -        uri = "/api/0.6/way/%d/relations"%WayId -        data = self._get(uri) -        data = xml.dom.minidom.parseString(data) -        result = [] -        for data in data.getElementsByTagName("osm")[0].getElementsByTagName("relation"): -            data = self._DomParseRelation(data) -            result.append(data) -        return result - -    def WayFull(self, WayId): -        """ Return full data for way WayId as list of {type: node|way|relation, data: {}}. """ -        uri = "/api/0.6/way/"+str(WayId)+"/full" -        data = self._get(uri) -        return self.ParseOsm(data) - -    def WaysGet(self, WayIdList): -        """ Returns dict(WayId: WayData) for each way in WayIdList """ -        uri = "/api/0.6/ways?ways=" + ",".join([str(x) for x in WayIdList]) -        data = self._get(uri) -        data = xml.dom.minidom.parseString(data) -        result = {} -        for data in data.getElementsByTagName("osm")[0].getElementsByTagName("way"): -            data = self._DomParseWay(data) -            result[data[u"id"]] = data -        return result - -    ####################################################################### -    # Relation                                                            # -    ####################################################################### - -    def RelationGet(self, RelationId, RelationVersion = -1): -        """ Returns RelationData for relation #RelationId. """ -        uri = "/api/0.6/relation/"+str(RelationId) -        if RelationVersion <> -1: uri += "/"+str(RelationVersion) -        data = self._get(uri) -        if not data: return data -        data = xml.dom.minidom.parseString(data) -        data = data.getElementsByTagName("osm")[0].getElementsByTagName("relation")[0] -        return self._DomParseRelation(data) - -    def RelationCreate(self, RelationData): -        """ Creates a relation. Returns updated RelationData (without timestamp). """ -        return self._do("create", "relation", RelationData) -     -    def RelationUpdate(self, RelationData): -        """ Updates relation with RelationData. Returns updated RelationData (without timestamp). """ -        return self._do("modify", "relation", RelationData) - -    def RelationDelete(self, RelationData): -        """ Delete relation with RelationData. Returns updated RelationData (without timestamp). """ -        return self._do("delete", "relation", RelationData) - -    def RelationHistory(self, RelationId): -        """ Returns dict(RelationVerrsion: RelationData). """ -        uri = "/api/0.6/relation/"+str(RelationId)+"/history" -        data = self._get(uri) -        data = xml.dom.minidom.parseString(data) -        result = {} -        for data in data.getElementsByTagName("osm")[0].getElementsByTagName("relation"): -            data = self._DomParseRelation(data) -            result[data[u"version"]] = data -        return result -     -    def RelationRelations(self, RelationId): -        """ Returns list of RelationData containing relation #RelationId. """ -        uri = "/api/0.6/relation/%d/relations"%RelationId -        data = self._get(uri) -        data = xml.dom.minidom.parseString(data) -        result = [] -        for data in data.getElementsByTagName("osm")[0].getElementsByTagName("relation"): -            data = self._DomParseRelation(data) -            result.append(data) -        return result - -    def RelationFullRecur(self, RelationId): -        """ Return full data for relation RelationId. Recurisve version relation of relations. """ -        data = [] -        todo = [RelationId] -        done = [] -        while todo: -            rid = todo.pop(0) -            done.append(rid) -            temp = self.RelationFull(rid) -            for item in temp: -                if item["type"] <> "relation": -                    continue -                if item["data"]["id"] in done: -                    continue -                todo.append(item["data"]["id"])             -            data += temp -        return data -     -    def RelationFull(self, RelationId): -        """ Return full data for relation RelationId as list of {type: node|way|relation, data: {}}. """ -        uri = "/api/0.6/relation/"+str(RelationId)+"/full" -        data = self._get(uri) -        return self.ParseOsm(data) - -    def RelationsGet(self, RelationIdList): -        """ Returns dict(RelationId: RelationData) for each relation in RelationIdList """ -        uri = "/api/0.6/relations?relations=" + ",".join([str(x) for x in RelationIdList]) -        data = self._get(uri) -        data = xml.dom.minidom.parseString(data) -        result = {} -        for data in data.getElementsByTagName("osm")[0].getElementsByTagName("relation"): -            data = self._DomParseRelation(data) -            result[data[u"id"]] = data             -        return result - -    ####################################################################### -    # Changeset                                                           # -    ####################################################################### - -    def ChangesetGet(self, ChangesetId): -        """ Returns ChangesetData for changeset #ChangesetId. """ -        data = self._get("/api/0.6/changeset/"+str(ChangesetId)) -        data = xml.dom.minidom.parseString(data) -        data = data.getElementsByTagName("osm")[0].getElementsByTagName("changeset")[0] -        return self._DomParseChangeset(data) -     -    def ChangesetUpdate(self, ChangesetTags = {}): -        """ Updates current changeset with ChangesetTags. """ -        if self._CurrentChangesetId == -1: -            raise Exception, "No changeset currently opened" -        if u"created_by" not in ChangesetTags: -            ChangesetTags[u"created_by"] = self._created_by -        result = self._put("/api/0.6/changeset/"+str(self._CurrentChangesetId), self._XmlBuild("changeset", {u"tag": ChangesetTags})) -        return self._CurrentChangesetId - -    def ChangesetCreate(self, ChangesetTags = {}): -        """ Opens a changeset. Returns #ChangesetId. """ -        if self._CurrentChangesetId: -            raise Exception, "Changeset alreadey opened" -        if u"created_by" not in ChangesetTags: -            ChangesetTags[u"created_by"] = self._created_by -        result = self._put("/api/0.6/changeset/create", self._XmlBuild("changeset", {u"tag": ChangesetTags})) -        self._CurrentChangesetId = int(result) -        return self._CurrentChangesetId -     -    def ChangesetClose(self): -        """ Closes current changeset. Returns #ChangesetId. """ -        if not self._CurrentChangesetId: -            raise Exception, "No changeset currently opened" -        result = self._put("/api/0.6/changeset/"+str(self._CurrentChangesetId)+"/close", u"") -        CurrentChangesetId = self._CurrentChangesetId -        self._CurrentChangesetId = 0 -        return CurrentChangesetId - -    def ChangesetUpload(self, ChangesData): -        """ Upload data. ChangesData is a list of dict {type: node|way|relation, action: create|delete|modify, data: {}}. Returns list with updated ids. """ -        data = "" -        data += u"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" -        data += u"<osmChange version=\"0.6\" generator=\"" + self._created_by + "\">\n" -        for change in ChangesData: -            data += u"<"+change["action"]+">\n" -            change["data"]["changeset"] = self._CurrentChangesetId -            data += self._XmlBuild(change["type"], change["data"], False).decode("utf-8") -            data += u"</"+change["action"]+">\n" -        data += u"</osmChange>" -        data = self._http("POST", "/api/0.6/changeset/"+str(self._CurrentChangesetId)+"/upload", True, data.encode("utf-8")) -        data = xml.dom.minidom.parseString(data) -        data = data.getElementsByTagName("diffResult")[0] -        data = [x for x in data.childNodes if x.nodeType == x.ELEMENT_NODE] -        for i in range(len(ChangesData)): -            if ChangesData[i]["action"] == "delete": -                ChangesData[i]["data"].pop("version") -            else: -                ChangesData[i]["data"]["version"] = int(data[i].getAttribute("new_id")) -        return ChangesData -         -    def ChangesetDownload(self, ChangesetId): -        """ Download data from a changeset. Returns list of dict {type: node|way|relation, action: create|delete|modify, data: {}}. """ -        uri = "/api/0.6/changeset/"+str(ChangesetId)+"/download" -        data = self._get(uri) -        return self.ParseOsc(data) -     -    def ChangesetsGet(self, min_lon=None, min_lat=None, max_lon=None, max_lat=None, -                      userid=None, username=None, -                      closed_after=None, created_before=None, -                      only_open=False, only_closed=False): -        """ Returns dict(ChangsetId: ChangesetData) matching all criteria. """ -         -        uri = "/api/0.6/changesets" -        params = {} -        if min_lon or min_lat or max_lon or max_lat: -            params["bbox"] = ",".join([str(min_lon),str(min_lat),str(max_lon),str(max_lat)]) -        if userid: -            params["user"] = userid -        if username: -            params["display_name"] = username -        if closed_after and not created_before: -            params["time"] = closed_after -        if created_before: -            if not closed_after: -                closed_after = "1970-01-01T00:00:00Z" -            params["time"] = closed_after + "," + created_before -        if only_open: -            params["open"] = 1 -        if only_closed: -            params["closed"] = 1 -             -        if params: -            uri += "?" + urllib.urlencode(params) -                 -        data = self._get(uri) -        data = xml.dom.minidom.parseString(data) -        data = data.getElementsByTagName("osm")[0].getElementsByTagName("changeset") -        result = {} -        for curChangeset in data: -            tmpCS = self._DomParseChangeset(curChangeset) -            result[tmpCS["id"]] = tmpCS -        return result -     -    ####################################################################### -    # Other                                                               # -    ####################################################################### - -    def Map(self, min_lon, min_lat, max_lon, max_lat): -        """ Download data in bounding box. Returns list of dict {type: node|way|relation, data: {}}. """ -        uri = "/api/0.6/map?bbox=%f,%f,%f,%f"%(min_lon, min_lat, max_lon, max_lat) -        data = self._get(uri) -        return self.ParseOsm(data) - -    ####################################################################### -    # Data parser                                                         # -    ####################################################################### -     -    def ParseOsm(self, data): -        """ Parse osm data. Returns list of dict {type: node|way|relation, data: {}}. """ -        data = xml.dom.minidom.parseString(data) -        data = data.getElementsByTagName("osm")[0] -        result = [] -        for elem in data.childNodes: -            if elem.nodeName == u"node": -                result.append({u"type": elem.nodeName, u"data": self._DomParseNode(elem)}) -            elif elem.nodeName == u"way": -                result.append({u"type": elem.nodeName, u"data": self._DomParseWay(elem)})                         -            elif elem.nodeName == u"relation": -                result.append({u"type": elem.nodeName, u"data": self._DomParseRelation(elem)}) -        return result     - -    def ParseOsc(self, data): -        """ Parse osc data. Returns list of dict {type: node|way|relation, action: create|delete|modify, data: {}}. """ -        data = xml.dom.minidom.parseString(data) -        data = data.getElementsByTagName("osmChange")[0] -        result = [] -        for action in data.childNodes: -            if action.nodeName == u"#text": continue -            for elem in action.childNodes: -                if elem.nodeName == u"node": -                    result.append({u"action":action.nodeName, u"type": elem.nodeName, u"data": self._DomParseNode(elem)}) -                elif elem.nodeName == u"way": -                    result.append({u"action":action.nodeName, u"type": elem.nodeName, u"data": self._DomParseWay(elem)})                         -                elif elem.nodeName == u"relation": -                    result.append({u"action":action.nodeName, u"type": elem.nodeName, u"data": self._DomParseRelation(elem)}) -        return result - -    ####################################################################### -    # Internal http function                                              # -    ####################################################################### - -    def _do(self, action, OsmType, OsmData): -        if self._changesetauto: -            self._changesetautodata.append({"action":action, "type":OsmType, "data":OsmData}) -            self._changesetautoflush() -            return None -        else: -            return self._do_manu(action, OsmType, OsmData) -             -    def _do_manu(self, action, OsmType, OsmData):         -        if not self._CurrentChangesetId: -            raise Exception, "You need to open a changeset before uploading data" -        if u"timestamp" in OsmData: -            OsmData.pop(u"timestamp") -        OsmData[u"changeset"] = self._CurrentChangesetId -        if action == "create": -            if OsmData.get(u"id", -1) > 0: -                raise Exception, "This "+OsmType+" already exists" -            result = self._put("/api/0.6/"+OsmType+"/create", self._XmlBuild(OsmType, OsmData)) -            OsmData[u"id"] = int(result.strip()) -            OsmData[u"version"] = 1 -            return OsmData -        elif action == "modify": -            result = self._put("/api/0.6/"+OsmType+"/"+str(OsmData[u"id"]), self._XmlBuild(OsmType, OsmData)) -            OsmData[u"version"] = int(result.strip()) -            return OsmData -        elif action =="delete": -            result = self._delete("/api/0.6/"+OsmType+"/"+str(OsmData[u"id"]), self._XmlBuild(OsmType, OsmData)) -            OsmData[u"version"] = int(result.strip()) -            OsmData[u"visible"] = False -            return OsmData -     -    def flush(self): -        return self._changesetautoflush(True) -         -    def _changesetautoflush(self, force = False): -        while (len(self._changesetautodata) >= self._changesetautosize) or (force and self._changesetautodata): -            if self._changesetautocpt == 0: -                self.ChangesetCreate(self._changesetautotags) -            self.ChangesetUpload(self._changesetautodata[:self._changesetautosize]) -            self._changesetautodata = self._changesetautodata[self._changesetautosize:] -            self._changesetautocpt += 1 -            if self._changesetautocpt == self._changesetautomulti: -                self.ChangesetClose() -                self._changesetautocpt = 0 -        if self._changesetautocpt and force: -            self.ChangesetClose() -            self._changesetautocpt = 0 -        return None -         -    def _http_request(self, cmd, path, auth, send): -        if self._debug: -            path2 = path -            if len(path2) > 50: -                path2 = path2[:50]+"[...]" -            print >>sys.stderr, "%s %s %s"%(time.strftime("%Y-%m-%d %H:%M:%S"),cmd,path2) -        self._conn.putrequest(cmd, path) -        self._conn.putheader('User-Agent', self._created_by) -        if auth: -            self._conn.putheader('Authorization', 'Basic ' + base64.encodestring(self._username + ':' + self._password).strip()) -        if send <> None: -            self._conn.putheader('Content-Length', len(send)) -        self._conn.endheaders() -        if send: -            self._conn.send(send) -        response = self._conn.getresponse() -        if response.status <> 200: -            payload = response.read().strip() -            if response.status == 410: -                return None -            raise ApiError(response.status, response.reason, payload) -        if self._debug: -            print >>sys.stderr, "%s %s %s done"%(time.strftime("%Y-%m-%d %H:%M:%S"),cmd,path2) -        return response.read() -     -    def _http(self, cmd, path, auth, send): -        i = 0 -        while True: -            i += 1 -            try: -                return self._http_request(cmd, path, auth, send) -            except ApiError, e: -                if e.status >= 500: -                    if i == 5: raise -                    if i <> 1: time.sleep(5) -                    self._conn = httplib.HTTPConnection(self._api, 80) -                else: raise -            except Exception: -                if i == 5: raise -                if i <> 1: time.sleep(5) -                self._conn = httplib.HTTPConnection(self._api, 80) -     -    def _get(self, path): -        return self._http('GET', path, False, None) - -    def _put(self, path, data): -        return self._http('PUT', path, True, data) -     -    def _delete(self, path, data): -        return self._http('DELETE', path, True, data) -     -    ####################################################################### -    # Internal dom function                                               # -    ####################################################################### -     -    def _DomGetAttributes(self, DomElement): -        """ Returns a formated dictionnary of attributes of a DomElement. """ -        result = {} -        for k, v in DomElement.attributes.items(): -            if k == u"uid"         : v = int(v) -            elif k == u"changeset" : v = int(v) -            elif k == u"version"   : v = int(v) -            elif k == u"id"        : v = int(v) -            elif k == u"lat"       : v = float(v) -            elif k == u"lon"       : v = float(v) -            elif k == u"open"      : v = v=="true" -            elif k == u"visible"   : v = v=="true" -            elif k == u"ref"       : v = int(v) -            result[k] = v -        return result             -         -    def _DomGetTag(self, DomElement): -        """ Returns the dictionnary of tags of a DomElement. """ -        result = {} -        for t in DomElement.getElementsByTagName("tag"): -            k = t.attributes["k"].value -            v = t.attributes["v"].value -            result[k] = v -        return result - -    def _DomGetNd(self, DomElement): -        """ Returns the list of nodes of a DomElement. """ -        result = [] -        for t in DomElement.getElementsByTagName("nd"): -            result.append(int(int(t.attributes["ref"].value))) -        return result             - -    def _DomGetMember(self, DomElement): -        """ Returns a list of relation members. """ -        result = [] -        for m in DomElement.getElementsByTagName("member"): -            result.append(self._DomGetAttributes(m)) -        return result - -    def _DomParseNode(self, DomElement): -        """ Returns NodeData for the node. """ -        result = self._DomGetAttributes(DomElement) -        result[u"tag"] = self._DomGetTag(DomElement) -        return result - -    def _DomParseWay(self, DomElement): -        """ Returns WayData for the way. """ -        result = self._DomGetAttributes(DomElement) -        result[u"tag"] = self._DomGetTag(DomElement) -        result[u"nd"]  = self._DomGetNd(DomElement)         -        return result -     -    def _DomParseRelation(self, DomElement): -        """ Returns RelationData for the relation. """ -        result = self._DomGetAttributes(DomElement) -        result[u"tag"]    = self._DomGetTag(DomElement) -        result[u"member"] = self._DomGetMember(DomElement) -        return result - -    def _DomParseChangeset(self, DomElement): -        """ Returns ChangesetData for the changeset. """ -        result = self._DomGetAttributes(DomElement) -        result[u"tag"] = self._DomGetTag(DomElement) -        return result - -    ####################################################################### -    # Internal xml builder                                                # -    ####################################################################### - -    def _XmlBuild(self, ElementType, ElementData, WithHeaders = True): - -        xml  = u"" -        if WithHeaders: -            xml += u"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" -            xml += u"<osm version=\"0.6\" generator=\"" + self._created_by + "\">\n" - -        # <element attr="val"> -        xml += u"  <" + ElementType -        if u"id" in ElementData: -            xml += u" id=\"" + str(ElementData[u"id"]) + u"\""         -        if u"lat" in ElementData: -            xml += u" lat=\"" + str(ElementData[u"lat"]) + u"\""         -        if u"lon" in ElementData: -            xml += u" lon=\"" + str(ElementData[u"lon"]) + u"\"" -        if u"version" in ElementData: -            xml += u" version=\"" + str(ElementData[u"version"]) + u"\"" -        xml += u" visible=\"" + str(ElementData.get(u"visible", True)).lower() + u"\"" -        if ElementType in [u"node", u"way", u"relation"]: -            xml += u" changeset=\"" + str(self._CurrentChangesetId) + u"\"" -        xml += u">\n" - -        # <tag... /> -        for k, v in ElementData.get(u"tag", {}).items(): -            xml += u"    <tag k=\""+self._XmlEncode(k)+u"\" v=\""+self._XmlEncode(v)+u"\"/>\n" - -        # <member... /> -        for member in ElementData.get(u"member", []): -            xml += u"    <member type=\""+member[u"type"]+"\" ref=\""+str(member[u"ref"])+u"\" role=\""+self._XmlEncode(member[u"role"])+"\"/>\n" - -        # <nd... /> -        for ref in ElementData.get(u"nd", []): -            xml += u"    <nd ref=\""+str(ref)+u"\"/>\n" - -        # </element> -        xml += u"  </" + ElementType + u">\n" -         -        if WithHeaders: -            xml += u"</osm>\n" - -        return xml.encode("utf8") - -    def _XmlEncode(self, text): -        return text.replace("&", "&").replace("\"", """).replace("<","<").replace(">",">") - -## End of main class                                                     ## -########################################################################### | 
