From: Maxious Date: Wed, 25 Jan 2012 08:40:29 +0000 Subject: Fix search routes by final destination X-Git-Url: https://maxious.lambdacomplex.org/git/?p=busui.git&a=commitdiff&h=d078a1dd1e3ccf267638eecb0f8435b3adedf5db --- Fix search routes by final destination --- --- a/about.php +++ b/about.php @@ -34,8 +34,9 @@
Some icons by Joseph Wain / glyphish.com
Native clients also available for iPhone(cbrTimetable by Sandor Kolotenko - , ACT Buses by David Sullivan) - , Android (MyBus 2.0 by Imagine Team) + , ACT Buses by David Sullivan, Bus Trips ACT by Molson Chengalath) + , Android (MyBus 2.0 by Imagine Team, GetMe2 Canberra by +Colin Thompson ) and Windows Phone 7 (TransHub Canberra by Soul Solutions) Other web clients include iTranzit.
GTFS-realtime API: --- a/geo/route.kml.php +++ b/geo/route.kml.php @@ -21,8 +21,8 @@ echo ''.$route['route_short_name']." ".$route['route_long_name']."]]> "; echo "#yellowLineGreenPoly"; - $trips = getRouteTrips($routeid); - echo getTripShape($trips[0]['trip_id']); + $trip = getRouteNextTrip($routeid); + echo getTripShape($trip['trip_id']); echo "\n\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 @@ -60,11 +60,14 @@ if (isset($_REQUEST['tripid'])) { $tripid = filter_var($_REQUEST['tripid'], FILTER_SANITIZE_STRING); } +if (isset($_REQUEST['routeid'])) { + $routeid = filter_var($_REQUEST['routeid'], FILTER_SANITIZE_STRING); +} +if (isset($_REQUEST['directionid'])) { + $directionid = filter_var($_REQUEST['directionid'], 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-session.inc.php +++ b/include/common-session.inc.php @@ -17,14 +17,6 @@ */ // you have to open the session to be able to modify or remove it session_start(); -if (isset($_REQUEST['service_period'])) { - $_SESSION['service_period'] = filter_var($_REQUEST['service_period'], FILTER_SANITIZE_STRING); - sessionUpdated(); -} -if (isset($_REQUEST['time'])) { - $_SESSION['time'] = filter_var($_REQUEST['time'], FILTER_SANITIZE_STRING); - sessionUpdated(); -} if (isset($_REQUEST['geolocate']) && $_REQUEST['geolocate'] != "Enter co-ordinates or address here") { $geocoded = false; if (isset($_REQUEST['lat']) && isset($_REQUEST['lon'])) { @@ -69,8 +61,10 @@ } //debug(print_r($_SESSION, true) , "session"); -function current_time() { - return ($_SESSION['time'] ? $_SESSION['time'] : date("H:i:s")); +function current_time($time = "") { + if ($_REQUEST['time']) return $_REQUEST['time']; + else if ($time != "") date("H:i:s",$time); + else return date("H:i:s"); } ?> --- a/include/common-template.inc.php +++ b/include/common-template.inc.php @@ -175,7 +175,7 @@
'; if ($GTFSREnabled) { $overrides = getServiceOverride(); - if ($overrides['service_id']) { + if (isset($overrides['service_id'])) { if ($overrides['service_id'] == "noservice") { echo '
Buses are not running today due to industrial action/public holiday. See http://www.action.act.gov.au for details.
'; @@ -212,9 +212,37 @@ } echo "\n
"; } - +function timeSettings() { + global $service_periods; +echo '
+

Change Time (' . (isset($_REQUEST['time']) ? $_REQUEST['time'] : "Current Time,") . ' ' . ucwords(service_period()) . ')...

