Refactor stop time interpolation
[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)
global $conn; {
$query = "Select * from trips where trip_id = '$tripID' join routes on trips.route_id = routes.route_id LIMIT 1"; global $conn;
debug($query,"database"); $query = "Select * from trips where trip_id = '$tripID' join routes on trips.route_id = routes.route_id LIMIT 1";
  debug($query, "database");
$result = pg_query($conn, $query); $result = pg_query($conn, $query);
if (!$result) { if (!$result) {
databaseError(pg_result_error($result)); databaseError(pg_result_error($result));
return Array(); return Array();
} }
return pg_fetch_assoc($result); return pg_fetch_assoc($result);
}  
function getTripShape() {  
/* def handle_json_GET_tripstoptimes(self, params):  
schedule = self.server.schedule  
try:  
trip = schedule.GetTrip(params.get('trip'))  
except KeyError:  
# if a non-existent trip is searched for, the return nothing  
return  
time_stops = trip.GetTimeInterpolatedStops()  
stops = []  
times = []  
for arr,ts,is_timingpoint in time_stops:  
stops.append(StopToTuple(ts.stop))  
times.append(arr)  
return [stops, times]  
   
def handle_json_GET_tripshape(self, params):  
schedule = self.server.schedule  
try:  
trip = schedule.GetTrip(params.get('trip'))  
except KeyError:  
# if a non-existent trip is searched for, the return nothing  
return  
points = []  
if trip.shape_id:  
shape = schedule.GetShape(trip.shape_id)  
for (lat, lon, dist) in shape.points:  
points.append((lat, lon))  
else:  
time_stops = trip.GetTimeStops()  
for arr,dep,stop in time_stops:  
points.append((stop.stop_lat, stop.stop_lon))  
return points*/  
} }
function getTimeInterpolatedTrip($tripID) { function getTripShape()
/* rv = [] {
  /* def handle_json_GET_tripstopTimes(self, params):
stoptimes = self.GetStopTimes() schedule = self.server.schedule
# If there are no stoptimes [] is the correct return value but if the start try:
# or end are missing times there is no correct return value. trip = schedule.GetTrip(params.get('trip'))
if not stoptimes: except KeyError:
return [] # if a non-existent trip is searched for, the return nothing
if (stoptimes[0].GetTimeSecs() is None or return
stoptimes[-1].GetTimeSecs() is None): time_stops = trip.GetTimeInterpolatedStops()
raise ValueError("%s must have time at first and last stop" % (self)) stops = []
  times = []
cur_timepoint = None for arr,ts,is_timingpoint in time_stops:
next_timepoint = None stops.append(StopToTuple(ts.stop))
distance_between_timepoints = 0 times.append(arr)
distance_traveled_between_timepoints = 0 return [stops, times]
   
for i, st in enumerate(stoptimes): def handle_json_GET_tripshape(self, params):
if st.GetTimeSecs() != None: schedule = self.server.schedule
cur_timepoint = st try:
distance_between_timepoints = 0 trip = schedule.GetTrip(params.get('trip'))
distance_traveled_between_timepoints = 0 except KeyError:
if i + 1 < len(stoptimes): # if a non-existent trip is searched for, the return nothing
k = i + 1 return
distance_between_timepoints += util.ApproximateDistanceBetweenStops(stoptimes[k-1].stop, stoptimes[k].stop) points = []
while stoptimes[k].GetTimeSecs() == None: if trip.shape_id:
k += 1 shape = schedule.GetShape(trip.shape_id)
distance_between_timepoints += util.ApproximateDistanceBetweenStops(stoptimes[k-1].stop, stoptimes[k].stop) for (lat, lon, dist) in shape.points:
next_timepoint = stoptimes[k] points.append((lat, lon))
rv.append( (st.GetTimeSecs(), st, True) ) else:
else: time_stops = trip.GetTimeStops()
distance_traveled_between_timepoints += util.ApproximateDistanceBetweenStops(stoptimes[i-1].stop, st.stop) for arr,dep,stop in time_stops:
distance_percent = distance_traveled_between_timepoints / distance_between_timepoints points.append((stop.stop_lat, stop.stop_lon))
total_time = next_timepoint.GetTimeSecs() - cur_timepoint.GetTimeSecs() return points*/
time_estimate = distance_percent * total_time + cur_timepoint.GetTimeSecs()  
rv.append( (int(round(time_estimate)), st, False) )  
   
return rv*/  
} }
function getTimeInterpolatedTripAtStop($trip_id, $stop_sequence) { function getTimeInterpolatedTrip($tripID)
foreach(getTimeInterpolatedTrip($tripID) as $tripStop) { {
if ($tripStop['stop_sequence'] == $stop_sequence) return $tripStop; global $conn;
} $query = "SELECT stop_times.trip_id,arrival_time,stop_times.stop_id,stop_lat,stop_lon,
return Array(); stop_sequence,service_id,trips.route_id,route_short_name,route_long_name
  FROM stop_times
  join trips on trips.trip_id = stop_times.trip_id
  join routes on trips.route_id = routes.route_id
  join stops on stops.stop_id = stop_times.stop_id
  WHERE trips.trip_id = '$tripID' ORDER BY stop_sequence";
  debug($query, "database");
  $result = pg_query($conn, $query);
  if (!$result) {
  databaseError(pg_result_error($result));
  return Array();
  }
  $stopTimes = pg_fetch_all($result);
  $cur_timepoint = Array();
  $next_timepoint = Array();
  $distance_between_timepoints = 0.0;
  $distance_traveled_between_timepoints = 0.0;
  $rv = Array();
  foreach ($stopTimes as $i => $stopTime) {
  if ($stopTime['arrival_time'] != "") {
  // is timepoint
  $cur_timepoint = $stopTime;
  $distance_between_timepoints = 0.0;
  $distance_traveled_between_timepoints = 0.0;
  if ($i + 1 < sizeof($stopTimes)) {
  $k = $i + 1;
  $distance_between_timepoints += distance($stopTimes[$k - 1]["stop_lat"], $stopTimes[$k - 1]["stop_lon"], $stopTimes[$k]["stop_lat"], $stopTimes[$k]["stop_lon"]);
  while ($stopTimes[$k]["arrival_time"] == "" && $k + 1 < sizeof($stopTimes)) {
  $k += 1;
  //echo "k".$k;
  $distance_between_timepoints += distance($stopTimes[$k - 1]["stop_lat"], $stopTimes[$k - 1]["stop_lon"], $stopTimes[$k]["stop_lat"], $stopTimes[$k]["stop_lon"]);
  }
  $next_timepoint = $stopTimes[$k];
  $rv[] = $stopTime;
  }
  }
  else {
  // is untimed point
  //echo "i".$i;
  $distance_traveled_between_timepoints += distance($stopTimes[$i - 1]["stop_lat"], $stopTimes[$i - 1]["stop_lon"], $stopTimes[$i]["stop_lat"], $stopTimes[$i]["stop_lon"]);
  //echo "$distance_traveled_between_timepoints / $distance_between_timepoints<br>";
  $distance_percent = $distance_traveled_between_timepoints / $distance_between_timepoints;
  if ($next_timepoint["arrival_time"] != "") {
  $total_time = strtotime($next_timepoint["arrival_time"]) - strtotime($cur_timepoint["arrival_time"]);
  //echo strtotime($next_timepoint["arrival_time"])." - ".strtotime($cur_timepoint["arrival_time"])."<br>";
  $time_estimate = ($distance_percent * $total_time) + strtotime($cur_timepoint["arrival_time"]);
  $stopTime["arrival_time"] = date("H:i:s", $time_estimate);
  } else {
  $stopTime["arrival_time"] = $cur_timepoint["arrival_time"];
  }
  $rv[] = $stopTime;
  //var_dump($rv);
  }
  }
  return $rv;
} }
  function getTimeInterpolatedTripAtStop($tripID, $stop_sequence)
