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)  
{ /*
global $conn; * Copyright 2010,2011 Alexander Sadleir
$query = "Select * from trips where trip_id = '$tripID' join routes on trips.route_id = routes.route_id LIMIT 1";  
debug($query, "database"); Licensed under the Apache License, Version 2.0 (the "License");
$result = pg_query($conn, $query); you may not use this file except in compliance with the License.
if (!$result) { You may obtain a copy of the License at
databaseError(pg_result_error($result));  
return Array(); http://www.apache.org/licenses/LICENSE-2.0
}  
return pg_fetch_assoc($result); Unless required by applicable law or agreed to in writing, software
} distributed under the License is distributed on an "AS IS" BASIS,
function getTripShape() WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
{ See the License for the specific language governing permissions and
/* def handle_json_GET_tripstopTimes(self, params): limitations under the License.
schedule = self.server.schedule */
try:  
trip = schedule.GetTrip(params.get('trip')) function getTrip($tripID) {
except KeyError: global $conn;
# if a non-existent trip is searched for, the return nothing $query = "Select * from trips
return join routes on trips.route_id = routes.route_id
time_stops = trip.GetTimeInterpolatedStops() where trip_id = :tripID
stops = [] LIMIT 1";
times = [] debug($query, "database");
for arr,ts,is_timingpoint in time_stops: $query = $conn->prepare($query);
stops.append(StopToTuple(ts.stop)) $query->bindParam(":tripID", $tripID);
times.append(arr) $query->execute();
return [stops, times] if (!$query) {
  databaseError($conn->errorInfo());
def handle_json_GET_tripshape(self, params):  
schedule = self.server.schedule return Array();
try: }
trip = schedule.GetTrip(params.get('trip')) return $query->fetch(PDO :: FETCH_ASSOC);
except KeyError: }
# if a non-existent trip is searched for, the return nothing function getTripStops($tripID) {
return global $conn;
points = [] $query = "SELECT stop_id, stop_name, ST_AsKML(position) as positionkml,
if trip.shape_id: stop_sequence, trips.trip_id
shape = schedule.GetShape(trip.shape_id) FROM stop_times
for (lat, lon, dist) in shape.points: join trips on trips.trip_id = stop_times.trip_id
points.append((lat, lon)) join stops on stops.stop_id = stop_times.stop_id
else: WHERE trips.trip_id = :tripID ORDER BY stop_sequence";
time_stops = trip.GetTimeStops() debug($query, "database");
for arr,dep,stop in time_stops: $query = $conn->prepare($query);
points.append((stop.stop_lat, stop.stop_lon)) $query->bindParam(":tripID", $tripID);
return points*/ $query->execute();
} if (!$query) {
function getTimeInterpolatedTrip($tripID) databaseError($conn->errorInfo());
{ return Array();
global $conn; }
$query = "SELECT stop_times.trip_id,arrival_time,stop_times.stop_id,stop_lat,stop_lon, return $query->fetchColumn(0);
  }
  function getTripShape($tripID) {
  // todo, use shapes table if shape_id specified
  global $conn;
  $query = "SELECT ST_AsKML(ST_MakeLine(geometry(a.shape_pt))) as the_route
  FROM (SELECT shapes.shape_id,shape_pt from shapes
  inner join trips on shapes.shape_id = trips.shape_id
  WHERE trips.trip_id = :tripID ORDER BY shape_pt_sequence) as a group by a.shape_id";
  debug($query, "database");
  $query = $conn->prepare($query);
  $query->bindParam(":tripID", $tripID);
  $query->execute();
  if (!$query) {
  databaseError($conn->errorInfo());
  return Array();
  }
  return $query->fetchColumn(0);
  }
   
  function getTripStopTimes($tripID) {
  global $conn;
  $query = "SELECT stop_times.trip_id,trip_headsign,arrival_time,stop_times.stop_id
  ,stop_lat,stop_lon,stop_name,stop_desc,stop_code,
stop_sequence,service_id,trips.route_id,route_short_name,route_long_name stop_sequence,service_id,trips.route_id,route_short_name,route_long_name
FROM stop_times FROM stop_times
join trips on trips.trip_id = stop_times.trip_id join trips on trips.trip_id = stop_times.trip_id
join routes on trips.route_id = routes.route_id join routes on trips.route_id = routes.route_id
join stops on stops.stop_id = stop_times.stop_id join stops on stops.stop_id = stop_times.stop_id
WHERE trips.trip_id = '$tripID' ORDER BY stop_sequence"; WHERE trips.trip_id = :tripID ORDER BY stop_sequence";
debug($query, "database"); debug($query, "database");
$result = pg_query($conn, $query); $query = $conn->prepare($query);
if (!$result) { $query->bindParam(":tripID", $tripID);
databaseError(pg_result_error($result)); $query->execute();
return Array(); if (!$query) {
} databaseError($conn->errorInfo());
$stopTimes = pg_fetch_all($result); return Array();
$cur_timepoint = Array(); }
$next_timepoint = Array(); $stopTimes = $query->fetchAll();
$distance_between_timepoints = 0.0; return $stopTimes;
$distance_traveled_between_timepoints = 0.0; }
$rv = Array();  
foreach ($stopTimes as $i => $stopTime) { function getTripAtStop($tripID, $stop_sequence) {
if ($stopTime['arrival_time'] != "") { global $conn;
// is timepoint foreach (getTripStopTimes($tripID) as $tripStop) {
$cur_timepoint = $stopTime; if ($tripStop['stop_sequence'] == $stop_sequence)
$distance_between_timepoints = 0.0; return $tripStop;
$distance_traveled_between_timepoints = 0.0; }
if ($i + 1 < sizeof($stopTimes)) { return Array();
$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)) { function getTripStartTime($tripID) {
$k += 1; global $conn;
//echo "k".$k; $query = "Select * from stop_times
$distance_between_timepoints += distance($stopTimes[$k - 1]["stop_lat"], $stopTimes[$k - 1]["stop_lon"], $stopTimes[$k]["stop_lat"], $stopTimes[$k]["stop_lon"]); where trip_id = :tripID
}  
$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)  
{  
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 arrival_time IS NOT NULL
AND stop_sequence = '1'"; AND stop_sequence = '1'";
debug($query, "database"); debug($query, "database");
$result = pg_query($conn, $query); $query = $conn->prepare($query);
if (!$result) { $query->bindParam(":tripID", $tripID);
databaseError(pg_result_error($result)); $query->execute();
return Array(); if (!$query) {
} databaseError($conn->errorInfo());
$r = pg_fetch_assoc($result); return Array();
return $r['arrival_time']; }
} $r = $query->fetch(PDO :: FETCH_ASSOC);
function viaPointNames($tripid, $stopid) return $r['arrival_time'];
{ }
global $conn;  
$query = "SELECT stop_name function getTripEndTime($tripID) {
  global $conn;
  $query = "SELECT trip_id,max(arrival_time) as arrival_time from stop_times
  WHERE stop_times.arrival_time IS NOT NULL and trip_id = :tripID group by trip_id";
  debug($query, "database");
  $query = $conn->prepare($query);
  $query->bindParam(":tripID", $tripID);
  $query->execute();
  if (!$query) {
  databaseError($conn->errorInfo());
  return Array();
  }
  $r = $query->fetch(PDO :: FETCH_ASSOC);
  return $r['arrival_time'];
  }
  function getTripStartingPoint($tripID) {
  global $conn;
  $query = "SELECT stops.stop_id, stops.stop_name, stops.stop_desc
  from stop_times inner join stops on stop_times.stop_id = stops.stop_id
  WHERE trip_id = :tripID and stop_sequence = '1' limit 1";
  debug($query, "database");
  $query = $conn->prepare($query);
  $query->bindParam(":tripID", $tripID);
  $query->execute();
  if (!$query) {
  databaseError($conn->errorInfo());
  return Array();
  }
  $r = $query->fetch(PDO :: FETCH_ASSOC);
  return $r;
  }
   
  function getTripDestination($tripID) {
  global $conn;
  $query = "SELECT stops.stop_id, stops.stop_name, stops.stop_desc
  from stop_times inner join stops on stop_times.stop_id = stops.stop_id
  WHERE trip_id = :tripID order by stop_sequence desc limit 1";
  debug($query, "database");
  $query = $conn->prepare($query);
  $query->bindParam(":tripID", $tripID);
  $query->execute();
  if (!$query) {
  databaseError($conn->errorInfo());
  return Array();
  }
  $r = $query->fetch(PDO :: FETCH_ASSOC);
  return $r;
  }
   
  function getActiveTrips($time) {
  global $conn;
  if ($time == "")
  $time = current_time();
  $query = "Select distinct stop_times.trip_id, start_times.arrival_time as start_time, end_times.arrival_time as end_time from stop_times, (SELECT trip_id,arrival_time from stop_times WHERE stop_times.arrival_time IS NOT NULL
  AND stop_sequence = '1') as start_times, (SELECT trip_id,max(arrival_time) as arrival_time from stop_times WHERE stop_times.arrival_time IS NOT NULL group by trip_id) as end_times
  WHERE start_times.trip_id = end_times.trip_id AND stop_times.trip_id = end_times.trip_id AND :time > start_times.arrival_time AND :time < end_times.arrival_time";
  debug($query, "database");
  $query = $conn->prepare($query);
  $query->bindParam(":time", $time);
  $query->execute();
  if (!$query) {
  databaseError($conn->errorInfo());
  return Array();
  }
  return $query->fetchAll();
  }
   
  function viaPoints($tripID, $stop_sequence = "") {
  global $conn;
  $query = "SELECT stops.stop_id, stop_name, arrival_time
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' " . ($stop_sequence != "" ? " AND stop_sequence > :stop_sequence " : "") . " ORDER BY stop_sequence";
AND substr(stop_code,1,2) != 'Wj' ORDER BY stop_sequence"; debug($query, "database");
debug($query, "database"); $query = $conn->prepare($query);
$result = pg_query($conn, $query); if ($stop_sequence != "")
if (!$result) { $query->bindParam(":stop_sequence", $stop_sequence);
databaseError(pg_result_error($result)); $query->bindParam(":tripID", $tripID);
return Array(); $query->execute();
} if (!$query) {
$pointNames = pg_fetch_all($result); databaseError($conn->errorInfo());
return r_implode(", ", $pointNames); return Array();
} }
  return $query->fetchAll();
  }
   
   
?> ?>