+
+ + + + +
+
+ + + Current Time? +
+
+ + + +
+ + +
+
'; +} function placeSettings() { - global $service_periods; + $geoerror = false; $geoerror = !isset($_SESSION['lat']) || !isset($_SESSION['lat']) || $_SESSION['lat'] == "" || $_SESSION['lon'] == ""; --- a/include/common-transit.inc.php +++ b/include/common-transit.inc.php @@ -23,15 +23,18 @@ function service_period($date = "") { - if (isset($_SESSION['service_period'])) - return $_SESSION['service_period']; + if (isset($_REQUEST['service_period'])) { + return $_REQUEST['service_period']; + } + $override = getServiceOverride($date); - if ($override['service_id']) { - $idParts = explode("-",$override['service_id']); - return strtolower($idParts[2]); - } - - switch (date('w', ($date != "" ? $date : time()))) { + if (isset($override['service_id'])) { + return strtolower($override['service_id']); + } + $date = ($date != "" ? $date : time()); + $dow = date('w', $date); + + switch ($dow) { case 0: return 'sunday'; case 6: @@ -40,16 +43,28 @@ return 'weekday'; } } -function service_ids($service_period) { + +function service_ids($service_period, $date = "") { switch ($service_period) { case 'sunday': - return Array("2010-TUGGSUN-Sunday-20","2010-BELCSUN-Sunday-19"); + return Array("Sunday", "Sunday"); case 'saturday': - return Array("2010-BELCSAT-Saturday-19","2010-TUGGSAT-Saturday-19"); + return Array("Saturday", "Saturday"); default: - //return 'weekday'; - return Array("2010-BELCMAST-Weekday-15","2010-TUGGMAST-Weekday-14"); - } + $date = ($date != "" ? $date : time()); +// school holidays + $ymd = date('Ymd', $date); + $dow = date('w', $date); + if (intval($ymd) < "20120203" && $dow != 0 && $dow != 6) { + return Array("Weekday-SchoolVacation", "Weekday-SchoolVacation"); + } else { + return Array("Weekday", "Weekday"); + } + } +} + +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, trip_headsign, 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, trip_headsign, 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, $directionID) { + $trip = getRouteNextTrip($routeID, $directionID); + $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"; @@ -77,30 +86,6 @@ $query = "Select * from routes order by route_short_name;"; debug($query, "database"); $query = $conn->prepare($query); - $query->execute(); - if (!$query) { - databaseError($conn->errorInfo()); - return Array(); - } - return $query->fetchAll(); -} - -function getRoutesByNumber($routeNumber = "") { - 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 = -routes.route_id join stop_times on stop_times.trip_id = trips.trip_id -where route_short_name = :routeNumber OR route_short_name LIKE :routeNumber2 order by route_short_name;"; - } else { - $query = "SELECT DISTINCT route_short_name from routes order by route_short_name"; - } - debug($query, "database"); - $query = $conn->prepare($query); - if ($routeNumber != "") { - $query->bindParam(":routeNumber", $routeNumber); - $routeNumber2 = "% " . $routeNumber; - $query->bindParam(":routeNumber2", $routeNumber2); - } $query->execute(); if (!$query) { databaseError($conn->errorInfo()); @@ -132,31 +117,43 @@ return $query->fetchAll(); } -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 +function getRouteNextTrip($routeID, $directionID) { + global $conn; + + $query = "select routes.route_id,direction_id,trips.trip_id,trip_headsign,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 between :currentTime and :futureTime +and routes.route_id = :routeID and trips.direction_id = :directionID order by arrival_time limit 1"; debug($query, "database"); $query = $conn->prepare($query); $query->bindParam(":currentTime", current_time()); + $futureTime = current_time(strtotime(current_time() ." +2h")); + if (date("h",strtotime(current_time()) > 22)) $futureTime = "23:59:59"; + $query->bindParam(":futureTime", $futureTime); $query->bindParam(":routeID", $routeID); - $query->execute(); + $query->bindParam(":directionID", $directionID); + $query->execute(); + databaseError($conn->errorInfo()); if (!$query) { databaseError($conn->errorInfo()); return Array(); } $r = $query->fetch(PDO :: FETCH_ASSOC); - - // past last trip of the day special case - if (sizeof($r) < 16) { - $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 routes.route_id = :routeID order by + return $r; +} + +function getRouteFirstTrip($routeID,$directionID) { + 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 routes.route_id = :routeID +and trips.direction_id = :directionID order by arrival_time DESC limit 1"; debug($query, "database"); $query = $conn->prepare($query); $query->bindParam(":routeID", $routeID); + + $query->bindParam(":directionID", $directionID); $query->execute(); if (!$query) { databaseError($conn->errorInfo()); @@ -164,12 +161,11 @@ } $r = $query->fetch(PDO :: FETCH_ASSOC); - } - return $r; -} - -function getRouteAtStop($routeID, $stop_id) { - $nextTrip = getRouteNextTrip($routeID); + return $r; +} + +function getRouteAtStop($routeID, $directionID, $stop_id) { + $nextTrip = getRouteNextTrip($routeID, $directionID); if ($nextTrip['trip_id']) { foreach (getTripStopTimes($nextTrip['trip_id']) as $tripStop) { if ($tripStop['stop_id'] == $stop_id) @@ -179,40 +175,59 @@ 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 getRouteTrips($routeID, $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 = :routeID) " . $directionSQL . " and stop_sequence = '1' order by +arrival_time "; + debug($query, "database"); + $query = $conn->prepare($query); + $query->bindParam(":routeID", $routeID); + $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 + /* $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";*/ + $query = "select route_id, direction_id, stop_name, b.trip_id, b.stop_sequence from (select route_id, direction_id, max(stop_sequence) as stop_sequence, max(a.trip_id) as trip_id from stop_times inner join (SELECT route_id, direction_id, max(trip_id) as trip_id + from trips group by route_id,direction_id) as a on stop_times.trip_id = a.trip_id group by route_id, direction_id) as b inner join stop_times on b.trip_id = stop_times.trip_id inner join stops on stop_times.stop_id = stops.stop_id where stop_times.stop_sequence = b.stop_sequence and stop_name = :destination order by route_id;"; } 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); + $query = "select stop_name from (select route_id, direction_id, max(stop_sequence) as stop_sequence, max(a.trip_id) as trip_id from stop_times inner join (SELECT route_id, direction_id, max(trip_id) as trip_id + from trips group by route_id,direction_id) as a on stop_times.trip_id = a.trip_id group by route_id, direction_id) as b inner join stop_times on b.trip_id = stop_times.trip_id inner join stops on stop_times.stop_id = stops.stop_id where stop_times.stop_sequence = b.stop_sequence group by stop_name order by stop_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,35 +241,40 @@ 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); - $query->bindParam(":service_period", $service_period); - $suburb = "%" . $suburb . ";%"; +WHERE stop_desc 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); + $suburb = "%Suburb: %" . $suburb . "%"; $query->bindParam(":suburb", $suburb); $query->execute(); - if (!$query) { - databaseError($conn->errorInfo()); - return Array(); - } + + databaseError($conn->errorInfo()); + return $query->fetchAll(); } 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 != "") $limitSQL = " LIMIT :limit "; global $conn; - $query = "SELECT service_id,trips.route_id,route_short_name,route_long_name,min(stops.stop_id) as stop_id, + $query = "SELECT service_id,trips.route_id,trips.direction_id,route_short_name,route_long_name,min(stops.stop_id) as stop_id, min(ST_Distance(position, ST_GeographyFromText('SRID=4326;POINT($lng $lat)'), FALSE)) as distance FROM stop_times join trips on trips.trip_id = stop_times.trip_id @@ -262,7 +282,7 @@ join stops on stops.stop_id = stop_times.stop_id WHERE (service_id=:service_periodA OR service_id=:service_periodB) AND ST_DWithin(position, ST_GeographyFromText('SRID=4326;POINT($lng $lat)'), :distance, FALSE) - group by service_id,trips.route_id,route_short_name,route_long_name + group by service_id,trips.route_id,trips.direction_id,route_short_name,route_long_name order by distance $limitSQL"; debug($query, "database"); $query = $conn->prepare($query); --- a/include/db/stop-dao.inc.php +++ b/include/db/stop-dao.inc.php @@ -46,7 +46,7 @@ } } $query .= " order by stop_name;"; - debug($query,"database"); + debug($query, "database"); $query = $conn->prepare($query); if ($firstLetter != "") $query->bindParam(":firstLetter", $firstLetter); @@ -167,16 +167,16 @@ 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]; $limitSQL = ""; if ($limit != "") $limitSQL .= " LIMIT :limit "; - + 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,trips.trip_headsign,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 @@ -184,7 +184,7 @@ WHERE stop_times.arrival_time IS NOT NULL group by trip_id) as end_times WHERE stop_times.stop_id = :stopID AND stop_times.trip_id = end_times.trip_id -AND (service_id=:service_periodA OR service_id=:service_periodB) ".($route_short_name != "" ? " AND route_short_name = :route_short_name ":"")." +AND (service_id=:service_periodA OR service_id=:service_periodB) " . ($route_short_name != "" ? " AND route_short_name = :route_short_name " : "") . " AND end_times.arrival_time > :afterTime ORDER BY end_time $limitSQL"; } else { @@ -194,7 +194,7 @@ stop_times.trip_id join routes on trips.route_id = routes.route_id WHERE stop_times.stop_id = :stopID -AND (service_id=:service_periodA OR service_id=:service_periodB) ".($route_short_name != "" ? " AND route_short_name = :route_short_name ":"")." +AND (service_id=:service_periodA OR service_id=:service_periodB) " . ($route_short_name != "" ? " AND route_short_name = :route_short_name " : "") . " ORDER BY arrival_time $limitSQL"; } debug($query, "database"); --- 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/index.php +++ b/index.php @@ -20,7 +20,7 @@
-

