From: maxious Date: Mon, 28 Feb 2011 13:08:07 +0000 Subject: Refine stop trips with timing to improve performance X-Git-Url: http://maxious.lambdacomplex.org/git/?p=busui.git&a=commitdiff&h=c365bde928d526f78a543d79a4e183d17d2da257 --- Refine stop trips with timing to improve performance --- --- a/feedback.php +++ b/feedback.php @@ -31,18 +31,22 @@

Add/Move/Delete a Bus Stop Location

StopID: or StopCode: + if you click on feedback from a stop page, these will get filled in automatically. else describe the location/street of the stop Suggested Stop Location (lat/long or words): + if your device supports javascript, you can pick a location from the map above Submit!

Bug Report/Feedback

+Please leave feedback about bugs/errors or general suggestions about improvements that could be made to the way the data is presented! --- a/layar_api.php +++ b/layar_api.php @@ -26,7 +26,7 @@ $hotspot['distance'] = distance($row[2], $row[3], $_REQUEST['lat'], $_REQUEST['lon']); if (!isset($_REQUEST['radius']) || $hotspot['distance'] < $_REQUEST['radius']) { $hotspot['actions'] = Array(Array("label" => 'View more trips/information', 'uri' => 'http://bus.lambdacomplex.org/'.'stop.php?stopid='.$row[0])); - $url = $APIurl."/json/stoptrips?stop=".$row[0]."&time=".midnight_seconds()."&service_period=".service_period()."&limit=4"; + $url = $APIurl."/json/stoptrips?stop=".$row[0]."&time=".midnight_seconds()."&service_period=".service_period()."&limit=4&time_range=".str(90*60); $trips = json_decode(getPage($url)); debug(print_r($trips,true)); foreach ($trips as $key => $row) --- a/schedule_viewer.py +++ b/schedule_viewer.py @@ -421,23 +421,57 @@ if s.stop_id.lower() == query: return StopToTuple(s) return [] + + def handle_json_GET_stopalltrips(self, params): + """Given a stop_id return all trips to visit the stop.""" + schedule = self.server.schedule + stop = schedule.GetStop(params.get('stop', None)) + service_period = params.get('service_period', None) + time_trips = stop.GetStopTimeTrips(schedule) + result = [] + for time, (trip, index), tp in time_trips: + headsign = None + # Find the most recent headsign from the StopTime objects + for stoptime in trip.GetStopTimes()[index::-1]: + if stoptime.stop_headsign: + headsign = stoptime.stop_headsign + break + # If stop_headsign isn't found, look for a trip_headsign + if not headsign: + headsign = trip.trip_headsign + route = schedule.GetRoute(trip.route_id) + trip_name = '' + if route.route_short_name: + trip_name += route.route_short_name + if route.route_long_name: + if len(trip_name): + trip_name += " - " + trip_name += route.route_long_name + if service_period == None or trip.service_id == service_period: + result.append((time, (trip.trip_id, trip_name, trip.service_id), tp)) + return result def handle_json_GET_stoptrips(self, params): """Given a stop_id and time in seconds since midnight return the next trips to visit the stop.""" schedule = self.server.schedule stop = schedule.GetStop(params.get('stop', None)) - time = int(params.get('time', 0)) + requested_time = int(params.get('time', 0)) limit = int(params.get('limit', 15)) service_period = params.get('service_period', None) - time_trips = stop.GetStopTimeTrips(schedule) - time_trips.sort() # OPT: use bisect.insort to make this O(N*ln(N)) -> O(N) - # Keep the first 15 after param 'time'. - # Need make a tuple to find correct bisect point - time_trips = time_trips[bisect.bisect_left(time_trips, (time, 0)):] - time_trips = time_trips[:15] + time_range = params.get('time_range', 24*60*60) + + + filtered_time_trips = [] + for trip, index in stop._GetTripIndex(schedule): + tripstarttime = trip.GetStartTime() + if tripstarttime > requested_time and tripstarttime < (requested_time + time_range): + time, stoptime, tp = trip.GetTimeInterpolatedStops()[index] + if time > requested_time and time < (requested_time + time_range): + bisect.insort(filtered_time_trips, (time, (trip, index), tp)) + result = [] - for time, (trip, index), tp in time_trips: + for time, (trip, index), tp in filtered_time_trips: if len(result) > limit: break headsign = None