Ticket #2440: fivetosix.py

File fivetosix.py, 1.9 KB (added by DwiSecundus, 15 years ago)

Python script that gets the node/way/relation version number from OSM and inserts it into the OSM file.

Line 
1#!/usr/bin/python
2
3from xml.dom import minidom
4import sys
5import urllib
6import codecs
7
8API_URL = "http://api.openstreetmap.org/api/0.6"
9
10def get_osm_version(elementName, id):
11 # this is inefficient because it makes an API call for every element
12 urlstr = API_URL + "/" + elementName + "/" + id
13 url = urllib.urlopen(urlstr)
14 xmlString = url.read()
15 parsed = minidom.parseString(xmlString)
16 element = parsed.getElementsByTagName(elementName)[0]
17 return element.attributes["version"].value
18
19def fivetosix(filename):
20 osmFile = minidom.parse(filename)
21 osmElement = osmFile.firstChild;
22 versionAttribute = osmElement.attributes["version"]
23 versionValue = versionAttribute.value
24 if versionValue != u"0.5":
25 raise Exception, "Only OSM files of version 0.5 supported! " + \
26 "Yours is " + versionValue + "."
27
28 versionAttribute.value = u"0.6"
29
30 # get all nodes, ways and relations from file
31 elements = osmFile.getElementsByTagName("node")
32 elements.extend(osmFile.getElementsByTagName("way"))
33 elements.extend(osmFile.getElementsByTagName("relation"))
34
35 # for all elements with non-negative id get version number from API
36 count = 0
37 for element in elements:
38 type = element.nodeName
39 id = element.attributes["id"].value
40
41 count += 1
42 print "Element", count, "of", elements.length, "(" + type, id + ")"
43
44 if int(id) < 0 or element.hasAttribute("version"):
45 continue
46
47 version = get_osm_version(type, id)
48 element.attributes["version"] = version
49
50 outfilename = filename.replace(".osm", "-6.osm")
51 print "Writing to", outfilename + "..."
52
53 enc = "UTF-8"
54 outfile = codecs.open(outfilename, "w", enc)
55 osmFile.writexml(outfile, encoding=enc)
56
57def main():
58 for filename in sys.argv[1:]:
59 fivetosix(filename)
60
61if __name__ == "__main__":
62 sys.exit(main())