From 39c2ed076f861774816d3613ac29d532828fb19b Mon Sep 17 00:00:00 2001 From: Sanj Date: Sat, 25 Feb 2012 00:19:10 +0530 Subject: [PATCH] added csv2kml.py --- indianrails/trains/csv2kml.py | 112 ++++++++++++++++++++++++++++++++++ indianrails/trains/imports.py | 2 +- 2 files changed, 113 insertions(+), 1 deletion(-) create mode 100644 indianrails/trains/csv2kml.py diff --git a/indianrails/trains/csv2kml.py b/indianrails/trains/csv2kml.py new file mode 100644 index 0000000..77e44c2 --- /dev/null +++ b/indianrails/trains/csv2kml.py @@ -0,0 +1,112 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +import csv +import urllib +import urllib2 +import json +import os +import time +import sqlite3 +try: + import xml.etree.ElementTree as ET +except: + import elementtree.ElementTree as ET + + +def geo_lookup(address): + path = os.path.expanduser('~/.ox') + if not os.path.exists(path): + os.makedirs(path) + path = os.path.join(path, 'geo.sqlite') + + conn = sqlite3.connect(path, timeout=10) + conn.text_factory = str + + c = conn.cursor() + c.execute('''CREATE TABLE IF NOT EXISTS geo (query varchar(1024) unique, result text)''') + conn.commit() + + c.execute('SELECT result FROM geo WHERE query = ?', (address, )) + for row in c: + return json.loads(row[0]) + + url = 'http://maps.google.com/maps/geo?q=%s&output=json&sensor=false'%urllib.quote(address.encode('utf8')) + + #print url + u = urllib2.urlopen(url) + data = json.load(u) + u.close() + if data[u'Status'][u'code'] == 620: + print "to fast" + print data + c.execute(u"INSERT OR REPLACE INTO geo VALUES (?, ?)", (address, json.dumps(data))) + conn.commit() + c.close() + conn.close() + time.sleep(0.3) + return data + +def get_coordinates(address): + return geo_lookup(address).get("Placemark", [{}])[0].get("Point", {}).get("coordinates") + +def save_kml(addresses, filename): + kml = ET.Element('kml') + kml.attrib['xmlns'] = 'http://www.opengis.net/kml/2.2' + d = ET.SubElement(kml, "Document") + name = ET.SubElement(d, "name") + name.text = os.path.splitext(filename)[0] + for data in addresses: + address = '' #FIXME FORMAT csv data here + info = '' #FIXME FORMAT data to be display in kml + c = get_coordinates(address) + if c: + place = ET.SubElement(d, "Placemark") + name = ET.SubElement(place, "name") + name.text = person + description = ET.SubElement(place, "description") + description.text = info + point = ET.SubElement(place, "Point") + coordinates = ET.SubElement(point, "coordinates") + coordinates.text = ', '.join(map(str, c)) + else: + print address, "failed" + f = open(filename, "w") + data = ''+ET.tostring(kml) + f.write(data.encode('utf-8')) + f.close() + +def load_csv(filename): + reader = csv.reader(open(filename, 'rb')) + keys = [] + data = [] + for row in reader: + if not keys: + keys = row + else: + r = {} + i = 0 + for i in range(0, len(row)): + r[keys[i].decode('utf-8')] = row[i].decode('utf-8') + data.append(r) + return data + +if __name__ == '__main__': + from optparse import OptionParser + import sys + + usage = "Usage: %prog [options] csv [kml]" + parser = OptionParser(usage=usage) + (opts, args) = parser.parse_args() + + if len(args) < 1: + parser.print_help() + sys.exit(-1) + + csvf = args[0] + if len(args) == 2: + kml = args[1] + else: + kml = "%s.kml" % os.path.splitext(csvf)[0] + addresses = load_csv(csvf) + save_kml(addresses, kml) + diff --git a/indianrails/trains/imports.py b/indianrails/trains/imports.py index 5270f05..5954705 100644 --- a/indianrails/trains/imports.py +++ b/indianrails/trains/imports.py @@ -250,7 +250,7 @@ def import_schedule(): def geolocate_stations(): errors = [] - for s in Station.objects.filter(point=None)[0:10]: + for s in Station.objects.filter(point=None)[0:1000]: coords = csv2kml.get_coordinates(s.address) if coords is not None: pt = Point(coords[0], coords[1])