Try to adapt to new route destination detection
--- a/geo/route.kml.php
+++ b/geo/route.kml.php
@@ -21,8 +21,8 @@
echo '<description><![CDATA[ <a href="'.$link.'">'.$route['route_short_name']." ".$route['route_long_name']."</a>]]> </description>";
echo "<styleUrl>#yellowLineGreenPoly</styleUrl>";
- $trips = getRouteTrips($routeid);
- echo getTripShape($trips[0]['trip_id']);
+ $trip = getRouteNextTrip($routeid);
+ echo getTripShape($trip['trip_id']);
echo "</Placemark>\n</Document></kml>\n";
?>
--- a/include/common-db.inc.php
+++ b/include/common-db.inc.php
@@ -27,7 +27,9 @@
}
function databaseError($errMsg) {
- die($errMsg);
+ if ($errMsg[1] != "") {
+ die(print_r($errMsg,true));
+ }
}
include ('db/route-dao.inc.php');
--- a/include/common-request.inc.php
+++ b/include/common-request.inc.php
@@ -57,15 +57,15 @@
if (isset($_REQUEST['stopids'])) {
$stopids = explode(",", filter_var($_REQUEST['stopids'], FILTER_SANITIZE_STRING));
}
+if (isset($_REQUEST['routeids'])) {
+ $routeids = explode(",", filter_var($_REQUEST['routeids'], FILTER_SANITIZE_STRING));
+}
if (isset($_REQUEST['tripid'])) {
$tripid = filter_var($_REQUEST['tripid'], FILTER_SANITIZE_STRING);
}
if (isset($_REQUEST['stopid'])) {
$stopid = filter_var($_REQUEST['stopid'], FILTER_SANITIZE_NUMBER_INT);
}
-if (isset($_REQUEST['routeid'])) {
- $routeid = filter_var($_REQUEST['routeid'], FILTER_SANITIZE_NUMBER_INT);
-}
if (isset($_REQUEST['geolocate'])) {
$geolocate = filter_var($_REQUEST['geolocate'], FILTER_SANITIZE_URL);
}
--- a/include/common-transit.inc.php
+++ b/include/common-transit.inc.php
@@ -20,15 +20,17 @@
'saturday',
'weekday'
);
-
+function service_period_day ($spid) {
+ $idParts = explode("-",$spid);
+ return strtolower($idParts[2]);
+}
function service_period($date = "") {
if (isset($_SESSION['service_period']))
return $_SESSION['service_period'];
$override = getServiceOverride($date);
if ($override['service_id']) {
- $idParts = explode("-",$override['service_id']);
- return strtolower($idParts[2]);
+ return service_period_day ($override['service_id']);
}
switch (date('w', ($date != "" ? $date : time()))) {
@@ -50,6 +52,9 @@
//return 'weekday';
return Array("2010-BELCMAST-Weekday-15","2010-TUGGMAST-Weekday-14");
}
+}
+function valid_service_ids() {
+ return array_merge(service_ids(""),service_ids('saturday'),service_ids('sunday'));
}
function midnight_seconds($time = "") {
--- a/include/db/route-dao.inc.php
+++ b/include/db/route-dao.inc.php
@@ -29,6 +29,7 @@
}
return $query->fetch(PDO :: FETCH_ASSOC);
}
+
function getRoutesByShortName($routeShortName) {
global $conn;
$query = "Select distinct route_id, route_short_name from routes where route_short_name = :routeShortName";
@@ -45,8 +46,11 @@
function getRouteHeadsigns($routeID) {
global $conn;
- $query = "select distinct stops.stop_name, trip_headsign,direction_id from routes join trips on trips.route_id = routes.route_id
-join stop_times on stop_times.trip_id = trips.trip_id join stops on stop_times.stop_id = stops.stop_id where trips.route_id = :routeID and stop_times.stop_sequence = 1";
+ $query = "select stops.stop_name, direction_id,max(service_id) as service_id, count(*)
+ from routes join trips on trips.route_id = routes.route_id
+join stop_times on stop_times.trip_id = trips.trip_id join stops on
+stop_times.stop_id = stops.stop_id where trips.route_id = :routeID
+and stop_times.stop_sequence = 1 group by stops.stop_name, direction_id having count(*) > 2";
debug($query, "database");
$query = $conn->prepare($query);
$query->bindParam(":routeID", $routeID);
@@ -55,9 +59,14 @@
databaseError($conn->errorInfo());
return Array();
}
-return $query->fetchAll();
-}
-
+ return $query->fetchAll();
+}
+function getRouteDescription($routeID) {
+ $trip = getRouteNextTrip($routeID);
+ $start = getTripStartingPoint($trip['trip_id']);
+ $end = getTripDestination($trip['trip_id']);
+ return "From ".$start['stop_name']." to ".$end['stop_name'];
+}
function getRouteByFullName($routeFullName) {
global $conn;
$query = "Select * from routes where route_short_name||route_long_name = :routeFullName LIMIT 1";
@@ -85,7 +94,7 @@
return $query->fetchAll();
}
-function getRoutesByNumber($routeNumber = "") {
+function getRoutesByNumber($routeNumber = "", $directionID = "",$service_period = "") {
global $conn;
if ($routeNumber != "") {
$query = "Select distinct routes.route_id,routes.route_short_name,routes.route_long_name,service_id from routes join trips on trips.route_id =
@@ -134,15 +143,16 @@
function getRouteNextTrip($routeID) {
global $conn;
- $query = "select * from routes join trips on trips.route_id = routes.route_id
-join stop_times on stop_times.trip_id = trips.trip_id where
-arrival_time > :currentTime and routes.route_id = :routeID order by
+
+ $query = "select routes.route_id,direction_id,trips.trip_id,departure_time from routes join trips on trips.route_id = routes.route_id
+join stop_times on stop_times.trip_id = trips.trip_id where arrival_time > :currentTime and routes.route_id = :routeID order by
arrival_time limit 1";
debug($query, "database");
$query = $conn->prepare($query);
$query->bindParam(":currentTime", current_time());
$query->bindParam(":routeID", $routeID);
$query->execute();
+ databaseError($conn->errorInfo());
if (!$query) {
databaseError($conn->errorInfo());
return Array();
@@ -179,40 +189,61 @@
return Array();
}
-function getRouteTrips($routeID) {
- global $conn;
- $query = "select routes.route_id,trips.trip_id,service_id,arrival_time, stop_id, stop_sequence from routes join trips on trips.route_id = routes.route_id
-join stop_times on stop_times.trip_id = trips.trip_id where routes.route_id = :routeID and stop_sequence = '1' order by
-arrival_time ";
- debug($query, "database");
- $query = $conn->prepare($query);
- $query->bindParam(":routeID", $routeID);
- $query->execute();
- if (!$query) {
- databaseError($conn->errorInfo());
- return Array();
- }
- return $query->fetchAll();
-}
-
-function getRoutesByDestination($destination = "", $service_period = "") {
+function getRoutesTrips($routeIDs, $directionID = "", $service_period = "") {
global $conn;
if ($service_period == "")
$service_period = service_period();
+ $service_ids = service_ids($service_period);
+ $sidA = $service_ids[0];
+ $sidB = $service_ids[1];
+ $directionSQL = "";
+ if ($directionID != "")
+ $directionSQL = " and direction_id = :directionID ";
+ $query = "select routes.route_id,trips.trip_id,service_id,arrival_time, stop_id, stop_sequence from routes join trips on trips.route_id = routes.route_id
+join stop_times on stop_times.trip_id = trips.trip_id where (service_id=:service_periodA OR service_id=:service_periodB)
+AND (routes.route_id = :routeIDA OR routes.route_id = :routeIDB) " . $directionSQL . " and stop_sequence = '1' order by
+arrival_time ";
+ debug($query, "database");
+ $query = $conn->prepare($query);
+ $query->bindParam(":routeIDA", $routeIDs[0]);
+ $query->bindParam(":routeIDB", $routeIDs[1]);
+ $query->bindParam(":service_periodA", $sidA);
+ $query->bindParam(":service_periodB", $sidB);
+ if ($directionSQL != "")
+ $query->bindParam(":directionID", $directionID);
+ $query->execute();
+ if (!$query) {
+ databaseError($conn->errorInfo());
+ return Array();
+ }
+ return $query->fetchAll();
+}
+
+function getRoutesByDestination($destination = "", $service_period = "") {
+ global $conn;
+ if ($service_period == "")
+ $service_period = service_period();
+ $service_ids = service_ids($service_period);
+ $sidA = $service_ids[0];
+ $sidB = $service_ids[1];
if ($destination != "") {
$query = "SELECT DISTINCT trips.route_id,route_short_name,route_long_name, service_id
FROM stop_times join trips on trips.trip_id =
stop_times.trip_id join routes on trips.route_id = routes.route_id
-WHERE route_long_name = :destination AND service_id=:service_period order by route_short_name";
+WHERE route_long_name = :destination AND (service_id=:service_periodA OR service_id=:service_periodB)
+ order by route_short_name";
} else {
$query = "SELECT DISTINCT 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
-WHERE service_id= :service_period order by route_long_name";
- }
- debug($query, "database");
- $query = $conn->prepare($query);
- $query->bindParam(":service_period", $service_period);
+WHERE (service_id=:service_periodA OR service_id=:service_periodB)
+ order by route_long_name";
+ }
+ debug($query, "database");
+ $query = $conn->prepare($query);
+
+ $query->bindParam(":service_periodA", $sidA);
+ $query->bindParam(":service_periodB", $sidB);
if ($destination != "")
$query->bindParam(":destination", $destination);
$query->execute();
@@ -226,14 +257,20 @@
function getRoutesBySuburb($suburb, $service_period = "") {
if ($service_period == "")
$service_period = service_period();
+ $service_ids = service_ids($service_period);
+ $sidA = $service_ids[0];
+ $sidB = $service_ids[1];
global $conn;
$query = "SELECT DISTINCT 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 zone_id LIKE ':suburb AND service_id=:service_period ORDER BY route_short_name";
- debug($query, "database");
- $query = $conn->prepare($query);
+WHERE zone_id LIKE ':suburb AND (service_id=:service_periodA OR service_id=:service_periodB)
+ ORDER BY route_short_name";
+ debug($query, "database");
+ $query = $conn->prepare($query);
+ $query->bindParam(":service_periodA", $sidA);
+ $query->bindParam(":service_periodB", $sidB);
$query->bindParam(":service_period", $service_period);
$suburb = "%" . $suburb . ";%";
$query->bindParam(":suburb", $suburb);
@@ -248,7 +285,7 @@
function getRoutesNearby($lat, $lng, $limit = "", $distance = 500) {
if ($service_period == "")
$service_period = service_period();
- $service_ids = service_ids($service_period);
+ $service_ids = service_ids($service_period);
$sidA = $service_ids[0];
$sidB = $service_ids[1];
if ($limit != "")
--- a/include/db/stop-dao.inc.php
+++ b/include/db/stop-dao.inc.php
@@ -176,7 +176,7 @@
global $conn;
if ($afterTime != "") {
- $query = " SELECT stop_times.trip_id,stop_times.arrival_time,stop_times.stop_id,stop_sequence,service_id,trips.route_id,route_short_name,route_long_name,end_times.arrival_time as end_time
+ $query = " SELECT stop_times.trip_id,stop_times.arrival_time,stop_times.stop_id,stop_sequence,service_id,trips.route_id,trips.direction_id,route_short_name,route_long_name,end_times.arrival_time as end_time
FROM stop_times
join trips on trips.trip_id =
stop_times.trip_id
--- a/include/db/trip-dao.inc.php
+++ b/include/db/trip-dao.inc.php
@@ -133,6 +133,22 @@
$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;
--- a/routeList.php
+++ b/routeList.php
@@ -119,8 +119,28 @@
}
else if ($numberSeries) {
$routes = getRoutesByNumberSeries($numberSeries);
+ $filteredRoutes = Array();
foreach ($routes as $route) {
- echo '<li> <a href="trip.php?routeid=' . $route['route_id'] . '"><h3>' . $route['route_short_name'] . "</h3><p>" . $route['route_long_name'] . " (" . ucwords($route['service_id']) . ")</p></a></li>\n";
+ foreach (getRouteHeadsigns($route['route_id']) as $headsign) {
+ $start = $headsign['stop_name'];
+ $serviceday = service_period_day ( $headsign['service_id']);
+ $key = $route['route_short_name'].".".$headsign['direction_id'];
+ if (isset($filteredRoutes[$key])) {
+ $filteredRoutes[$key]['route_ids'][] = $route['route_id'];
+ $filteredRoutes[$key]['route_ids'] = array_unique($filteredRoutes[$key]['route_ids']);
+ } else {
+ $filteredRoutes[$key]['route_short_name'] = $route['route_short_name'];
+ $filteredRoutes[$key]['route_long_name'] = "Starting at ".$start;
+ $filteredRoutes[$key]['service_id'] = $serviceday;
+ $filteredRoutes[$key]['direction_id'] = $headsign['direction_id'];
+ }
+ }
+ }
+ foreach ($filteredRoutes as $key => $route) {
+ echo '<li> <a href="trip.php?routeids=' . implode(",",$route['route_ids']) . '&directionid='.$route['direction_id'].'"><h3>' . $route['route_short_name'] . "</h3>
+
+ <p>" . $route['route_long_name'] . " (" . ucwords($route['service_id']) . ")</p>
+ </a></li>\n";
}
}
} else {
--- a/stop.php
+++ b/stop.php
@@ -135,7 +135,7 @@
echo '<li>';
$destination = getTripDestination($trip['trip_id']);
- echo '<a href="trip.php?stopid=' . $stopid . '&tripid=' . $trip['trip_id'] . '"><h3>' . $trip['route_short_name'] . " " . $destination['stop_name'] . "</h3><p>";
+ echo '<a href="trip.php?stopid=' . $stopid . '&tripid=' . $trip['trip_id'] . '"><h3>' . $trip['route_short_name'] . " towards " . $destination['stop_name'] . "</h3><p>";
$viaPoints = viaPointNames($trip['trip_id'], $trip['stop_sequence']);
if ($viaPoints != "")
echo '<br><span class="viaPoints">Via: ' . $viaPoints . '</span>';
--- a/trip.php
+++ b/trip.php
@@ -17,58 +17,92 @@
*/
include ('include/common.inc.php');
$routetrips = Array();
-if (isset($routeid) && !isset($tripid)) {
- $trip = getRouteNextTrip($routeid);
+if (isset($routeids) && !isset($tripid)) {
+ foreach ($routeids as $routeid) {
+ $possibleTrip = getRouteNextTrip($routeid);
+ if (!isset($trip) || strtotime($possibleTrip['departure_time']) < strtotime($trip['departure_time'])) {
+ $trip = getRouteNextTrip($routeid);
+ }
+ }
$tripid = $trip['trip_id'];
} else {
$trip = getTrip($tripid);
- $routeid = $trip["route_id"];
+ $similarRoutes = getRoutesByNumber($trip['route_short_name'], $trip['direction_id'], service_period_day($trip["service_id"]));
+ $routeids = Array();
+ foreach ($similarRoutes as $similarRoute) {
+ $routeids[] = $similarRoute['route_id'];
+ }
+ $routeids = array_unique($routeids);
}
-
- $destination = getTripDestination($trip['trip_id']);
+$directionid = $trip['direction_id'];
+$service_period = service_period_day($trip["service_id"]);
+$destination = getTripDestination($trip['trip_id']);
include_header("Stops on " . $trip['route_short_name'] . ' ' . $destination['stop_name'], "trip");
trackEvent("Route/Trip View", "View Route", $trip['route_short_name'] . ' ' . $destination['stop_name'], $routeid);
echo '<span class="content-secondary">';
echo '<a href="' . $trip['route_url'] . '">View Original Timetable/Map</a>';
echo '<h2>Via:</h2> <small>' . viaPointNames($tripid) . '</small>';
echo '<h2>Other Trips:</h2> ';
-$routeTrips = getRouteTrips($routeid);
+echo "getRoutesTrips(".print_r($routeids,true).", {$trip['direction_id']}, $service_period) $tripid";
+$routeTrips = getRoutesTrips($routeids, $trip['direction_id'], $service_period);
foreach ($routeTrips as $key => $othertrip) {
- if ($othertrip['trip_id'] != $tripid) {
- echo '<a href="trip.php?tripid=' . $othertrip['trip_id'] . "&routeid=" . $routeid . '">' . str_replace(" ", ":00", str_replace(":00", " ", $othertrip['arrival_time'])) . '</a> ';
- } else {
+ // if ($othertrip['trip_id'] != $tripid) {
+ echo '<a href="trip.php?tripid=' . $othertrip['trip_id'] . "&routeids=" . implode(",", $routeids) . '">' . str_replace(" ", ":00", str_replace(":00", " ", $othertrip['arrival_time'])) . '</a> ';
+ // } else {
// skip this trip but look forward/back
if ($key - 1 > 0)
$prevTrip = $routeTrips[$key - 1]['trip_id'];
if ($key + 1 < sizeof($routeTrips))
$nextTrip = $routeTrips[$key + 1]['trip_id'];
- }
+ // }
}
flush();
@ob_flush();
echo '<h2>Other directions/timing periods:</h2> ';
$otherDir = 0;
+$filteredRoutes = Array();
foreach (getRoutesByNumber($trip['route_short_name']) as $row) {
- if ($row['route_id'] != $routeid) {
- echo '<a href="trip.php?routeid=' . $row['route_id'] . '">' . $row['route_long_name'] . ' (' . ucwords($row['service_id']) . ')</a> ';
- $otherDir++;
+
+ foreach (getRouteHeadsigns($row['route_id']) as $headsign) {
+ if ( $headsign['direction_id'] != $directionid || service_period_day($headsign['service_id']) != $service_period) {
+ echo "{$headsign['direction_id']} != $directionid || ".service_period_day($headsign['service_id'])." != $service_period <br>";
+ $start = $headsign['stop_name'];
+
+ $serviceday = service_period_day($headsign['service_id']);
+ $key = $row['route_short_name'] . "." . $headsign['direction_id'];
+ if (isset($filteredRoutes[$key])) {
+ $filteredRoutes[$key]['route_ids'][] = $row['route_id'];
+ $filteredRoutes[$key]['route_ids'] = array_unique($filteredRoutes[$key]['route_ids']);
+ } else {
+ $filteredRoutes[$key]['route_short_name'] = $row['route_short_name'];
+ $filteredRoutes[$key]['route_long_name'] = "Starting at " . $start;
+ $filteredRoutes[$key]['service_id'] = $serviceday;
+ $filteredRoutes[$key]['direction_id'] = $headsign['direction_id'];
+ }
+ }
}
}
-if ($otherDir == 0)
+foreach ($filteredRoutes as $key => $row) {
+ echo '<a href="trip.php?routeids=' . implode(",",$row['route_ids']) . '&directionid='.$row['direction_id'].'">' . $row['route_long_name'] . ' (' . ucwords($row['service_id']) . ')</a> ';
+ $otherDir++;
+}
+
+if ($otherDir == 0) {
echo "None";
+}
echo '</span><span class="content-primary">';
flush();
@ob_flush();
echo "<div class='ui-header' style='overflow: visible; height: 1.5em'>";
if ($nextTrip)
- echo '<a href="trip.php?tripid=' . $nextTrip . "&routeid=" . $routeid . '" data-icon="arrow-r" class="ui-btn-right">Next Trip</a>';
+ echo '<a href="trip.php?tripid=' . $nextTrip . "&routeids=" . implode(",", $routeids) . '" data-icon="arrow-r" class="ui-btn-right">Next Trip</a>';
if ($prevTrip)
- echo '<a href="trip.php?tripid=' . $prevTrip . "&routeid=" . $routeid . '" data-icon="arrow-l" class="ui-btn-left">Previous Trip</a>';
+ echo '<a href="trip.php?tripid=' . $prevTrip . "&routeids=" . implode(",", $routeids) . '" data-icon="arrow-l" class="ui-btn-left">Previous Trip</a>';
echo "</div>";
echo ' <ul data-role="listview" data-inset="true">';
$stopsGrouped = Array();
$tripStopTimes = getTripStopTimes($tripid);
-echo '<li data-role="list-divider">' . $tripStopTimes[0]['arrival_time'] . ' to ' . $tripStopTimes[sizeof($tripStopTimes) - 1]['arrival_time'] . ' ' . $destination['stop_name'] . ' (' . ucwords($tripStopTimes[0]['service_id']) . ')</li>';
+echo '<li data-role="list-divider">' . $tripStopTimes[0]['arrival_time'] . ' to ' . $tripStopTimes[sizeof($tripStopTimes) - 1]['arrival_time'] . ' towards ' . $destination['stop_name'] . ' (' . ucwords(service_period_day($tripStopTimes[0]['service_id'])) . ')</li>';
foreach ($tripStopTimes as $key => $tripStopTime) {
if ($key + 1 > sizeof($tripStopTimes) || stopCompare($tripStopTimes[$key]["stop_name"]) != stopCompare($tripStopTimes[$key + 1]["stop_name"])) {
echo '<li>';
@@ -84,8 +118,8 @@
echo '<br>' . distance($tripStopTime['stop_lat'], $tripStopTime['stop_lon'], $_SESSION['lat'], $_SESSION['lon'], true) . 'm away';
}
echo '</p>';
- echo stopGroupTitle($tripStopTime['stop_name'],$tripStopTime['stop_desc']) . '<br><small>' . sizeof($stopsGrouped["stop_ids"]) . ' stops</small>';
-
+ echo stopGroupTitle($tripStopTime['stop_name'], $tripStopTime['stop_desc']) . '<br><small>' . sizeof($stopsGrouped["stop_ids"]) . ' stops</small>';
+
echo '</a></li>';
flush();
@ob_flush();