Kudos for GetMe2 Canberra
--- a/about.php
+++ b/about.php
@@ -35,7 +35,8 @@
Some icons by Joseph Wain / glyphish.com<br />
Native clients also available for iPhone(<a href="http://itunes.apple.com/au/app/cbrtimetable/id444287349?mt=8">cbrTimetable by Sandor Kolotenko</a>
, <a href="http://itunes.apple.com/au/app/act-buses/id376634797?mt=8">ACT Buses by David Sullivan</a>)
- , Android (<a href="https://market.android.com/details?id=com.action">MyBus 2.0 by Imagine Team</a>)
+ , Android (<a href="https://market.android.com/details?id=com.action">MyBus 2.0 by Imagine Team</a>, <A href="https://market.android.com/details?id=GetMe2CanberraFree.source">GetMe2 Canberra by
+Colin Thompson </a>)
and Windows Phone 7 (<a href="http://www.windowsphone.com/en-AU/apps/d840375e-429c-4aa4-a358-80eec6ea9e66">TransHub Canberra by Soul Solutions</a>) Other web clients include <a href="http://canberra.itranzit.com/option.html">iTranzit</a>.
<br />
GTFS-realtime API:
--- a/include/common-template.inc.php
+++ b/include/common-template.inc.php
@@ -175,7 +175,7 @@
<div data-role="content"> ';
if ($GTFSREnabled) {
$overrides = getServiceOverride();
- if ($overrides['service_id']) {
+ if (isset($overrides['service_id'])) {
if ($overrides['service_id'] == "noservice") {
echo '<div id="servicewarning">Buses are <strong>not running today</strong> due to industrial action/public holiday. See <a
href="http://www.action.act.gov.au">http://www.action.act.gov.au</a> for details.</div>';
--- a/include/common-transit.inc.php
+++ b/include/common-transit.inc.php
@@ -18,43 +18,63 @@
$service_periods = Array(
'sunday',
'saturday',
- 'weekday'
+ 'weekday',
+ "Christmas2011","EndOfYearHolidays"
);
-function service_period_day ($spid) {
- $idParts = explode("-",$spid);
- return strtolower($idParts[2]);
-}
+
function service_period($date = "") {
- if (isset($_REQUEST['service_period']))
+ if (isset($_REQUEST['service_period'])) {
return $_REQUEST['service_period'];
+ }
+
$override = getServiceOverride($date);
- if ($override['service_id']) {
- return service_period_day ($override['service_id']);
- }
-
- switch (date('w', ($date != "" ? $date : time()))) {
- case 0:
- return 'sunday';
- case 6:
- return 'saturday';
- default:
- return 'weekday';
- }
-}
+ if (isset($override['service_id'])) {
+ return strtolower($override['service_id']);
+ }
+ $date = ($date != "" ? $date : time());
+// christmas special cases
+ $ymd = date('Ymd', $date);
+ $dow = date('w', $date);
+ if ($ymd == "20111225") {
+ return "Christmas2011";
+ } if ($ymd == "20111228" || $ymd == "20111229" || $ymd == "20111230") {
+ return "EndOfYearHolidays";
+ } else if (intval($ymd) < "20120203" && $dow != 0 && $dow != 6) {
+ return "Weekday-SchoolVacation";
+ } else {
+ switch ($dow) {
+ case 0:
+ return 'sunday';
+ case 6:
+ return 'saturday';
+ default:
+ return 'weekday';
+ }
+ }
+}
+
function service_ids($service_period) {
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");
+ case "Christmas2011":
+ return Array("Christmas2011", "Christmas2011");
+ case "EndOfYearHolidays":
+ return Array("Weekday-EndOfYearHolidays", "Weekday-EndOfYearHolidays");
+ case "Weekday-SchoolVacation":
+ return Array("Weekday", "Weekday-SchoolVacation");
default:
//return 'weekday';
- return Array("2010-BELCMAST-Weekday-15","2010-TUGGMAST-Weekday-14");
- }
-}
+ return Array("Weekday", "Weekday");
+ }
+}
+
function valid_service_ids() {
- return array_merge(service_ids(""),service_ids('saturday'),service_ids('sunday'));
+ return array_merge(service_ids(""), service_ids('saturday'), service_ids('sunday'),
+ Array("Christmas2011","Weekday-EndOfYearHolidays","Weekday-SchoolVacation"));
}
function midnight_seconds($time = "") {
--- a/index.php
+++ b/index.php
@@ -20,7 +20,7 @@
<div data-role="page">
<div data-role="content">
<div id="jqm-homeheader">
- <h1>busness time</h1><br><small>Canberra Bus Timetables and Trip Planner</small>
+ <h1>busness time</h1><br><small>Canberra Bus Timetables and Trip Planner</small>
</div>
<a name="maincontent" id="maincontent"></a>
<a href="tripPlanner.php" data-role="button" data-icon="navigation">Launch Trip Planner...</a>
@@ -38,8 +38,12 @@
<li><a class="nearby" href="routeList.php?nearby=yes">Nearby Routes</a></li>
</ul>
<?php
+ print_r(getServiceOverride(time()));
+ echo service_period(time());
+ print_r(service_ids(service_period(time())));
echo ' <a href="labs/index.php" data-role="button" data-icon="beaker">Busness R&D</a>';
echo ' <a href="myway/index.php" data-role="button">MyWay Balance and Timeliness Survey Results</a>';
+
include_footer(true)
?>
--- 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
@@ -133,7 +133,7 @@
echo '<li>';
$destination = getTripDestination($trip['trip_id']);
- echo '<a href="trip.php?stopid=' . $stopid . '&tripid=' . $trip['trip_id'] . '"><h3>' . $trip['route_short_name'] . " towards " . $destination['stop_name'] . "</h3><p>";
+ echo '<a href="trip.php?stopid=' . $stopid . '&tripid=' . $trip['trip_id'] . '"><h3>'. (service_period() == "Christmas2011" ? $trip['route_long_name'] : "") . $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
@@ -27,7 +27,7 @@
$tripid = $trip['trip_id'];
} else {
$trip = getTrip($tripid);
- $similarRoutes = getRoutesByNumber($trip['route_short_name'], $trip['direction_id'], service_period_day($trip["service_id"]));
+ $similarRoutes = getRoutesByNumber($trip['route_short_name'], $trip['direction_id'], strtolower($trip["service_id"]));
$routeids = Array();
foreach ($similarRoutes as $similarRoute) {
$routeids[] = $similarRoute['route_id'];
@@ -35,7 +35,7 @@
$routeids = array_unique($routeids);
}
$directionid = $trip['direction_id'];
-$service_period = service_period_day($trip["service_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);
@@ -64,11 +64,11 @@
foreach (getRoutesByNumber($trip['route_short_name']) as $row) {
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>";
+ if ( $headsign['direction_id'] != $directionid || strtolower($headsign['service_id']) != $service_period) {
+ echo "{$headsign['direction_id']} != $directionid || ".strtolower($headsign['service_id'])." != $service_period <br>";
$start = $headsign['stop_name'];
- $serviceday = service_period_day($headsign['service_id']);
+ $serviceday = strtolower($headsign['service_id']);
$key = $row['route_short_name'] . "." . $headsign['direction_id'];
if (isset($filteredRoutes[$key])) {
$filteredRoutes[$key]['route_ids'][] = $row['route_id'];
@@ -102,7 +102,7 @@
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'] . ' towards ' . $destination['stop_name'] . ' (' . ucwords(service_period_day($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(strtolower($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>';
--- 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 '
+<script language="javascript">
+ // make some ezamples
+ var startExample = "Gungahlin, ACT";
+ var endExample = "Bunda St, Canberra";
+ var zip = "2600";
+ var urlToGoTo = "http://www.google.com/maps?ie=UTF8&f=d&" ;
+
+ function buildURL(){
+ document.getElementById(\'linkOut\').href = urlToGoTo + "&saddr=" + document.getElementById(\'saddr\').value + "&daddr=" + document.getElementById(\'daddr\').value + "&dirflg=r";
+ }
+
+</script>
+
+<form action="https://www.action.act.gov.au/googletransit/redir_to_google.asp" method="post" name="GoogleTransit" target="_blank" id="GoogleTransit">
+ <table width="226" cellspacing="1" border="1">
+ <tr>
+ <td colspan="2" valign="middle"><a href="http://google.com/transit"><img src="/maps_logo_small_blue.png"width="150" height="55" border="0" alt="Link to Google Transit Trip Planner" align="middle"></a> <br />
+ <B>Transit Trip Planner</B></td>
+ </tr>
+ <tr>
+ <td colspan="2" nowrap><strong>Start</strong> (e.g.
+ <script language="javascript">document.write(startExample)</script>)<br />
+ <input type="text" size="27" name="saddr" id="saddr" maxlength="2048" title="Enter the Origin Address" value="" onFocus="this.value=\'\';" onBlur="if(this.value==\'\')this.value=startExample">
+ <br /><br /> <strong>End</strong> (e.g.
+ <script language="javascript">document.write(endExample)</script>)
+ <BR>
+ <input type="text" size="27" name="daddr" id="daddr" maxlength="2048" title="Enter the Destination Address" onfocus="this.value=\'\';" onBlur="if(this.value==\'\')this.value=endExample">
+ <br>
+ <table>
+ <tr>
+ <td><strong>Date</strong></td>
+ <td><strong>Time</strong></td>
+ </tr>
+ <tr>
+ <td nowrap=""><input type="text" title="Enter the Date in DD/MM/YY format" maxlength="10" value="" name="date" size="10" id="fdate"></td>
+ <td nowrap="nowrap"><input type="text" title="Enter the Time in HH:MM AM or PM format" maxlength="8" value="" name="time" size="5" id="ftime"></td>
+ </tr>
+ </table>
+Plan by:
+ <select name="ttype">
+ <option value="dep">Departure Time</option>
+ <option value="arr">Arrival Time</option>
+ </select>
+ <center>
+ <input name="Submit" type="submit" value="Get directions">
+ </center></td>
+ </tr>
+ </table>
+</form>
+
+<script language="javascript">
+
+// calculate the current time
+
+ var currentTime = new Date() ;
+ var hours = currentTime.getHours() ;
+ var minutes = currentTime.getMinutes() ;
+
+ var currentDay = currentTime.getDate() ;
+ var currentMonth = currentTime.getMonth() + 1 ;
+// var currentYear = currentTime.getYear() ; 07/10/2011 by Vlad
+ var currentYear = currentTime.getFullYear() ;
+
+// account for leading zero
+ if (minutes < 10)
+ minutes = "0" + minutes
+// 07/10/2011 by Vlad
+ if (hours < 10)
+ hours = "0" + hours
+ if (currentDay < 10)
+ currentDay = "0" + currentDay
+ if (currentMonth < 10)
+ currentMonth = "0" + currentMonth
+
+ var displayTime = hours + ":" + minutes ;
+
+// populate the current time
+ document.getElementById(\'ftime\').value = displayTime ;
+
+// populate the address examplates
+ document.getElementById(\'saddr\').value = startExample ;
+ document.getElementById(\'daddr\').value = endExample ;
+ document.getElementById(\'fdate\').value = currentDay + \'/\' + currentMonth + \'/\' + currentYear ;
+
+</script>
+';
+ } 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";
}
}