--- a/include/db/trip-dao.inc.php +++ b/include/db/trip-dao.inc.php @@ -1,132 +1,178 @@ prepare($query); + $query->bindParam(":tripID", $tripID); + $query->execute(); + if (!$query) { + databaseError($conn->errorInfo()); - 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 tripStopTimes($tripID, $after_time, $limit) { - /* rv = [] - - stoptimes = self.GetStopTimes() - # 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. - if not stoptimes: - return [] - if (stoptimes[0].GetTimeSecs() is None or - stoptimes[-1].GetTimeSecs() is None): - raise ValueError("%s must have time at first and last stop" % (self)) - - cur_timepoint = None - next_timepoint = None - distance_between_timepoints = 0 - distance_traveled_between_timepoints = 0 - - for i, st in enumerate(stoptimes): - if st.GetTimeSecs() != None: - cur_timepoint = st - distance_between_timepoints = 0 - distance_traveled_between_timepoints = 0 - if i + 1 < len(stoptimes): - k = i + 1 - distance_between_timepoints += util.ApproximateDistanceBetweenStops(stoptimes[k-1].stop, stoptimes[k].stop) - while stoptimes[k].GetTimeSecs() == None: - k += 1 - distance_between_timepoints += util.ApproximateDistanceBetweenStops(stoptimes[k-1].stop, stoptimes[k].stop) - next_timepoint = stoptimes[k] - rv.append( (st.GetTimeSecs(), st, True) ) - else: - distance_traveled_between_timepoints += util.ApproximateDistanceBetweenStops(stoptimes[i-1].stop, st.stop) - distance_percent = distance_traveled_between_timepoints / distance_between_timepoints - total_time = next_timepoint.GetTimeSecs() - cur_timepoint.GetTimeSecs() - time_estimate = distance_percent * total_time + cur_timepoint.GetTimeSecs() - rv.append( (int(round(time_estimate)), st, False) ) - - return rv*/ + return Array(); + } + return $query->fetch(PDO :: FETCH_ASSOC); } -function tripStartTime($tripID) { - $query = 'SELECT arrival_secs,departure_secs FROM stop_times WHERE trip_id=? ORDER BY stop_sequence LIMIT 1'; - +function getTripShape($tripID) { + // todo, use shapes table if shape_id specified + global $conn; + $query = "SELECT ST_AsKML(ST_MakeLine(geometry(a.position))) as the_route +FROM (SELECT position, + stop_sequence, trips.trip_id +FROM stop_times +join trips on trips.trip_id = stop_times.trip_id +join stops on stops.stop_id = stop_times.stop_id +WHERE trips.trip_id = :tripID ORDER BY stop_sequence) as a group by a.trip_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 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 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 +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 $range ORDER BY stop_sequence"; + debug($query, "database"); + $query = $conn->prepare($query); + $query->bindParam(":tripID", $tripID); + $query->execute(); + if (!$query) { + databaseError($conn->errorInfo()); + return Array(); + } + $stopTimes = $query->fetchAll(); + return $stopTimes; } -function viaPointNames($tripid, $stopid) -{ - $points = viaPoints($tripid, $stopid, true); - $pointNames = Array(); - foreach ($points as $point) { - $pointNames[] = $point['name']; - } - return implode(", ", $pointNames); + +function getTripAtStop($tripID, $stop_sequence) { + global $conn; + foreach (getTripStopTimes($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"); + $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 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 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 +WHERE stop_times.trip_id = :tripID +" . ($stop_sequence != "" ? " AND stop_sequence > :stop_sequence " : "") . " 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(); +} + + ?>