| 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())
|
|---|