Skip to content

Instantly share code, notes, and snippets.

@iandees
Created March 2, 2011 21:26
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save iandees/e18eb853907a73ff96e8 to your computer and use it in GitHub Desktop.
Save iandees/e18eb853907a73ff96e8 to your computer and use it in GitHub Desktop.
A simple python script to convert MapQuest's critical address file to OSM format. See http://wiki.openstreetmap.org/wiki/MapQuest/Critical_Addresses
#!/usr/bin/python
from csv import DictReader
from xml.sax.saxutils import escape
import sys
reader = DictReader(open(sys.argv[1], 'rU'))
def writeNode(out, node):
out.write('<node id="%d" lat="%f" lon="%f">\n' % (node['id'], node['lat'], node['lon']))
for (key, value) in node['tags'].items():
if len(value) > 0:
out.write(' <tag k="%s" v="%s" />\n' % (escape(key), escape(value)))
out.write('</node>\n')
def writeNodes(filename, nodes):
f = open(filename, 'w')
f.write('<osm version="0.6" generator="caf2osm v0.1">\n')
id = -1
for node in nodes:
writeNode(f, node)
f.write('</osm>\n')
# Read in nodes from CSV
nodes = []
id = -1
for row in reader:
tags = {}
tags['addr:country'] = row['Country']
if row['Country'] in ('US', 'CA'):
tags['addr:state'] = row['State'].upper()
else:
tags['addr:state'] = row['State']
tags['addr:city'] = row['City']
tags['addr:full'] = row['Address']
housenumber = row['Address Range Start']
street = row['Address']
if street.startswith(housenumber):
tags['addr:street'] = street[len(housenumber):].strip()
elif street.endswith(housenumber):
tags['addr:street'] = street[:-len(housenumber)].strip()
else:
tags['addr:street'] = street
tags['addr:housenumber'] = housenumber
lat = float(row['Latitude']) / 1000000
lon = float(row['Longitude']) / 1000000
node = {'tags': tags,
'lat': lat,
'lon': lon,
'id': id}
nodes.append(node)
id = id - 1
sortedlist = sorted(nodes, key=lambda elem: "%s %s" % (elem['tags']['addr:state'], elem['tags']['addr:city']))
filenum = 0
tnodes = []
for node in sortedlist:
tnodes.append(node)
if len(tnodes) > 99:
writeNodes("caf-%03d.osm" % (filenum), tnodes)
tnodes = []
filenum = filenum + 1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment