def __init__(self, input_json): self.travel_mode = input_json['travel_mode'] if self.travel_mode == self.MODE_TRANSIT: data = input_json['transit_details'] self.departure_stop = data['departure_stop']['name'] self.departure_time = datetime.fromtimestamp(data['departure_time']['value']) self.arrival_stop = data['arrival_stop']['name'] self.arrival_time = datetime.fromtimestamp(data['arrival_time']['value']) self.headsign = data['headsign'] # sometimes short_name not present if not 'short_name' in data['line']: self.line_name = data['line']['name'] else: self.line_name = data['line']['short_name'] vehicle_type = data['line']['vehicle'].get('type', data['line']['vehicle']['name']) self.vehicle = self.VEHICLE_TYPE_MAPPING.get(vehicle_type, vehicle_type.lower()) # normalize stop names self.departure_stop = expand_stop(self.departure_stop) self.arrival_stop = expand_stop(self.arrival_stop) self.num_stops = data['num_stops'] elif self.travel_mode == self.MODE_WALKING: self.duration = input_json['duration']['value'] self.distance = input_json['distance']['value']
def get_directions(self, waypoints, departure_time=None, arrival_time=None): """Get Google maps transit directions between the given stops at the given time and date. The time/date should be given as a datetime.datetime object. Setting the correct date is compulsory! """ # TODO: refactor - eliminate from_stop,street,city,borough and make from_place, from_area and use it as: # TODO: from_place = from_stop || from_street1 || from_street1&from_street2 # TODO: from_area = from_borough || from_city parameters = list() if not waypoints.from_stop_geo: from_waypoints =[expand_stop(waypoints.from_stop, False), expand_stop(waypoints.from_city, False)] parameters.extend([wp for wp in from_waypoints if wp and wp != 'none']) else: parameters.append(waypoints.from_stop_geo['lat']) parameters.append(waypoints.from_stop_geo['lon']) origin = ','.join(parameters).encode('utf-8') parameters = list() if not waypoints.to_stop_geo: to_waypoints = [expand_stop(waypoints.to_stop, False), expand_stop(waypoints.to_city, False)] parameters.extend([wp for wp in to_waypoints if wp and wp != 'none']) else: parameters.append(waypoints.to_stop_geo['lat']) parameters.append(waypoints.to_stop_geo['lon']) destination = ','.join(parameters).encode('utf-8') data = { 'origin': origin, 'destination': destination, 'region': 'us', 'alternatives': 'true', 'mode': 'transit', 'language': 'en', } if departure_time: data['departure_time'] = int(time.mktime(departure_time.timetuple())) elif arrival_time: data['arrival_time'] = int(time.mktime(arrival_time.timetuple())) # add "premium" parameters if self.api_key: data['key'] = self.api_key if waypoints.vehicle: data['transit_mode'] = self.map_vehicle(waypoints.vehicle) data['transit_routing_preference'] = 'fewer_transfers' if waypoints.max_transfers else 'less_walking' self.system_logger.info("Google Directions request:\n" + str(data)) page = urllib.urlopen(self.directions_url + '?' + urllib.urlencode(data)) response = json.load(page) self._log_response_json(response) directions = GoogleDirections(input_json=response, travel=waypoints) self.system_logger.info("Google Directions response:\n" + unicode(directions)) return directions