Refactor stop page
[busui.git] / include / db / trip-dao.inc.php
blob:a/include/db/trip-dao.inc.php -> blob:b/include/db/trip-dao.inc.php
<?php <?php
function getTrip($tripID) { function getTrip($tripID) {
/* def handle_json_GET_triprows(self, params): global $conn;
"""Return a list of rows from the feed file that are related to this $query = "Select * from trips where trip_id = '$tripID' join routes on trips.route_id = routes.route_id LIMIT 1";
trip.""" debug($query,"database");
schedule = self.server.schedule $result = pg_query($conn, $query);
try: if (!$result) {
trip = schedule.GetTrip(params.get('trip', None)) databaseError(pg_result_error($result));
except KeyError: return Array();
# if a non-existent trip is searched for, the return nothing }
return return pg_fetch_assoc($result);
route = schedule.GetRoute(trip.route_id) }
trip_row = dict(trip.iteritems())  
route_row = dict(route.iteritems())  
return [['trips.txt', trip_row], ['routes.txt', route_row]]  
*/  
}  
function getTripShape() { function getTripShape() {
/* def handle_json_GET_tripstoptimes(self, params): /* def handle_json_GET_tripstoptimes(self, params):
schedule = self.server.schedule schedule = self.server.schedule
try: try:
trip = schedule.GetTrip(params.get('trip')) trip = schedule.GetTrip(params.get('trip'))
except KeyError: except KeyError:
# if a non-existent trip is searched for, the return nothing # if a non-existent trip is searched for, the return nothing
return return
time_stops = trip.GetTimeInterpolatedStops() time_stops = trip.GetTimeInterpolatedStops()
stops = [] stops = []
times = [] times = []
for arr,ts,is_timingpoint in time_stops: for arr,ts,is_timingpoint in time_stops:
stops.append(StopToTuple(ts.stop)) stops.append(StopToTuple(ts.stop))
times.append(arr) times.append(arr)
return [stops, times] return [stops, times]
   
def handle_json_GET_tripshape(self, params): def handle_json_GET_tripshape(self, params):
schedule = self.server.schedule schedule = self.server.schedule
try: try:
trip = schedule.GetTrip(params.get('trip')) trip = schedule.GetTrip(params.get('trip'))
except KeyError: except KeyError:
# if a non-existent trip is searched for, the return nothing # if a non-existent trip is searched for, the return nothing
return return
points = [] points = []
if trip.shape_id: if trip.shape_id:
shape = schedule.GetShape(trip.shape_id) shape = schedule.GetShape(trip.shape_id)
for (lat, lon, dist) in shape.points: for (lat, lon, dist) in shape.points:
points.append((lat, lon)) points.append((lat, lon))
else: else:
time_stops = trip.GetTimeStops() time_stops = trip.GetTimeStops()
for arr,dep,stop in time_stops: for arr,dep,stop in time_stops:
points.append((stop.stop_lat, stop.stop_lon)) points.append((stop.stop_lat, stop.stop_lon))
return points*/ return points*/
} }
function tripStopTimes($tripID, $after_time, $limit) { function getTimeInterpolatedTrip($tripID) {
/* rv = [] /* rv = []
   
stoptimes = self.GetStopTimes() stoptimes = self.GetStopTimes()
# If there are no stoptimes [] is the correct return value but if the start # If there are no stoptimes [] is the correct return value but if the start
# or end are missing times there is no correct return value. # or end are missing times there is no correct return value.
if not stoptimes: if not stoptimes:
return [] return []
if (stoptimes[0].GetTimeSecs() is None or if (stoptimes[0].GetTimeSecs() is None or
stoptimes[-1].GetTimeSecs() is None): stoptimes[-1].GetTimeSecs() is None):
raise ValueError("%s must have time at first and last stop" % (self)) raise ValueError("%s must have time at first and last stop" % (self))
   
cur_timepoint = None cur_timepoint = None
next_timepoint = None next_timepoint = None
distance_between_timepoints = 0 distance_between_timepoints = 0
distance_traveled_between_timepoints = 0 distance_traveled_between_timepoints = 0
   
for i, st in enumerate(stoptimes): for i, st in enumerate(stoptimes):
if st.GetTimeSecs() != None: if st.GetTimeSecs() != None:
cur_timepoint = st cur_timepoint = st
distance_between_timepoints = 0 distance_between_timepoints = 0
distance_traveled_between_timepoints = 0 distance_traveled_between_timepoints = 0
if i + 1 < len(stoptimes): if i + 1 < len(stoptimes):
k = i + 1 k = i + 1
distance_between_timepoints += util.ApproximateDistanceBetweenStops(stoptimes[k-1].stop, stoptimes[k].stop) distance_between_timepoints += util.ApproximateDistanceBetweenStops(stoptimes[k-1].stop, stoptimes[k].stop)
while stoptimes[k].GetTimeSecs() == None: while stoptimes[k].GetTimeSecs() == None:
k += 1 k += 1
distance_between_timepoints += util.ApproximateDistanceBetweenStops(stoptimes[k-1].stop, stoptimes[k].stop) distance_between_timepoints += util.ApproximateDistanceBetweenStops(stoptimes[k-1].stop, stoptimes[k].stop)
next_timepoint = stoptimes[k] next_timepoint = stoptimes[k]
rv.append( (st.GetTimeSecs(), st, True) ) rv.append( (st.GetTimeSecs(), st, True) )
else: else:
distance_traveled_between_timepoints += util.ApproximateDistanceBetweenStops(stoptimes[i-1].stop, st.stop) distance_traveled_between_timepoints += util.ApproximateDistanceBetweenStops(stoptimes[i-1].stop, st.stop)
distance_percent = distance_traveled_between_timepoints / distance_between_timepoints distance_percent = distance_traveled_between_timepoints / distance_between_timepoints
total_time = next_timepoint.GetTimeSecs() - cur_timepoint.GetTimeSecs() total_time = next_timepoint.GetTimeSecs() - cur_timepoint.GetTimeSecs()
time_estimate = distance_percent * total_time + cur_timepoint.GetTimeSecs() time_estimate = distance_percent * total_time + cur_timepoint.GetTimeSecs()
rv.append( (int(round(time_estimate)), st, False) ) rv.append( (int(round(time_estimate)), st, False) )
   
return rv*/ return rv*/
} }
  function getTimeInterpolatedTripAtStop($trip_id, $stop_sequence) {
  foreach(getTimeInterpolatedTrip($tripID) as $tripStop) {
  if ($tripStop['stop_sequence'] == $stop_sequence) return $tripStop;
  }
  return Array();
  }
   
function tripStartTime($tripID) { function getTripStartTime($tripID) {
$query = 'SELECT arrival_secs,departure_secs FROM stop_times WHERE trip_id=? ORDER BY stop_sequence LIMIT 1'; $query = 'SELECT arrival_secs,departure_secs FROM stop_times WHERE trip_id=? ORDER BY stop_sequence LIMIT 1';
} }
   
function viaPoints($tripid, $stopid, $timingPointsOnly = false)  
{  
global $APIurl;  
$url = $APIurl . "/json/tripstoptimes?trip=" . $tripid;  
$json = json_decode(getPage($url));  
debug(print_r($json, true));  
$stops = $json[0];  
$times = $json[1];  
$foundStop = false;  
$viaPoints = Array();  
foreach ($stops as $key => $row) {  
if ($foundStop) {  
if (!$timingPointsOnly || !startsWith($row[5], "Wj")) {  
$viaPoints[] = Array(  
"id" => $row[0],  
"name" => $row[1],  
"time" => $times[$key]  
);  
}  
}  
else {  
if ($row[0] == $stopid) $foundStop = true;  
}  
}  
return $viaPoints;  
}  
function viaPointNames($tripid, $stopid) function viaPointNames($tripid, $stopid)
{ {
$points = viaPoints($tripid, $stopid, true); global $conn;
$pointNames = Array(); $query = "SELECT stop_name
foreach ($points as $point) { FROM stop_times join stops on stops.stop_id = stop_times.stop_id
$pointNames[] = $point['name']; WHERE stop_times.trip_id = '$tripid'
  AND stop_sequence > '$stop_sequence'
  AND substr(stop_code,1,2) != 'Wj' ORDER BY stop_sequence";
  debug($query,"database");
  $result = pg_query($conn, $query);
  if (!$result) {
  databaseError(pg_result_error($result));
  return Array();
} }
return implode(", ", $pointNames); $pointNames = pg_fetch_all($result);
  return r_implode(", ", $pointNames);
} }
?> ?>