Ejemplo n.º 1
0
    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']
Ejemplo n.º 2
0
    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