function getTripStartTime($tripID) { {
$query = 'SELECT arrival_secs,departure_secs FROM stop_times WHERE trip_id=? ORDER BY stop_sequence LIMIT 1'; foreach (getTimeInterpolatedTrip($tripID) as $tripStop) {
  if ($tripStop['stop_sequence'] == $stop_sequence) return $tripStop;
  }
  return Array();
} }
  function getTripStartTime($tripID)
  {
  global $conn;
  $query = "Select * from stop_times
  where trip_id = '$tripID'
  AND arrival_time IS NOT NULL
  AND stop_sequence = '1'";
  debug($query, "database");
  $result = pg_query($conn, $query);
  if (!$result) {
  databaseError(pg_result_error($result));
  return Array();
  }
  $r = pg_fetch_assoc($result);
  return $r['arrival_time'];
  }
function viaPointNames($tripid, $stopid) function viaPointNames($tripid, $stopid)
{ {
global $conn; global $conn;
$query = "SELECT stop_name $query = "SELECT stop_name
FROM stop_times join stops on stops.stop_id = stop_times.stop_id FROM stop_times join stops on stops.stop_id = stop_times.stop_id
WHERE stop_times.trip_id = '$tripid' WHERE stop_times.trip_id = '$tripid'
AND stop_sequence > '$stop_sequence' AND stop_sequence > '$stop_sequence'
AND substr(stop_code,1,2) != 'Wj' ORDER BY stop_sequence"; AND substr(stop_code,1,2) != 'Wj' ORDER BY stop_sequence";
debug($query,"database"); debug($query, "database");
$result = pg_query($conn, $query); $result = pg_query($conn, $query);
if (!$result) { if (!$result) {
databaseError(pg_result_error($result)); databaseError(pg_result_error($result));
return Array(); return Array();
} }
$pointNames = pg_fetch_all($result); $pointNames = pg_fetch_all($result);
return r_implode(", ", $pointNames); return r_implode(", ", $pointNames);
} }
?> ?>