Experiment about making graphs of route trips
[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 global $conn;
  $query = "Select * from trips
join routes on trips.route_id = routes.route_id join routes on trips.route_id = routes.route_id
where trip_id = '$tripID' where trip_id = :tripID
LIMIT 1"; LIMIT 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());
return pg_fetch_assoc($result); return Array();
} }
function getTripShape() return $query -> fetch(PDO :: FETCH_ASSOC);
{ }
/* def handle_json_GET_tripstopTimes(self, params): function getTripShape($tripID)
schedule = self.server.schedule  
try: {
trip = schedule.GetTrip(params.get('trip')) global $conn;
except KeyError: $query = "SELECT ST_AsKML(ST_MakeLine(geometry(a.position))) as the_route
# if a non-existent trip is searched for, the return nothing FROM (SELECT position,
return stop_sequence, trips.trip_id
time_stops = trip.GetTimeInterpolatedStops() FROM stop_times
stops = [] join trips on trips.trip_id = stop_times.trip_id
times = [] join stops on stops.stop_id = stop_times.stop_id
for arr,ts,is_timingpoint in time_stops: WHERE trips.trip_id = :tripID ORDER BY stop_sequence) as a group by a.trip_id";
stops.append(StopToTuple(ts.stop)) debug($query, "database");
times.append(arr) $query = $conn -> prepare($query);
return [stops, times] $query -> bindParam(":tripID", $tripID);
  $query -> execute();
def handle_json_GET_tripshape(self, params): if (!$query) {
schedule = self.server.schedule databaseError($conn -> errorInfo());
try: return Array();
trip = schedule.GetTrip(params.get('trip')) }
except KeyError: return $query -> fetchColumn(0);
# 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, $range = "") function getTimeInterpolatedTrip($tripID, $range = "")
{  
global $conn; {
$query = "SELECT stop_times.trip_id,arrival_time,stop_times.stop_id,stop_lat,stop_lon,stop_name,stop_code, global $conn;
  $query = "SELECT stop_times.trip_id,arrival_time,stop_times.stop_id,stop_lat,stop_lon,stop_name,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' $range ORDER BY stop_sequence"; WHERE trips.trip_id = :tripID $range 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; $cur_timepoint = Array();
$distance_traveled_between_timepoints = 0.0; $next_timepoint = Array();
$rv = Array(); $distance_between_timepoints = 0.0;
foreach ($stopTimes as $i => $stopTime) { $distance_traveled_between_timepoints = 0.0;
if ($stopTime['arrival_time'] != "") { $rv = Array();
// is timepoint foreach ($stopTimes as $i => $stopTime) {
$cur_timepoint = $stopTime; if ($stopTime['arrival_time'] != "") {
$distance_between_timepoints = 0.0; // is timepoint
$distance_traveled_between_timepoints = 0.0; $cur_timepoint = $stopTime;
if ($i + 1 < sizeof($stopTimes)) { $distance_between_timepoints = 0.0;
$k = $i + 1; $distance_traveled_between_timepoints = 0.0;
$distance_between_timepoints += distance($stopTimes[$k - 1]["stop_lat"], $stopTimes[$k - 1]["stop_lon"], $stopTimes[$k]["stop_lat"], $stopTimes[$k]["stop_lon"]); if ($i + 1 < sizeof($stopTimes)) {
while ($stopTimes[$k]["arrival_time"] == "" && $k + 1 < sizeof($stopTimes)) { $k = $i + 1;
$k += 1; $distance_between_timepoints += distance($stopTimes[$k - 1]["stop_lat"], $stopTimes[$k - 1]["stop_lon"], $stopTimes[$k]["stop_lat"], $stopTimes[$k]["stop_lon"]);
//echo "k".$k; while ($stopTimes[$k]["arrival_time"] == "" && $k + 1 < sizeof($stopTimes)) {
$distance_between_timepoints += distance($stopTimes[$k - 1]["stop_lat"], $stopTimes[$k - 1]["stop_lon"], $stopTimes[$k]["stop_lat"], $stopTimes[$k]["stop_lon"]); $k += 1;
} // echo "k".$k;
$next_timepoint = $stopTimes[$k]; $distance_between_timepoints += distance($stopTimes[$k - 1]["stop_lat"], $stopTimes[$k - 1]["stop_lon"], $stopTimes[$k]["stop_lat"], $stopTimes[$k]["stop_lon"]);
$rv[] = $stopTime; }
} $next_timepoint = $stopTimes[$k];
}  
else { }
// is untimed point $rv[] = $stopTime;
//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"]); else {
//echo "$distance_traveled_between_timepoints / $distance_between_timepoints<br>"; // is untimed point
$distance_percent = $distance_traveled_between_timepoints / $distance_between_timepoints; // echo "i".$i;
if ($next_timepoint["arrival_time"] != "") { $distance_traveled_between_timepoints += distance($stopTimes[$i - 1]["stop_lat"], $stopTimes[$i - 1]["stop_lon"], $stopTimes[$i]["stop_lat"], $stopTimes[$i]["stop_lon"]);
$total_time = strtotime($next_timepoint["arrival_time"]) - strtotime($cur_timepoint["arrival_time"]); // echo "$distance_traveled_between_timepoints / $distance_between_timepoints<br>";
//echo strtotime($next_timepoint["arrival_time"])." - ".strtotime($cur_timepoint["arrival_time"])."<br>"; $distance_percent = $distance_traveled_between_timepoints / $distance_between_timepoints;
$time_estimate = ($distance_percent * $total_time) + strtotime($cur_timepoint["arrival_time"]); if ($next_timepoint["arrival_time"] != "") {
$stopTime["arrival_time"] = date("H:i:s", $time_estimate); $total_time = strtotime($next_timepoint["arrival_time"]) - strtotime($cur_timepoint["arrival_time"]);
} else { // echo strtotime($next_timepoint["arrival_time"])." - ".strtotime($cur_timepoint["arrival_time"])."<br>";
$stopTime["arrival_time"] = $cur_timepoint["arrival_time"]; $time_estimate = ($distance_percent * $total_time) + strtotime($cur_timepoint["arrival_time"]);
} $stopTime["arrival_time"] = date("H:i:s", $time_estimate);
$rv[] = $stopTime; }
//var_dump($rv); else {
} $stopTime["arrival_time"] = $cur_timepoint["arrival_time"];
} }
return $rv; $rv[] = $stopTime;
}  
   
  }
  }
  // var_dump($rv);
  return $rv;
  }
  function getTripPreviousTimePoint($tripID, $stop_sequence)
   
  {
  global $conn;
  $query = " SELECT trip_id,stop_id,
  stop_sequence
  FROM stop_times
  WHERE trip_id = :tripID and stop_sequence < :stop_sequence
  and stop_times.arrival_time IS NOT NULL ORDER BY stop_sequence DESC LIMIT 1";
  debug($query, "database");
  $query = $conn -> prepare($query);
  $query -> bindParam(":tripID", $tripID);
  $query -> bindParam(":stop_sequence", $stop_sequence);
  $query -> execute();
  if (!$query) {
  databaseError($conn -> errorInfo());
  return Array();
  }
  return $query -> fetch(PDO :: FETCH_ASSOC);
  }
  function getTripNextTimePoint($tripID, $stop_sequence)
   
  {
  global $conn;
  $query = " SELECT trip_id,stop_id,
  stop_sequence
  FROM stop_times
  WHERE trip_id = :tripID and stop_sequence > :stop_sequence
  and stop_times.arrival_time IS NOT NULL ORDER BY stop_sequence LIMIT 1";
  debug($query, "database");
  $query = $conn -> prepare($query);
  $query -> bindParam(":tripID", $tripID);
  $query -> bindParam(":stop_sequence", $stop_sequence);
  $query -> execute();
  if (!$query) {
  databaseError($conn -> errorInfo());
  return Array();
  }
  return $query -> fetch(PDO :: FETCH_ASSOC);
  }
function getTimeInterpolatedTripAtStop($tripID, $stop_sequence) function getTimeInterpolatedTripAtStop($tripID, $stop_sequence)
{  
global $conn; {
// limit interpolation to between nearest actual points. global $conn;
$prevTimePoint = pg_fetch_assoc(pg_query($conn," SELECT trip_id,stop_id, // limit interpolation to between nearest actual points.
stop_sequence $prevTimePoint = getTripPreviousTimePoint($tripID, $stop_sequence);
FROM stop_times $nextTimePoint = getTripNextTimePoint($tripID, $stop_sequence);
WHERE trip_id = '$tripID' and stop_sequence < $stop_sequence and stop_times.arrival_time IS NOT NULL ORDER BY stop_sequence DESC LIMIT 1")); // echo " prev {$lowestDelta['stop_sequence']} next {$nextTimePoint['stop_sequence']} ";
$nextTimePoint = pg_fetch_assoc(pg_query($conn," SELECT trip_id,stop_id, $range = "";
stop_sequence if ($prevTimePoint != "") $range .= " AND stop_sequence >= '{$prevTimePoint['stop_sequence']}'";
FROM stop_times if ($nextTimePoint != "") $range .= " AND stop_sequence <= '{$nextTimePoint['stop_sequence']}'";
WHERE trip_id = '$tripID' and stop_sequence > $stop_sequence and stop_times.arrival_time IS NOT NULL ORDER BY stop_sequence LIMIT 1")); foreach (getTimeInterpolatedTrip($tripID, $range) as $tripStop) {
$range = "AND stop_sequence >= '{$prevTimePoint['stop_sequence']}' AND stop_sequence <= '{$nextTimePoint['stop_sequence']}'"; if ($tripStop['stop_sequence'] == $stop_sequence) return $tripStop;
foreach (getTimeInterpolatedTrip($tripID,$range) as $tripStop) { }
if ($tripStop['stop_sequence'] == $stop_sequence) return $tripStop; return Array();
} }
return Array();  
}  
function getTripStartTime($tripID) function getTripStartTime($tripID)
{  
global $conn; {
$query = "Select * from stop_times global $conn;
where trip_id = '$tripID' $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);
  return $r['arrival_time'];
  }
  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 getActiveTrips($time) function getActiveTrips($time)
{  
global $conn; {
if ($time == "") $time = current_time(); global $conn;
$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 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 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"; 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"); debug($query, "database");
$result = pg_query($conn, $query); $query = $conn -> prepare($query);
if (!$result) { $query -> bindParam(":time", $time);
databaseError(pg_result_error($result)); $query -> execute();
return Array(); if (!$query) {
} databaseError($conn -> errorInfo());
return pg_fetch_all($result); return Array();
} }
  return $query -> fetchAll();
function viaPoints($tripid, $stop_sequence = "") }
{ function viaPoints($tripID, $stop_sequence = "", $timing_points_only = true)
global $conn;  
$query = "SELECT stops.stop_id, stop_name, arrival_time {
  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
".($stop_sequence != "" ? "AND stop_sequence > '$stop_sequence'" : ""). " . ($stop_sequence != "" ? " AND stop_sequence > :stop_sequence " : "") . ($timing_points_only ? "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"); $query = $conn -> prepare($query);
$result = pg_query($conn, $query); if ($stop_sequence != "") $query -> bindParam(":stop_sequence", $stop_sequence);
if (!$result) { $query -> bindParam(":tripID", $tripID);
databaseError(pg_result_error($result)); $query -> execute();
return Array(); if (!$query) {
} databaseError($conn -> errorInfo());
return pg_fetch_all($result); return Array();
} }
  return $query -> fetchAll();
  }
function viaPointNames($tripid, $stop_sequence = "") function viaPointNames($tripid, $stop_sequence = "")
{  
$viaPointNames = Array(); {
foreach(viaPoints($tripid, $stop_sequence) as $point) { $viaPointNames = Array();
$viaPointNames[] = $point['stop_name']; foreach (viaPoints($tripid, $stop_sequence) as $point) {
} $viaPointNames[] = $point['stop_name'];
return r_implode(", ", $viaPointNames); }
} if (sizeof($viaPointNames) > 0) {
  return r_implode(", ", $viaPointNames);
  }
  else {
  return "";
  }
  }
?> ?>