import json import logging import os import site import sys from pylons import request, response, session, tmpl_context as c from pylons.controllers.util import abort, redirect_to from maps.lib.base import BaseController, render # Ugh. project_root = os.path.dirname(os.path.abspath(__file__)) + '/../../../..' site.addsitedir(project_root + '/src') import KML log = logging.getLogger(__name__) class DirectionsController(BaseController): # Google geocodes the start and end coordinates # automatically. There's no other way to pass the "name" of a # leg back to the server, so we have to rely on the geocoded # names for identification. def get_leg_address(self, leg, start=True): location_string = "start" if not start: # There are only two named properties, one for # start_geocode and one for end_geocode. location_string = "end" # Get the GeocoderResponse object. gr = leg[location_string + '_geocode'] try: return gr['formatted_address'] except: return 'Unknown' def directions_result_to_placemarks(self, result): placemarks = [] route_idx = 0 for route in result['routes']: route_idx += 1 for leg in route['legs']: p = KML.Placemark() leg_start = self.get_leg_address(leg, True) leg_end = self.get_leg_address(leg, False) leg_name = leg_start + " to " + leg_end leg_name += ' (' + str(route_idx) + ')' name_element = KML.Name(leg_name) p.children.append(name_element) ls = KML.LineString() coords = KML.Coordinates() for step in leg['steps']: for coord in step['lat_lngs']: coords.text += str(coord.values()[0]) coords.text += ',' coords.text += str(coord.values()[1]) coords.text += ',0 ' ls.children.append(coords) p.children.append(ls) placemarks.append(p) return placemarks def json_to_kml(self): directions_array = json.loads(request.POST['data']) placemarks = [] for result in directions_array: placemarks += self.directions_result_to_placemarks(result) doc = KML.Document() for p in placemarks: doc.children.append(p) response.content_type = 'application/vnd.google-earth.kml+xml' response.headers['Content-disposition'] = 'attachment; filename=routes.kml' return doc.to_kml() def directions_result_to_csv(self, result): rows = [] for route in result['routes']: for leg in route['legs']: leg_start = self.get_leg_address(route, True) leg_end = self.get_leg_address(route, False) row = '"' + leg_start + '"' row += ', ' row += '"' + leg_end + '"' row += ', ' row += str(float(leg['distance']['value']) / 1000) rows.append(row) return rows def distances(self): directions_array = json.loads(request.POST['data']) csv_rows = [] for result in directions_array: csv_rows += self.directions_result_to_csv(result) response.content_type = 'text/csv' response.headers['Content-disposition'] = 'attachment; filename=distances.csv' return "\n".join(csv_rows)