-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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