<?php |
<?php |
function getTrip($tripID) { |
function getTrip($tripID) |
/* def handle_json_GET_triprows(self, params): |
{ |
"""Return a list of rows from the feed file that are related to this |
global $conn; |
trip.""" |
$query = "Select * from trips |
schedule = self.server.schedule |
join routes on trips.route_id = routes.route_id |
try: |
where trip_id = :tripID |
trip = schedule.GetTrip(params.get('trip', None)) |
LIMIT 1"; |
except KeyError: |
debug($query, "database"); |
# if a non-existent trip is searched for, the return nothing |
$query = $conn->prepare($query); |
return |
$query->bindParam(":tripID", $tripID); |
route = schedule.GetRoute(trip.route_id) |
$query->execute(); |
trip_row = dict(trip.iteritems()) |
if (!$query) { |
route_row = dict(route.iteritems()) |
databaseError($conn->errorInfo()); |
return [['trips.txt', trip_row], ['routes.txt', route_row]] |
return Array(); |
*/ |
} |
} |
return $query->fetch(PDO::FETCH_ASSOC); |
function getTripShape() { |
} |
/* def handle_json_GET_tripstoptimes(self, params): |
function getTripShape() |
schedule = self.server.schedule |
{ |
try: |
/* def handle_json_GET_tripstopTimes(self, params): |
trip = schedule.GetTrip(params.get('trip')) |
schedule = self.server.schedule |
except KeyError: |
try: |
# if a non-existent trip is searched for, the return nothing |
trip = schedule.GetTrip(params.get('trip')) |
return |
except KeyError: |
time_stops = trip.GetTimeInterpolatedStops() |
# if a non-existent trip is searched for, the return nothing |
stops = [] |
return |
times = [] |
time_stops = trip.GetTimeInterpolatedStops() |
for arr,ts,is_timingpoint in time_stops: |
stops = [] |
stops.append(StopToTuple(ts.stop)) |
times = [] |
times.append(arr) |
for arr,ts,is_timingpoint in time_stops: |
return [stops, times] |
stops.append(StopToTuple(ts.stop)) |
|
times.append(arr) |
def handle_json_GET_tripshape(self, params): |
return [stops, times] |
schedule = self.server.schedule |
|
try: |
def handle_json_GET_tripshape(self, params): |
trip = schedule.GetTrip(params.get('trip')) |
schedule = self.server.schedule |
except KeyError: |
try: |
# if a non-existent trip is searched for, the return nothing |
trip = schedule.GetTrip(params.get('trip')) |
return |
except KeyError: |
points = [] |
# if a non-existent trip is searched for, the return nothing |
if trip.shape_id: |
return |
shape = schedule.GetShape(trip.shape_id) |
points = [] |
for (lat, lon, dist) in shape.points: |
if trip.shape_id: |
points.append((lat, lon)) |
shape = schedule.GetShape(trip.shape_id) |
else: |
for (lat, lon, dist) in shape.points: |
time_stops = trip.GetTimeStops() |
points.append((lat, lon)) |
for arr,dep,stop in time_stops: |
else: |
points.append((stop.stop_lat, stop.stop_lon)) |
time_stops = trip.GetTimeStops() |
return points*/ |
for arr,dep,stop in time_stops: |
} |
points.append((stop.stop_lat, stop.stop_lon)) |
function tripStopTimes($tripID, $after_time, $limit) { |
return points*/ |
/* rv = [] |
} |
|
function getTimeInterpolatedTrip($tripID, $range = "") |
stoptimes = self.GetStopTimes() |
{ |
# If there are no stoptimes [] is the correct return value but if the start |
global $conn; |
# or end are missing times there is no correct return value. |
$query = "SELECT stop_times.trip_id,arrival_time,stop_times.stop_id,stop_lat,stop_lon,stop_name,stop_code, |
if not stoptimes: |
stop_sequence,service_id,trips.route_id,route_short_name,route_long_name |
return [] |
FROM stop_times |
if (stoptimes[0].GetTimeSecs() is None or |
join trips on trips.trip_id = stop_times.trip_id |
stoptimes[-1].GetTimeSecs() is None): |
join routes on trips.route_id = routes.route_id |
raise ValueError("%s must have time at first and last stop" % (self)) |
join stops on stops.stop_id = stop_times.stop_id |
|
WHERE trips.trip_id = :tripID $range ORDER BY stop_sequence"; |
cur_timepoint = None |
debug($query, "database"); |
next_timepoint = None |
$query = $conn->prepare($query); |
distance_between_timepoints = 0 |
$query->bindParam(":tripID", $tripID); |
distance_traveled_between_timepoints = 0 |
$query->execute(); |
|
if (!$query) { |
for i, st in enumerate(stoptimes): |
databaseError($conn->errorInfo()); |
if st.GetTimeSecs() != None: |
return Array(); |
cur_timepoint = st |
} |
distance_between_timepoints = 0 |
$stopTimes = $query->fetchAll(); |
distance_traveled_between_timepoints = 0 |
$cur_timepoint = Array(); |
if i + 1 < len(stoptimes): |
$next_timepoint = Array(); |
k = i + 1 |
$distance_between_timepoints = 0.0; |
distance_between_timepoints += util.ApproximateDistanceBetweenStops(stoptimes[k-1].stop, stoptimes[k].stop) |
$distance_traveled_between_timepoints = 0.0; |
while stoptimes[k].GetTimeSecs() == None: |
$rv = Array(); |
k += 1 |
foreach ($stopTimes as $i => $stopTime) { |
distance_between_timepoints += util.ApproximateDistanceBetweenStops(stoptimes[k-1].stop, stoptimes[k].stop) |
if ($stopTime['arrival_time'] != "") { |
next_timepoint = stoptimes[k] |
// is timepoint |
rv.append( (st.GetTimeSecs(), st, True) ) |
$cur_timepoint = $stopTime; |
else: |
$distance_between_timepoints = 0.0; |
distance_traveled_between_timepoints += util.ApproximateDistanceBetweenStops(stoptimes[i-1].stop, st.stop) |
$distance_traveled_between_timepoints = 0.0; |
distance_percent = distance_traveled_between_timepoints / distance_between_timepoints |
if ($i + 1 < sizeof($stopTimes)) { |
total_time = next_timepoint.GetTimeSecs() - cur_timepoint.GetTimeSecs() |
$k = $i + 1; |
time_estimate = distance_percent * total_time + cur_timepoint.GetTimeSecs() |
$distance_between_timepoints+= distance($stopTimes[$k - 1]["stop_lat"], $stopTimes[$k - 1]["stop_lon"], $stopTimes[$k]["stop_lat"], $stopTimes[$k]["stop_lon"]); |
rv.append( (int(round(time_estimate)), st, False) ) |
while ($stopTimes[$k]["arrival_time"] == "" && $k + 1 < sizeof($stopTimes)) { |
|
$k+= 1; |
return rv*/ |
//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"]); |
|
} |
function tripStartTime($tripID) { |
$next_timepoint = $stopTimes[$k]; |
$query = 'SELECT arrival_secs,departure_secs FROM stop_times WHERE trip_id=? ORDER BY stop_sequence LIMIT 1'; |
$rv[] = $stopTime; |
|
|
} |
|
|
|
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 { |
else { |
if ($row[0] == $stopid) $foundStop = true; |
// 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 $viaPoints; |
return $rv; |
} |
} |
function viaPointNames($tripid, $stopid) |
function getTripPreviousTimePoint($tripID, $stop_sequence) |
{ |
{ |
$points = viaPoints($tripid, $stopid, true); |
global $conn; |
$pointNames = Array(); |
$query = " SELECT trip_id,stop_id, |
foreach ($points as $point) { |
stop_sequence |
$pointNames[] = $point['name']; |
FROM stop_times |
} |
WHERE trip_id = :tripID and stop_sequence < :stop_sequence |
return implode(", ", $pointNames); |
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) |
|
{ |
|
global $conn; |
|
// limit interpolation to between nearest actual points. |
|
$prevTimePoint = getTripPreviousTimePoint($tripID, $stop_sequence); |
|
$nextTimePoint = getTripNextTimePoint($tripID, $stop_sequence); |
|
$range = "AND stop_sequence >= '{$prevTimePoint['stop_sequence']}' AND stop_sequence <= '{$nextTimePoint['stop_sequence']}'"; |
|
foreach (getTimeInterpolatedTrip($tripID, $range) 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"); |
|
$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) |
|
{ |
|
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 |
|
WHERE stop_times.trip_id = :tripID |
|
" . ($stop_sequence != "" ? " AND stop_sequence > :stop_sequence " : "") . "AND substr(stop_code,1,2) != 'Wj' ORDER BY stop_sequence"; |
|
debug($query, "database"); |
|
$query = $conn->prepare($query); |
|
if ($stop_sequence != "") $query->bindParam(":stop_sequence", $stop_sequence); |
|
$query->bindParam(":tripID", $tripID); |
|
$query->execute(); |
|
if (!$query) { |
|
databaseError($conn->errorInfo()); |
|
return Array(); |
|
} |
|
return $query->fetchAll(); |
|
} |
|
function viaPointNames($tripid, $stop_sequence = "") |
|
{ |
|
$viaPointNames = Array(); |
|
foreach (viaPoints($tripid, $stop_sequence) as $point) { |
|
$viaPointNames[] = $point['stop_name']; |
|
} |
|
if (sizeof($viaPointNames) > 0) { |
|
return r_implode(", ", $viaPointNames); |
|
} |
|
else { |
|
return ""; |
|
} |
} |
} |
?> |
?> |