busness time


Canberra Bus Timetables and Trip Planner +

busness time


Canberra Bus Timetables and Trip Planner
Launch Trip Planner... @@ -37,9 +37,9 @@
  • Routes By Suburb
  • Nearby Routes
  • + Busness R&D + MyWay Balance and Timeliness Survey Results Busness R&D'; - echo ' MyWay Balance and Timeliness Survey Results'; include_footer(true) ?> --- a/myway/myway_api.json.php +++ b/myway/myway_api.json.php @@ -84,6 +84,9 @@ curl_setopt($ch, CURLOPT_REFERER, "https://www.transport.act.gov.au/ARTS/getbalance.asp"); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_TIMEOUT, 30); + // ssl ignore + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); //execute post $pageHTML = curl_exec($ch); if (curl_errno($ch)) --- a/myway/myway_timeliness.php +++ b/myway/myway_timeliness.php @@ -41,8 +41,18 @@ $labels = Array(); $lastRoute = ""; foreach ($query->fetchAll() as $delta) { + /*$routeIDParts = explode(" ",$delta['route_name']); + $routeNumber = $routeIDParts[0]; + $routeDirection = $routeIDParts[1]; + if (preg_match('/31./',$routeName)) { + $routeName = "312-319"." ".$routeDirection; + } else { + $routeName = $delta['route_name']; + }*/ + $routeName = $delta['route_name']; - if (preg_match('/z/',$routeName)) { + + if (preg_match('/31./',$routeName)) { $routeName = "312-319"; } else { $routeName = preg_replace('/\D/', '', $routeName); --- a/myway/myway_timeliness_calculate.php +++ b/myway/myway_timeliness_calculate.php @@ -58,10 +58,18 @@ $search_time = date("H:i:s", strtotime($obsv['time']) - (60 * 60)); // 30 minutes margin $date = date("c", strtotime($obsv['time'])); $timing_period = service_period(strtotime($date)); + + // little hack for public holidays nolonger active; weekdays and 900+ route numbers don't make sense + if ($timing_period == "weekday" && preg_match('/9../',$obsv["route_short_name"])) { + echo "Potential public holiday detected, trying Sunday timetable.
    "; + + $timing_period = "sunday"; + } + if (isset($obsv["stop_id"]) && $obsv["stop_id"] != "" && $obsv["stop_id"] != "*") { $potentialStops = Array(getStop($obsv["stop_id"])); } else { - echo "Potential stops are a bus station
    "; + echo "No stop_id recorded for this stop_name, potential stops are a bus station
    "; $potentialStops = getStops("", trim(str_replace(Array("Arrival","Arrivals","Arrive Platform 3 Set down only.","Arrive","Set Down Only"), "", $obsv["myway_stop"]))); } //:get myway_stops records @@ -110,7 +118,7 @@ "timeDiff" => $timeDiff, "stop_id" => $potentialStop['stop_id'], "stop_sequence" => $trip['stop_sequence'], - "route_name" => "{$trip['route_short_name']} {$trip['route_long_name']} {$trip['direction']}", + "route_name" => "{$trip['route_short_name']} {$trip['trip_headsign']}", "route_id" => $trip['route_id'] ); echo "Found trip {$trip['trip_id']} at stop {$potentialStop['stop_id']} (#{$potentialStop['stop_name']}, sequence #{$trip['stop_sequence']})
    "; --- a/routeList.php +++ b/routeList.php @@ -18,6 +18,7 @@ include ('include/common.inc.php'); function navbar() { + echo '
      @@ -28,6 +29,39 @@
    '; +} + +function displayRoutes($routes) { + echo '
      '; + foreach ($routes as $route) { + foreach (getRouteHeadsigns($route['route_id']) as $headsign) { + + //print_r($route); + echo '
    • ' . $route['route_id'] . "

      + +

      " . $headsign['trip_headsign'] . (strstr($headsign['trip_headsign'], "bound") === false ? "bound" : "") . ", starting at " . $headsign['stop_name'] . " (" . ucwords($headsign['service_id']) . ")

      "; + + echo"
    • \n"; + } + } +} + +function displayNearbyRoutes($routes) { + echo ' '; -} else if (isset($nearby) || isset($suburb)) { - $routes = Array(); +} else if (isset($suburb)) { + if ($suburb) { include_header($suburb . " - " . ucwords(service_period()), "routeList"); navbar(); - timePlaceSettings(); + timeSettings(); trackEvent("Route Lists", "Routes By Suburb", $suburb); - $routes = getRoutesBySuburb($suburb); + displayRoutes(getRoutesBySuburb($suburb)); } - if (isset($nearby)) { - include_header("Routes Nearby", "routeList", true, true); - trackEvent("Route Lists", "Routes Nearby", $_SESSION['lat'] . "," . $_SESSION['lon']); - navbar(); - placeSettings(); - if (!isset($_SESSION['lat']) || !isset($_SESSION['lat']) || $_SESSION['lat'] == "" || $_SESSION['lon'] == "") { - include_footer(); - die(); - } - $routes = getRoutesNearby($_SESSION['lat'], $_SESSION['lon']); +} else if (isset($nearby)) { + $routes = Array(); + include_header("Routes Nearby", "routeList", true, true); + trackEvent("Route Lists", "Routes Nearby", $_SESSION['lat'] . "," . $_SESSION['lon']); + navbar(); + placeSettings(); + if (!isset($_SESSION['lat']) || !isset($_SESSION['lat']) || $_SESSION['lat'] == "" || $_SESSION['lon'] == "") { + include_footer(); + die(); } - echo '
        '; - if ($routes) { - foreach ($routes as $route) { - echo '
      • ' . $route['route_short_name'] . "

        " . $route['route_long_name'] . " (" . ucwords($route['service_id']) . ")

        "; - if (isset($nearby)) { - $time = getRouteAtStop($route['route_id'], $route['stop_id']); - echo '' . ($time['arrival_time'] ? $time['arrival_time'] : "No more trips today") . "
        " . floor($route['distance']) . 'm away
        '; - } - echo "
      • \n"; - } + $routes = getRoutesNearby($_SESSION['lat'], $_SESSION['lon']); + + + if (sizeof($routes) > 0) { + displayNearbyRoutes($routes); } else { + echo '
          '; echo "
        • No routes nearby.
        • "; } } else if (isset($bynumber) || isset($numberSeries)) { @@ -84,7 +113,7 @@ navbar(); echo '
            '; if (isset($bynumber)) { - $routes = getRoutesByNumber(); + $routes = getRoutes(); $routeSeries = Array(); $seriesRange = Array(); foreach ($routes as $key => $routeNumber) { @@ -118,22 +147,17 @@ } } else if ($numberSeries) { - $routes = getRoutesByNumberSeries($numberSeries); - foreach ($routes as $route) { - echo '
          • ' . $route['route_short_name'] . "

            " . $route['route_long_name'] . " (" . ucwords($route['service_id']) . ")

          • \n"; - } + displayRoutes(getRoutesByNumberSeries($numberSeries)); } } else { include_header("Routes by Destination", "routeList"); navbar(); echo '
              '; if (isset($routeDestination)) { - foreach (getRoutesByDestination($routeDestination) as $route) { - echo '
            • ' . $route["route_short_name"] . '

              ' . $route["route_long_name"] . " (" . ucwords($route['service_id']) . ")

            • \n"; - } + displayRoutes(getRoutesByDestination($routeDestination)); } else { foreach (getRoutesByDestination() as $destination) { - echo '
            • ' . $destination['route_long_name'] . "...
            • \n"; + echo '
            • ' . $destination['stop_name'] . "...
            • \n"; } } } --- a/servicealerts/importer.py +++ b/servicealerts/importer.py @@ -1,5 +1,3 @@ -#dependencies http://code.google.com/p/python-twitter/ - # info # http://stackoverflow.com/questions/4206882/named-entity-recognition-with-preset-list-of-names-for-python-php/4207128#4207128 # http://alias-i.com/lingpipe/demos/tutorial/ne/read-me.html approximate dist @@ -12,11 +10,17 @@ # http://esa.act.gov.au/feeds/currentincidents.xml # source: https://gist.github.com/322906/90dea659c04570757cccf0ce1e6d26c9d06f9283 +# to install python -m nltk.downloader punkt import nltk -import twitter +import tweepy import psycopg2 +import pickle + +from iniparse import INIConfig + def insert_service_alert_sitewide(heading, message, url): - + print "NaN" + def insert_service_alert_for_street(streets, heading, message, url): conn_string = "host='localhost' dbname='energymapper' user='postgres' password='snmc'" # print the connection string we will use to connect @@ -29,30 +33,22 @@ cursor = conn.cursor() # execute our Query - cursor.execute("select max(value), extract(dow from max(time)) as dow, \ -extract(year from max(time))::text || lpad(extract(month from max(time))::text,2,'0') \ -|| lpad(extract(month from max(time))::text,2,'0') as yearmonthweek, to_char(max(time),'J') \ -from environmentdata_values where \"dataSourceID\"='NSWAEMODemand' \ -group by extract(dow from time), extract(year from time), extract(week from time) \ -order by extract(year from time), extract(week from time), extract(dow from time)") + cursor.execute("") # retrieve the records from the database records = cursor.fetchall() for record in records: ys.append(record[0]) -# >>> cur.execute("INSERT INTO test (num, data) VALUES (%s, %s)", (42, 'bar')) -#>>> cur.statusmessage -#'INSERT 0 1' + # >>> cur.execute("INSERT INTO test (num, data) VALUES (%s, %s)", (42, 'bar')) + #>>> cur.statusmessage + #'INSERT 0 1' except: # Get the most recent exception exceptionType, exceptionValue, exceptionTraceback = sys.exc_info() # Exit the script and print an error telling what happened. sys.exit("Database connection failed!\n ->%s" % (exceptionValue)) -def get_tweets(user): - tapi = twitter.Api() - return tapi.GetUserTimeline(user) def extract_entity_names(t): entity_names = [] @@ -86,3 +82,23 @@ # Print unique entity names print set(entity_names) +cfg = INIConfig(open('/tmp/aws.ini')) + +auth = tweepy.OAuthHandler(cfg.api_keys.twitter_consumer_key, cfg.api_keys.twitter_consumer_secret) +auth.set_access_token(cfg.api_keys.twitter_access_token, cfg.api_keys.twitter_access_token_secret) + +#api = tweepy.API(auth) +api = tweepy.API() +# If the authentication was successful, you should +# see the name of the account print out +#print api.me().name +# https://github.com/tweepy/tweepy/blob/master/tweepy/api.py +for status in api.user_timeline(screen_name="ACTPol_Traffic",exclude_replies='true'): + print status.text + print status.created_at + print extract_names(status.text) +# print api.update_status(status="test") + +last_tweet_ids = { "lion": "111", "kitty": "2222" } +pickle.dump( last_tweet_ids, open( "save.p", "wb" ) ) +last_tweet_ids = pickle.load( open( "save.p", "rb" ) ) --- /dev/null +++ b/servicealerts/punkt.zip --- a/stop.php +++ b/stop.php @@ -73,8 +73,12 @@ //} } } -include_header($stop['stop_name'], "stop"); - +if (sizeof($stops) > 0) { +$stopDescParts = explode("
              ",$stop['stop_desc']); +include_header(trim(str_replace("Street: ","",$stopDescParts[0])), "stop"); +} else { + include_header($stop['stop_name']); +} /* $serviceAlerts = json_decode(getPage(curPageURL() . "/servicealerts_api.php?filter_class=stop&filter_id=".$stopid) , true); foreach($serviceAlerts['entities'] as $serviceAlert) { @@ -96,29 +100,7 @@ )); } -// time settings -echo '
              -

              Change Time (' . (isset($_SESSION['time']) ? $_SESSION['time'] : "Current Time,") . ' ' . ucwords(service_period()) . ')...

              -
              -
              -
              - - - Current Time? -
              -
              - - - -
              - - -
              -
              '; +timeSettings(); echo ''; echo '
                '; @@ -128,14 +110,41 @@ } else { $trips = getStopTripsWithTimes($stopid); } + +echo "
                "; +// if we have too many trips, cut down to size. +if (sizeof($trips) > 10) { + $trips = array_splice($trips, 0,10); +} + +// later/earlier button setup +if (sizeof($trips) == 0) { + $time = isset($_REQUEST['time']) ? strtotime($_REQUEST['time']) : time(); + $earlierTime = $time - (90 * 60); + $laterTime = $time + (90 * 60); +} else { + $tripsKeys = array_keys($trips); + $earlierTime = strtotime($trips[$tripsKeys[0]]['arrival_time']) - (90 * 60); + $laterTime = strtotime($trips[$tripsKeys[sizeof($trips) - 1]]['arrival_time']) - 60; +} +if (sizeof($stopids) > 0) { + $stopidurl = "stopids=" . implode(",", $stopids); +} else { + $stopidurl = "stopid=$stopid"; +} +if (sizeof($trips) >= 10) { + echo 'Later Trips'; +} +echo 'Earlier Trips'; +echo "
                "; if (sizeof($trips) == 0) { echo "
              • No trips in the near future.
              • "; } else { foreach ($trips as $trip) { echo '
              • '; - - $destination = getTripDestination($trip['trip_id']); - echo '

                ' . $trip['route_short_name'] . " " . $destination['stop_name'] . "

                "; + + $destination = getTripDestination($trip['trip_id']); + echo '

                '. $trip['route_short_name'] . " towards " . $destination['stop_name'] . "

                "; $viaPoints = viaPointNames($trip['trip_id'], $trip['stop_sequence']); if ($viaPoints != "") echo '
                Via: ' . $viaPoints . ''; --- a/stopList.php +++ b/stopList.php @@ -36,8 +36,8 @@ navbar(); echo '

                  '; if (!isset($firstLetter)) { - foreach (range('A', 'Z') as $letter) { - echo "
                • $letter...
                • \n"; + foreach (range('A', 'Y') as $letter) { // no suburbs start with J, Q, U, V, X or Z + if ($letter != "J" && $letter != "Q" && $letter != "U" && $letter != "V" && $letter != "X") echo "
                • $letter...
                • \n"; } } else { foreach ($suburbs as $suburb) { @@ -86,9 +86,9 @@ navbar(); } echo '
                    '; - if (!isset($firstLetter) && !isset($suburb) && !isset($nearby)) { - foreach (range('A', 'Z') as $letter) { - echo "
                  • $letter...
                  • \n"; + if (!isset($firstLetter) && !isset($suburb) && !isset($nearby)) { // all stops by letter + foreach (range('A', 'Y') as $letter) { // no streets start with X or Z + if ($letter != "X") echo "
                  • $letter...
                  • \n"; } } else { //var_dump($stops); @@ -102,7 +102,7 @@ // subsequent duplicates $stopsGrouped["stop_ids"][] = $stop['stop_id']; echo '
                  • '; - echo ''; + echo ''; if (isset($_SESSION['lat']) && isset($_SESSION['lon'])) { echo '' . distance($stop['stop_lat'], $stop['stop_lon'], $_SESSION['lat'], $_SESSION['lon'], true) . 'm away'; } --- a/trip.php +++ b/trip.php @@ -18,44 +18,53 @@ include ('include/common.inc.php'); $routetrips = Array(); if (isset($routeid) && !isset($tripid)) { - $trip = getRouteNextTrip($routeid); + $trip = getRouteNextTrip($routeid,$directionid); + + if (!($trip)) { + $trip = getRouteFirstTrip($routeid,$directionid); + } $tripid = $trip['trip_id']; } else { $trip = getTrip($tripid); - $routeid = $trip["route_id"]; + $routeid = $trip['route_id']; } - - $destination = getTripDestination($trip['trip_id']); +$directionid = $trip['direction_id']; +$service_period = strtolower($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 ''; echo 'View Original Timetable/Map'; echo '

                    Via:

                    ' . viaPointNames($tripid) . ''; echo '

                    Other Trips:

                    '; -$routeTrips = getRouteTrips($routeid); +$routeTrips = getRouteTrips($routeid, $trip['direction_id'], $service_period); foreach ($routeTrips as $key => $othertrip) { - if ($othertrip['trip_id'] != $tripid) { - echo '' . str_replace(" ", ":00", str_replace(":00", " ", $othertrip['arrival_time'])) . ' '; - } 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']; - } + // if ($othertrip['trip_id'] != $tripid) { + echo '' . str_replace(" ", ":00", str_replace(":00", " ", $othertrip['arrival_time'])) . ' '; + // } 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 '

                    Other directions/timing periods:

                    '; $otherDir = 0; -foreach (getRoutesByNumber($trip['route_short_name']) as $row) { - if ($row['route_id'] != $routeid) { - echo '' . $row['route_long_name'] . ' (' . ucwords($row['service_id']) . ') '; - $otherDir++; + + foreach (getRouteHeadsigns($routeid) as $headsign) { + if ($headsign['direction_id'] != $directionid || strtolower($headsign['service_id']) != $service_period) { + + echo ' Starting at ' . $headsign['stop_name'] . ' (' . $headsign['service_id'] . ') '; + $otherDir++; + } } + +if ($otherDir == 0) { + echo "None"; } -if ($otherDir == 0) - echo "None"; echo ''; flush(); @ob_flush(); @@ -68,7 +77,7 @@ echo '
                      '; $stopsGrouped = Array(); $tripStopTimes = getTripStopTimes($tripid); -echo '
                    • ' . $tripStopTimes[0]['arrival_time'] . ' to ' . $tripStopTimes[sizeof($tripStopTimes) - 1]['arrival_time'] . ' ' . $destination['stop_name'] . ' (' . ucwords($tripStopTimes[0]['service_id']) . ')
                    • '; +echo '
                    • ' . $tripStopTimes[0]['arrival_time'] . ' to ' . $tripStopTimes[sizeof($tripStopTimes) - 1]['arrival_time'] . ' towards ' . $destination['stop_name'] . ' (' . ucwords(strtolower($tripStopTimes[0]['service_id'])) . ')
                    • '; foreach ($tripStopTimes as $key => $tripStopTime) { if ($key + 1 > sizeof($tripStopTimes) || stopCompare($tripStopTimes[$key]["stop_name"]) != stopCompare($tripStopTimes[$key + 1]["stop_name"])) { echo '
                    • '; @@ -84,8 +93,8 @@ echo '
                      ' . distance($tripStopTime['stop_lat'], $tripStopTime['stop_lon'], $_SESSION['lat'], $_SESSION['lon'], true) . 'm away'; } echo '

                      '; - echo stopGroupTitle($tripStopTime['stop_name'],$tripStopTime['stop_desc']) . '
                      ' . sizeof($stopsGrouped["stop_ids"]) . ' stops'; - + echo stopGroupTitle($tripStopTime['stop_name'], $tripStopTime['stop_desc']) . '
                      ' . sizeof($stopsGrouped["stop_ids"]) . ' stops'; + echo '
                    • '; flush(); @ob_flush(); --- a/tripPlanner.php +++ b/tripPlanner.php @@ -182,7 +182,99 @@ curl_close($ch); } } else { + $overrides = getServiceOverride(); + if (isset($overrides['service_id'])) { + echo "Sorry, due to the modified timetable, this trip planner won't work correctly today. Instead, use the Google Maps one below:"; + echo ' + + +
                      + + + + + + + +
                      Link to Google Transit Trip Planner 
                      + Transit Trip Planner
                      Start (e.g. + )
                      + +

                      End (e.g. + ) +
                      + +
                      + + + + + + + + + +
                      DateTime
                      +Plan by: + +
                      + +
                      +
                      + + +'; + } else { tripPlanForm(); + } } include_footer(); ?> --- a/updatedb.php +++ b/updatedb.php @@ -17,7 +17,6 @@ */ if (php_sapi_name() == "cli") { include ('include/common.inc.php'); - $conn = pg_connect("dbname=transitdata user=postgres password=snmc host=localhost") or die('connection failed'); $pdconn = new PDO("pgsql:dbname=transitdata;user=postgres;password=snmc;host=localhost"); /* @@ -34,7 +33,7 @@ // Unzip cbrfeed.zip, import all csv files to database $unzip = false; $zip = zip_open(dirname(__FILE__) . "/cbrfeed.zip"); - $tmpdir = "c:/tmp/"; + $tmpdir = "c:/tmp/cbrfeed/"; mkdir($tmpdir); if ($unzip) { if (is_resource($zip)) { @@ -53,6 +52,7 @@ } foreach (scandir($tmpdir) as $file) { + $headers = Array(); if (!strpos($file, ".txt") === false) { $fieldseparator = ","; $lineseparator = "\n"; @@ -60,33 +60,50 @@ echo "Opening $file \n"; $line = 0; $handle = fopen($tmpdir . $file, "r"); - if ($tablename == "stop_times") { - $stmt = $pdconn->prepare("insert into stop_times (trip_id,stop_id,stop_sequence,arrival_time,departure_time) values(:trip_id, :stop_id, :stop_sequence,:arrival_time,:departure_time);"); - $stmt->bindParam(':trip_id', $trip_id); - $stmt->bindParam(':stop_id', $stop_id); - $stmt->bindParam(':stop_sequence', $stop_sequence); - $stmt->bindParam(':arrival_time', $time); - $stmt->bindParam(':departure_time', $time); - } $distance = 0; $lastshape = 0; $lastlat = 0; $lastlon = 0; + $stmt = null; while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { if ($line == 0) { - - } else { - $query = "insert into $tablename values("; + $headers = array_values($data); + if ($tablename == "stops") { + $headers[] = "position"; + } + if ($tablename == "shapes") { + $headers[] = "shape_pt"; + } + $query = "insert into $tablename ("; + $valueCount = 0; + foreach ($headers as $value) { + $query.=($valueCount > 0 ? "," : "") . pg_escape_string($value); + $valueCount++; + } + $query.= ") values( "; $valueCount = 0; foreach ($data as $value) { - $query.=($valueCount > 0 ? "','" : "'") . pg_escape_string($value); + $query.=($valueCount > 0 ? "," : "") . '?'; $valueCount++; } + if ($tablename == "stops") { + $query.= ", ST_GeographyFromText(?));"; + } else if ($tablename == "shapes") { + $query.= ", ST_GeographyFromText(?));"; + } else { + $query.= ");"; + } + echo $query; + $stmt = $pdconn->prepare($query); + } else { + $values = array_values($data); if ($tablename == "stops") { - $query.= "', ST_GeographyFromText('SRID=4326;POINT({$data[2]} {$data[0]})'));"; - } else if ($tablename == "shapes") { + // Coordinate values are out of range [-180 -90, 180 90] + $values[] = 'SRID=4326;POINT('.$values[5].' '.$values[4].')'; + } + if ($tablename == "shapes") { if ($data[0] != $lastshape) { $distance = 0; $lastshape = $data[0]; @@ -95,28 +112,26 @@ } $lastlat = $data[1]; $lastlon = $data[2]; - $query.= "', $distance, ST_GeographyFromText('SRID=4326;POINT({$data[2]} {$data[1]})'));"; - } else { - $query.= "');"; + + $values[4] = $distance; + $values[] = 'SRID=4326;POINT('.$values[2].' '.$values[1].')'; } - if ($tablename == "stop_times") { - // $query = "insert into $tablename (trip_id,stop_id,stop_sequence) values('{$data[0]}','{$data[3]}','{$data[4]}');"; - $trip_id = $data[0]; - $stop_id = $data[3]; - $stop_sequence = $data[4]; - $time = ($data[1] == "" ? null : $data[1]); +if (substr($values[1],0,2) == '24') $values[1] = "23:59:59"; +if (substr($values[2],0,2) == '24') $values[2] = "23:59:59"; + $stmt->execute($values); + $err = $pdconn->errorInfo(); + if ($err[2] != "" && strpos($err[2], "duplicate key") === false) { + print_r($values); + print_r($err); + die("terminated import due to db error above"); } - } - if ($tablename == "stop_times") { - $stmt->execute(); - } else { - $result = pg_query($conn, $query); } $line++; if ($line % 10000 == 0) echo "$line records... " . date('c') . "\n"; } fclose($handle); + $stmt->closeCursor(); echo "Found a total of $line records in $file.\n"; } }