1 | #!/usr/bin/python
|
---|
2 |
|
---|
3 | from xml.dom import minidom
|
---|
4 | import sys
|
---|
5 | import urllib
|
---|
6 | import codecs
|
---|
7 |
|
---|
8 | API_URL = "http://api.openstreetmap.org/api/0.6"
|
---|
9 |
|
---|
10 | def 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 |
|
---|
19 | def 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 |
|
---|
57 | def main():
|
---|
58 | for filename in sys.argv[1:]:
|
---|
59 | fivetosix(filename)
|
---|
60 |
|
---|
61 | if __name__ == "__main__":
|
---|
62 | sys.exit(main())
|
---|