Network 10 changes
Network 10 changes

file:a/betweenpoint.load.php (deleted)
--- a/betweenpoint.load.php
+++ /dev/null
@@ -1,76 +1,1 @@
-<?php

-/*

- * GeoPo Encode in PHP

- * @author : Shintaro Inagaki

- * @param $location (Array)

- * @return $geopo (String)

- */

-function geopoEncode($lat, $lng) {

-	// 64characters (number + big and small letter + hyphen + underscore)

-	$chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_";

-

-	$geopo = "";

-	$scale = 7;

-	

-	// Change a degree measure to a decimal number

-	$lat = ($lat + 90) / 180 * pow(8, 10);

-	$lng = ($lng + 180) / 360 * pow(8, 10);

-	// Compute a GeoPo code from head and concatenate

-	for($i = 0; $i < $scale; $i++) {

-		$geopo .= substr($chars, floor($lat / pow(8, 9 - $i) % 8) + floor($lng / pow(8, 9 - $i) % 8) * 8, 1);

-	}

-	return $geopo;

-}		

-

-/*

- * GeoPo Decode in PHP

- * @author : Shintaro Inagaki

- * @param $geopo (String)

- * @return $location (Array)

- */

-function geopoDecode($geopo) {

-	// 64characters (number + big and small letter + hyphen + underscore)

-	$chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_";

-	// Array for geolocation

-	$location = array ();

-

-	for ($i = 0; $i < strlen($geopo); $i++) {

-		// What number of character that equal to a GeoPo code (0-63)

-		$order = strpos($chars, substr($geopo, $i, 1));

-		// Lat/Lng plus geolocation value of scale 

-		$location['lat'] = $location['lat'] + floor($order % 8) * pow(8, 9 - $i);

-		$location['lng'] = $location['lng'] + floor($order / 8) * pow(8, 9 - $i);

-	}

-

-	// Change a decimal number to a degree measure, and plus revised value that shift center of area

-	$location['lat'] = $location['lat'] * 180 / pow(8, 10) + 180 / pow(8, strlen($geopo)) / 2 - 90;

-	$location['lng'] = $location['lng'] * 360 / pow(8, 10) + 360 / pow(8, strlen($geopo)) / 2 - 180;

-	$location['scale'] = strlen($geopo);

-

-	return $location;

-}	

-

-$conn = pg_connect("dbname=bus user=postgres password=snmc");

-if (!$conn) {

-  echo "An error occured.\n";

-  exit;

-}

-$xml = simplexml_load_file("04-locatebetweenpoints.osm");

-

-/* Access the <rating> nodes of the first movie.

- * Output the rating scale, too. */

-foreach ($xml->node as $node) {

-	$geoPo = geopoEncode((float)$node['lat'],(float)$node['lon']);

-	$node['lat'] = (int) ((float)$node['lat']*10000000);

-	$node['lon'] = (int) ((float)$node['lon']*10000000);

-	echo($node['lat'].",".$node['lon']."=$geoPo<br>");

-   $sql = "INSERT INTO stops (geohash, lat, lng) VALUES('$geoPo','{$node['lat']}','{$node['lon']}')";

-     $result = pg_query($conn, $sql);

-     if (!$result) {

-         echo("Error in SQL query: " . pg_last_error() ."<br>\n");

-     }

-flush();

-    

-}

-?>

 

--- a/betweenpoint.php
+++ b/betweenpoint.php
@@ -126,7 +126,7 @@
           if (($fname != '.') && ($fname != '..')) {
               $timetable = Spyc::YAMLLoad("maxious-canberra-transit-feed/output/" . $fname);
 		// Strip off individual platforms because it usually doesn't matter for routes
-		$timetable["time_points"] = preg_replace("/-.* Platform.*/","",$timetable["time_points"]);
+		$timetable["time_points"] = preg_replace("/(Platform.*/","",$timetable["time_points"]);
               for ($i = 0; $i < sizeof($timetable["time_points"]) - 1; $i++) {
                   @$paths[trim($timetable["time_points"][$i]) . "->" . trim($timetable["time_points"][$i + 1])] .= $timetable["short_name"] . ";";
               }

file:a/busui/list.php (deleted)
--- a/busui/list.php
+++ /dev/null
@@ -1,22 +1,1 @@
-<div id="get">
-    <div class="toolbar">
-        <h1>GET Example</h1>
-        <a class="back" href="#">AJAX</a>
-    </div>
-    <div class="info">
-        This page was loaded via AJAX.
-    </div>
-    <ul class="rounded">
-        <li><a href="#livetest">Test live events</a></li>
-    </ul>
-</div>
-<div id="livetest">
-    <div class="toolbar">
-        <h1>Events test</h1>
-        <a class="back" href="#">AJAX</a>
-        <a class="button goback" href="#home">Home</a>
-    </div>
-    <div class="info">
-        This is a test of live events.
-    </div>
-</div>
+

--- a/busui/schedule_viewer.py
+++ b/busui/schedule_viewer.py
@@ -337,6 +337,14 @@
   def handle_json_GET_stops(self, params):
     schedule = self.server.schedule
     return [StopToTuple(s) for s in schedule.GetStopList()]
+    
+  def handle_json_GET_timingpoints(self, params):
+    schedule = self.server.schedule
+    matches = []
+    for s in schedule.GetStopList():
+      if s.stop_code.find("Wj") == -1:
+        matches.append(StopToTuple(s))
+    return matches
 
   def handle_json_GET_stopsearch(self, params):
     schedule = self.server.schedule

--- a/maxious-canberra-transit-feed/01-extracttimes.rb
+++ b/maxious-canberra-transit-feed/01-extracttimes.rb
@@ -14,10 +14,16 @@
 	timetable = {"between_stops" => [], "short_name" => short_name}
 	time_points = table.xpath('tr[1]//th').map do |tp|
 		if tp.content != "\302\240" && tp.content != "" && tp.content != "<br/>"
-			timing_point = tp.content.squeeze(" ").gsub("\r\n Platform"," - Platform").gsub("  - "," - ").gsub("\n","").gsub("\r","").gsub("\\"," / ").strip
+			timing_point = tp.content.squeeze(" ").gsub("Bus Station"," Bus Station ").gsub(" Platform"," (Platform").gsub("  - "," - ").gsub("\n"," ").gsub("\r"," ").gsub("\t"," ").gsub("\\"," / ").gsub("/"," / ").gsub(",",", ").gsub("\302\240","").squeeze(" ").strip
+			if (tp.content.match('Platform'))
+			  timing_point.concat(")")
+			end;
+			timing_point
 		end
 	end
 	time_points.delete(nil)
+	time_points.delete("WheelchairAccessible")
+	time_points.delete("Wheelchair Accessible")
 	timetable["time_points"] = time_points.to_a
 	timetable["long_name"] = "To " + time_points.last
 	periodtimes = []
@@ -27,8 +33,11 @@
 			time = time.gsub(/ *A\S?M/,"a").gsub(/ ?P\S?M/,"p").gsub("12:08 AM","1208x").gsub(":","").gsub("1.","1").gsub("2.","2")
 			time = time.gsub("3.","3").gsub("4.","4")
 			time = time.gsub("5.","5").gsub("6.","6").gsub("7.","7").gsub("8.","8").gsub("9.","9").gsub("10.","10")
-			time = time.gsub("11.","11").gsub("12.","12").gsub(/\.+/,"-")
+			time = time.gsub("11.","11").gsub("12.","12").gsub(/\.+/,"-").gsub("\302\240","")
+			if time == "" then time = nil end 
+			time
 		end
+		times.delete(nil)
 		if not times.empty?
 			if not (route = times.shift)
 				raise("TODO: account for shifting route numbers eg. intertown/redex 62/162")
@@ -42,7 +51,7 @@
 	timetable[period] = periodtimes.to_a
 	# pp timetable
 	filename = timetable["short_name"] + "-" + timetable["long_name"]+ "." + period + ".yml"
-	filename = filename.downcase.gsub(" ","-").gsub("/","-")
+	filename = filename.downcase.gsub(" ","-").gsub("/","-").gsub("(","").gsub(")","")
 	puts "Saving " + filename
 	File.open("#{File.dirname(__FILE__)}/output/"+filename, "w") do |f|
 		f.write timetable.to_yaml
@@ -50,7 +59,6 @@
 	timetable
 end
 
-#TODO fix route 934
 Dir.glob("source-html/Route*.htm*") { |file|
 	puts "Opened " + file
 	doc = Nokogiri::HTML(open(file))
@@ -58,7 +66,7 @@
 	timetables = []
 	short_name = "";
 	doc.xpath('//title').each do |title|
-		short_name = title.content.gsub("Route_","").gsub("Route ","").gsub(", ","/").squeeze(" ").strip
+		short_name = title.content.gsub("Route_","").gsub("Route ","").gsub(", ","/").gsub("ACTION Buses Timetable for ","").squeeze(" ").strip
 	end
 	if short_name == ""
 		raise "Route number(s) not found in <title> tag"
@@ -67,7 +75,15 @@
 	doc.xpath('//table[preceding::text()="Weekdays"]').each do |table|
 		timetables << makeTimetable(table, "stop_times", short_name)
 	end
-
+	doc.xpath('//table[preceding::text()="This timetable is effective from Monday 15th November 2010."]').each do |table|
+		timetables << makeTimetable(table, "stop_times", short_name)
+	end
+	#all tables are weekdays on some really malformatted timetables
+	if short_name == "170"
+		doc.xpath('//table').each do |table|
+			timetables << makeTimetable(table, "stop_times", short_name)
+		end
+	end
 	#weekends
 	doc.xpath('//table[preceding::text()="Saturdays" and following::a]').each do |table|
 		timetables << makeTimetable(table, "stop_times_saturday", short_name)

--- a/maxious-canberra-transit-feed/02-tidytimepoints.rb
+++ b/maxious-canberra-transit-feed/02-tidytimepoints.rb
@@ -2,9 +2,9 @@
 require 'pp'
 require 'yaml'
 class Array
-  def to_yaml_style
-    :inline
-  end
+ def to_yaml_style
+  :inline
+ end
 end
 Dir.chdir("output")
 
@@ -25,60 +25,26 @@
 #pp $time_points_sources.sort
 
 time_point_corrections = {"North Lynehamham" => "North Lyneham",
-			  "Lathlain St Platform 2" => "Lathlain St Bus Station - Platform 2",
-			  "Lathlain St Sation - Platform 5" => "Lathlain St Bus Station - Platform 5",
-	 		  "Lathlain Steet Station" => "Lathlain St Bus Station",
-			  "Lathlain St - Platform 3"  => "Lathlain St Bus Station - Platform 3",
-			  "Lathlain Steet Station - Platform 3"	  => "Lathlain St Bus Station - Platform 3",
-			  "Lathlain St Station" => "Lathlain St Bus Station",
-			  "Lathlain St Station - Platform 1" => "Lathlain St Bus Station - Platform 1",
-			  "Lathlain St Station - Platform 2" => "Lathlain St Bus Station - Platform 2",
-			  "Lathlain St Station - Platform 3" => "Lathlain St Bus Station - Platform 3",
-			  "Lathlain St Station - Platform 4" => "Lathlain St Bus Station - Platform 4",
-			  "Lathlain St Station - Platform 5" => "Lathlain St Bus Station - Platform 5",
-			  "Lathlain St Station - Platform 6" => "Lathlain St Bus Station - Platform 6",
-			  "Flemington Rd, Sandford St" => "Flemington Rd/Sandford St",
-			  "Erindale Centre /Sternberg Crescent" => "Erindale Drive/Sternberg",
-			  "Canberra Hospita" => "Canberra Hospital",
-			  "Cohen Str Station - Platform 1" => "Cohen St Bus Station - Platform 1",
-			  "Cohen Street Station" => "Cohen St Bus Station",
-			  "Cohen Street Station - Platform 2" => "Cohen St Bus Station - Platform 2",
-			  "Cohn St Station - Platform 3" => "Cohen St Bus Station - Platform 3",
-			  "Cohen St Station" => "Cohen St Bus Station",
-			  "Cohen St Station - Platform 1" => "Cohen St Bus Station - Platform 1",
-			  "Cohen St Station - Platform 2" => "Cohen St Bus Station - Platform 2",
-			  "Cohen St Station - Platform 3" => "Cohen St Bus Station - Platform 3",
-			  "Cohen St Station - Platform 4" => "Cohen St Bus Station - Platform 4",
-			  "Cohen St Station - Platform 5" => "Cohen St Bus Station - Platform 5",
-			  "Cohen St Station - Platform 6" => "Cohen St Bus Station - Platform 6",
-			  "City - Platform 7" => "City Interchange - Platform 7",
-			  "Cameron Avenue Station" => "Cameron Ave Bus Station",
-			  "Cameron Avenue Station - Platform 1" => "Cameron Ave Bus Station - Platform 1",
-			  "Cameron Avenue Station - Platform 2" => "Cameron Ave Bus Station - Platform 2",
-			  "Cameron Avenue Station - Platform 3" => "Cameron Ave Bus Station - Platform 3",
-			  "Cameron Avenue Station - Platform 4" => "Cameron Ave Bus Station - Platform 4",
-			  "Cameron Avenue Station - Platform 5" => "Cameron Ave Bus Station - Platform 5",
-			  "Cameron Ave Station" => "Cameron Ave Bus Station",
-			  "Cameron Ave Station - Platform 1" => "Cameron Ave Bus Station - Platform 1",
-			  "Cameron Ave Station - Platform 2" => "Cameron Ave Bus Station - Platform 2",
-			  "Cameron Ave Station - Platform 3" => "Cameron Ave Bus Station - Platform 3",
-			  "Cameron Ave Station - Platform 4" => "Cameron Ave Bus Station - Platform 4",
-			  "Cameron Ave Station - Platform 5" => "Cameron Ave Bus Station - Platform 5",
-			  "Burton & Garranan Hall, Daley Road ANU" => "Burton & Garran Hall/Daley Road ANU",
-			  "Burton & Garranan Hall,Daley Road ANU" => "Burton & Garran Hall/Daley Road ANU",
-			  "Garran/Daley Rd" => "Burton & Garran Hall/Daley Road ANU",
-			  "Kingstons Ave/National Crt" => "Kings Ave/National Crt",
-			  "Newcastle Street after Isa St" => "Newcastle / Isa Street Fyshwick",
-			  "National Circ/Canberra Ave" => "National Circuit / Canberra Ave",
-			  "St Clare of Conder" => "St Clare of Assisi Primary",
-			  "McKillop College Isabella Campus" => "MacKillop College Isabella Campus",
-			  "Outrim / Duggan" => "Outtrim / Duggan",
-			  "Manuka Captain Cook" => "Manuka/Captain Cook",
-			  "Manuka, Captain Cook" => "Manuka/Captain Cook",
-			  "Hospice, Menindee Drive" => "Hospice",
-			  "Tharwa/Pocket" => "Tharwa/Pockett",
-			  "Paul-Co / Mirrabei" => "Paul Coe / Mirrabei"
-			}
+  "Woden Bus Station Platform 10)" => "Woden Bus Station (Platform 10)",
+  "Saint AndrewsVillage Hughes"=>"Saint Andrews Village Hughes",
+ "Flemmington Road / Sandford St"=>"Flemington Road / Sandford St",
+ "City Interchange"=>"City Bus Station",
+ "City Interchange (Platform 9)"=>"City Bus Station (Platform 9)",
+ "Bridbabella Gardens Nursing Home"=>"Brindabella Gardens Nursing Home",
+ "Bridbabella GardensNursing Home"=> "Brindabella Gardens Nursing Home",
+ "BrindabellaBusiness Park"=> "Brindabella Business Park",
+ "NarrabundahTerminus"=>"Narrabundah Terminus",
+ "Railway StationKingston"=>"Railway Station Kingston",
+ "Saint AndrewsVillage Hughes"=>"Saint Andrews Village Hughes",
+ "Dickson ShopsAntill Street"=>"Dickson Shops",
+ "Cohen St Bus Station (Platform 3)"=>"Cohen Street Bus Station (Platform 3)",
+ "Cohen St Bus Station (Platform 6)"=>"Cohen Street Bus Station (Platform 6)",
+ "Newcastle Streetafter Isa Street"=>"Newcastle Street after Isa Street",
+ "William Web / Ginninderra Drive"=>"William Webb / Ginninderra Drive",
+ "Procor / Mead"=>"Proctor / Mead",
+"Fyshwick DirectFactory Outlet"=>"Fyshwick Direct Factory Outlet"
+}
+
 time_point_corrections.each do |wrong, right|
 	$time_points_sources[wrong].each do |wrongfile|
 		badtimetable = YAML::load_file(wrongfile)
@@ -86,7 +52,7 @@
 		badtimetable["time_points"][badentrynumber] = right
 		puts "Corrected '" + wrong + "' to '" + right + "' in " + wrongfile
 		File.open(wrongfile, "w") do |f|
-	  		f.write badtimetable.to_yaml
+	 		f.write badtimetable.to_yaml
 		end
 	end
 end

--- a/maxious-canberra-transit-feed/03-locatetimepoints.rb
+++ b/maxious-canberra-transit-feed/03-locatetimepoints.rb
@@ -1,10 +1,10 @@
 #!/usr/bin/ruby
-require 'postgres'
 
 require 'highline.rb'
 include HighLine
 
 require 'rubygems'
+require 'postgres'
 require 'json'
 require 'net/http'
 def cbr_geocode(query)
@@ -51,13 +51,12 @@
 
 connbus = PGconn.connect("localhost", 5432, '', '', "bus", "postgres", 
 "snmc")
-connosm = PGconn.connect("localhost", 5432, '', '', "openstreetmap", 
-"postgres", "snmc")
+connosm = PGconn.connect("localhost", 5432, '', '', "openstreetmap", "postgres", "snmc")
 
 if ask_if("Insert Timing Point names to database?")
 	$time_points.each do |time_point|
 		begin
-			time_point = time_point.gsub(/\\/, '\&\&').gsub(/'/, "''").gsub("St", "%")
+			time_point = time_point.gsub(/\\/, '\&\&').gsub(/'/, "''")
 			res = connbus.exec("INSERT INTO timing_point (name) VALUES ('#{time_point}')")
 			puts "Put '#{time_point}' into DB"
 		rescue PGError => e

--- a/maxious-canberra-transit-feed/04-generateymlinclude.rb
+++ b/maxious-canberra-transit-feed/04-generateymlinclude.rb
@@ -44,8 +44,9 @@
 		# 0 = geoPo
 		# 1 = lat*100000
 		# 2 = lng*100000
+		# 3 = name
 		#pp time_point[0]
-		f2.puts "  - { name: #{stop[0]},stop_code: #{stop[0]}, lat: #{Float(stop[1])/10000000}, lng: #{Float(stop[2])/10000000}}"
+		f2.puts "  - { name: #{stop[3]},stop_code: #{stop[0]}, lat: #{Float(stop[1])/10000000}, lng: #{Float(stop[2])/10000000}}"
 	end
 	f2.puts "routes:\n";
 end

--- /dev/null
+++ b/maxious-canberra-transit-feed/04-locatebetweenpoints.reversegeocode.php
@@ -1,1 +1,38 @@
+<?php
+function getPage($url)
+{
+    $ch = curl_init($url);
+curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
+curl_setopt( $ch, CURLOPT_HEADER, 0 );
+$page = curl_exec($ch);
+curl_close($ch);
+return $page;
+}
+// 
+// http://developers.cloudmade.com/wiki/geocoding-http-api/Documentation
+$conn = pg_connect("dbname=bus user=postgres password=snmc");
+if (!$conn) {
+  echo "An error occured.\n";
+  exit;
+}
+$sql = "Select * from stops where name is null";
+     $result_stops = pg_query($conn, $sql);
+     if (!$result_stops) {
+	cho("Error in SQL query: " . pg_last_error() ."<br>\n");
+     }
+     while ($stop = pg_fetch_assoc($result_stops)) {
+      echo "Processing ".$stop['geohash'] . " ... ";
+      $url = "http://geocoding.cloudmade.com/daa03470bb8740298d4b10e3f03d63e6/geocoding/v2/find.js?around=".($stop['lat']/10000000).",".($stop['lng']/10000000)."&distance=closest&object_type=road";
+      $contents = json_decode(getPage($url));
+      $name = $contents->features[0]->properties->name;
+      echo "Saving $name ! <br>" ;
+      $result_save = pg_query($conn, "UPDATE stops set name = '".pg_escape_string($name)."' where geohash = '{$stop['geohash']}' ");
+			      if (!$result_save) {
+	echo("Error in SQL query: " . pg_last_error() ."<br>\n");
+     }
+     flush();
+     }
 
+?>
+
+

--- a/maxious-canberra-transit-feed/05-addbetweenpointstotimetables.rb
+++ b/maxious-canberra-transit-feed/05-addbetweenpointstotimetables.rb
@@ -23,9 +23,11 @@
     timetable["between_stops"] = {}
     for i in 0..timetable["time_points"].length-2
 	begin
-	  searchFrom = timetable["time_points"][i].escape_single_quotes.split("-")[0].strip
-	  searchTo = timetable["time_points"][i+1].escape_single_quotes.split("-")[0].strip
-	  
+	  searchFrom = timetable["time_points"][i].escape_single_quotes.split("(")[0].strip
+	  searchTo = timetable["time_points"][i+1].escape_single_quotes.split("(")[0].strip
+	#  print "SELECT * from between_stops
+	#	  WHERE fromlocation = '#{searchFrom}'
+	#  AND tolocation = '#{searchTo}' AND routes LIKE '%#{route_name};%'"
 	  between_points = connbus.exec("SELECT * from between_stops
 		  WHERE fromlocation = '#{searchFrom}'
 	  AND tolocation = '#{searchTo}' AND routes LIKE '%#{route_name};%'")
@@ -34,8 +36,9 @@
 		#conn.close() if conn
 	end
 	between_points.each do |between_point_row|
-	  timetable["between_stops"][timetable["time_points"][i] + '-' +timetable["time_points"][i+1]] \
-	      = between_point_row['points'].split(";");
+		points = between_point_row['points'].split(";")
+		points.delete("")
+		timetable["between_stops"][timetable["time_points"][i] + '-' +timetable["time_points"][i+1]] = points;
 	end
     end
     #pp timetable["between_stops"]

--- a/maxious-canberra-transit-feed/05-cleanupyaml.sh
+++ /dev/null
@@ -1,3 +1,1 @@
-#!/bin/bash
-sed -i "s/- ---/- /g" cbrtable.yml
 

--- a/maxious-canberra-transit-feed/createfeed.py
+++ b/maxious-canberra-transit-feed/createfeed.py
@@ -69,8 +69,10 @@
   stopset = set()
   for route in routedata:
     stopset.update(route['time_points'])
-    for between_list in route['between_stops']:
-      stopset.update(route['between_stops'][between_list])
+    if len(route['between_stops']) > 0:
+	for between_list in route['between_stops']:
+		if route['between_stops'][between_list] != None:
+		      stopset.update(route['between_stops'][between_list])
 
   toprune = list()
   for i, stop in enumerate(stopsdata):

--- a/maxious-canberra-transit-feed/gs.sh
+++ /dev/null
@@ -1,6 +1,1 @@
-gs_osmdb_compile ~/osm/canberra.osm canberra.osmdb
-gs_gtfsdb_build cbrfeed.zip canberra.gtfsdb
-gs_link_osm_gtfs map.gdb canberra.osmdb canberra.gtfsdb
-gs_import_osm
-gs_import_gtfs
 

--- a/maxious-canberra-transit-feed/output/10-to-cohen-st-station.stop_times.yml
+++ b/maxious-canberra-transit-feed/output/10-to-cohen-st-station.stop_times.yml
@@ -5,5 +5,5 @@
   Cameron Ave Bus Station-Lathlain St Bus Station: []
 short_name: "10"
 stop_times: [["-", "-", "-", "-", "-", "-", 632a, 642a, 644a, 649a, 659a, 706a, 708a, 712a], ["-", "-", "-", "-", "-", "-", 702a, 712a, 714a, 719a, 729a, 736a, 738a, 742a], ["-", "-", "-", "-", "-", "-", 732a, 742a, 744a, 749a, 759a, 806a, 808a, 812a], ["-", "-", "-", "-", "-", "-", 802a, 812a, 814a, 819a, 829a, 836a, 838a, 842a], ["-", "-", "-", 800a, 803a, 808a, 820a, 830a, 832a, 837a, 847a, 854a, 856a, 900a], ["-", "-", "-", 830a, 833a, 838a, 850a, 900a, 902a, 907a, 917a, 924a, 926a, 930a], ["-", "-", "-", 900a, 903a, 908a, 920a, 930a, 932a, 937a, 947a, 954a, 956a, 1000a], [918a, 929a, 934a, 941a, 944a, 949a, 1001a, 1011a, 1013a, 1018a, 1028a, 1035a, 1037a, 1041a], [948a, 959a, 1004a, 1011a, 1014a, 1019a, 1031a, 1041a, 1043a, 1048a, 1058a, 1105a, 1107a, 1111a], [1018a, 1029a, 1034a, 1041a, 1044a, 1049a, 1101a, 1111a, 1113a, 1118a, 1128a, 1135a, 1137a, 1141a], [1048a, 1059a, 1104a, 1111a, 1114a, 1119a, 1131a, 1141a, 1143a, 1148a, 1158a, 1205p, 1207p, 1211p], [1118a, 1129a, 1134a, 1141a, 1144a, 1149a, 1201p, 1211p, 1213p, 1218p, 1228p, 1235p, 1237p, 1241p], [1148a, 1159a, 1204p, 1211p, 1214p, 1219p, 1231p, 1241p, 1243p, 1248p, 1258p, 105p, 107p, 111p], [1218p, 1229p, 1234p, 1241p, 1244p, 1249p, 101p, 111p, 113p, 118p, 128p, 135p, 137p, 141p], [1248p, 1259p, 104p, 111p, 114p, 119p, 131p, 141p, 143p, 148p, 158p, 205p, 207p, 211p], [118p, 129p, 134p, 141p, 144p, 149p, 201p, 211p, 213p, 218p, 228p, 235p, 237p, 241p], [148p, 159p, 204p, 211p, 214p, 219p, 231p, 241p, 243p, 248p, 258p, 305p, 307p, 311p], [218p, 229p, 234p, 241p, 244p, 249p, 301p, 311p, 314p, 319p, 329p, 336p, 338p, 342p], [248p, 259p, 304p, 311p, 315p, 320p, 332p, 342p, 345p, 350p, 400p, 407p, 409p, 413p], [318p, 329p, 334p, 341p, 345p, 350p, 402p, 412p, 415p, 420p, 430p, 437p, 439p, 443p], ["-", "-", "-", "-", "-", "-", 416p, 426p, 429p, 434p, 444p, 451p, 453p, 457p], [348p, 359p, 404p, 411p, 415p, 420p, 432p, 442p, 445p, 450p, 500p, 507p, 509p, 513p], ["-", "-", "-", "-", "-", "-", 446p, 456p, 459p, 504p, 514p, 521p, 523p, 527p], ["-", "-", 431p, 441p, 445p, 450p, 502p, 512p, 515p, 520p, 530p, 537p, 539p, 543p], ["-", "-", "-", "-", "-", "-", 516p, 526p, 529p, 534p, 544p, 551p, 553p, 557p], ["-", "-", 458p, 511p, 515p, 520p, 532p, 542p, 545p, 550p, 600p, 607p, 609p, 613p], ["-", "-", "-", "-", "-", "-", 546p, 556p, 559p, 604p, 614p, 621p, 623p, 627p], ["-", "-", "-", 540p, 544p, 549p, 601p, 611p, 614p, 619p, 629p, 636p, 638p, 641p], ["-", "-", "-", "-", "-", "-", 616p, 626p, 629p, 634p, 644p, 651p, 653p, 656p], ["-", "-", "-", 611p, 615p, 620p, 632p, 642p, 644p, 649p, 659p, 706p, 708p, 711p], ["-", "-", "-", "-", "-", "-", 736p, 746p, 748p, 753p, 803p, 810p, 812p, 815p], ["-", "-", "-", "-", "-", "-", 836p, 846p, 848p, 853p, 903p, 910p, 912p, 915p], ["-", "-", "-", "-", "-", "-", 936p, 946p, 948p, 953p, 1003p, 1010p, 1012p, 1015p], ["-", "-", "-", "-", "-", "-", 1036p, 1046p, 1048p, 1053p, 1103p, 1110p, 1112p, 1115p], ["-", "-", "-", "-", "-", "-", 1136p, 1146p, 1148p, 1153p, 1203a, 1210a, 1212a, 1215a]]
-time_points: [Fairbairn Park, Brindabella Business Park, Majura Business Park, Campbell Park Offices, ADFA, War Memorial, City Interchange - Platform 4, Caswell Drive, Aranda, Cook, Jamison Centre, Cameron Ave Bus Station, Lathlain St Bus Station, Cohen St Bus Station]
+time_points: [Fairbairn Park, Brindabella Business Park, Majura Business Park, Campbell Park Offices, ADFA, War Memorial, City Interchange (Platform 4), Caswell Drive, Aranda, Cook, Jamison Centre, Cameron Ave Bus Station, Lathlain St Bus Station, Cohen St Bus Station]
 

--- a/maxious-canberra-transit-feed/output/10-to-fairbairn-park.stop_times.yml
+++ b/maxious-canberra-transit-feed/output/10-to-fairbairn-park.stop_times.yml
@@ -1,9 +1,9 @@
 --- 
 long_name: To Fairbairn Park
 between_stops: 
-  Cohen St Bus Station - Platform 2-Lathlain St Bus Station - Platform 3: []
-  Lathlain St Bus Station - Platform 3-Cameron Ave Bus Station - Platform 3: []
+  Lathlain St Bus Station (Platform 3)-Cameron Ave Bus Station (Platform 3): []
+  Cohen St Bus Station (Platform 2)-Lathlain St Bus Station (Platform 3): []
 short_name: "10"
 stop_times: [[553a, 555a, 559a, 606a, 616a, 621a, 624a, 634a, "-", "-", "-", "-", "-", "-"], [624a, 626a, 630a, 637a, 647a, 652a, 655a, 705a, "-", "-", "-", "-", "-", "-"], [654a, 656a, 700a, 707a, 717a, 722a, 725a, 736a, 746a, 752a, 756a, 803a, "-", "-"], ["-", "-", "-", "-", 724a, 729a, 732a, 742a, "-", "-", "-", "-", "-", "-"], [709a, 711a, 715a, 722a, 732a, 737a, 740a, 750a, "-", "-", "-", "-", "-", "-"], [724a, 726a, 730a, 737a, 747a, 752a, 755a, 806a, 816a, 822a, 826a, 835a, "-", "-"], ["-", "-", "-", "-", 754a, 759a, 802a, 812a, "-", "-", "-", "-", "-", "-"], [739a, 741a, 745a, 752a, 802a, 807a, 810a, 820a, "-", "-", "-", "-", "-", "-"], [754a, 756a, 800a, 807a, 817a, 822a, 825a, 836a, 846a, 852a, 856a, "-", "-", "-"], ["-", "-", "-", 812a, 822a, 827a, 830a, 840a, "-", "-", "-", "-", "-", "-"], [809a, 811a, 815a, 822a, 832a, 837a, 840a, 851a, 901a, 907a, 911a, 918a, 927a, 935a], [824a, 826a, 830a, 837a, 847a, 852a, 855a, 905a, "-", "-", "-", "-", "-", "-"], [839a, 841a, 845a, 852a, 902a, 907a, 910a, 921a, 931a, 937a, 940a, 947a, 956a, 1004a], [854a, 856a, 900a, 907a, 917a, 922a, 925a, 935a, "-", "-", "-", "-", "-", "-"], ["-", "-", "-", "-", "-", "-", "-", 955a, 1005a, 1011a, 1014a, 1021a, 1030a, 1038a], [925a, 927a, 931a, 938a, 948a, 953a, 955a, 1005a, "-", "-", "-", "-", "-", "-"], ["-", "-", "-", "-", "-", "-", "-", 1025a, 1035a, 1041a, 1044a, 1051a, 1100a, 1108a], [957a, 959a, 1003a, 1010a, 1020a, 1025a, 1027a, 1037a, "-", "-", "-", "-", "-", "-"], ["-", "-", "-", "-", "-", "-", "-", 1055a, 1105a, 1111a, 1114a, 1121a, 1130a, 1138a], [1026a, 1028a, 1032a, 1039a, 1049a, 1054a, 1056a, 1106a, "-", "-", "-", "-", "-", "-"], ["-", "-", "-", "-", "-", "-", "-", 1125a, 1135a, 1141a, 1144a, 1151a, 1200p, 1208p], [1056a, 1058a, 1102a, 1109a, 1119a, 1124a, 1126a, 1136a, "-", "-", "-", "-", "-", "-"], ["-", "-", "-", "-", "-", "-", "-", 1155a, 1205p, 1211p, 1214p, 1221p, 1230p, 1238p], [1126a, 1128a, 1132a, 1139a, 1149a, 1154a, 1156a, 1206p, "-", "-", "-", "-", "-", "-"], ["-", "-", "-", "-", "-", "-", "-", 1225p, 1235p, 1241p, 1244p, 1251p, 100p, 108p], [1156a, 1158a, 1202p, 1209p, 1219p, 1224p, 1226p, 1236p, "-", "-", "-", "-", "-", "-"], ["-", "-", "-", "-", "-", "-", "-", 1255p, 105p, 111p, 114p, 121p, 130p, 138p], [1226p, 1228p, 1232p, 1239p, 1249p, 1254p, 1256p, 106p, "-", "-", "-", "-", "-", "-"], ["-", "-", "-", "-", "-", "-", "-", 125p, 135p, 141p, 144p, 151p, 200p, 208p], [1256p, 1258p, 102p, 109p, 119p, 124p, 126p, 136p, "-", "-", "-", "-", "-", "-"], ["-", "-", "-", "-", "-", "-", "-", 155p, 205p, 211p, 214p, 221p, 230p, 238p], [126p, 128p, 132p, 139p, 149p, 154p, 156p, 206p, "-", "-", "-", "-", "-", "-"], ["-", "-", "-", "-", "-", "-", "-", 225p, 235p, 241p, 244p, 251p, 300p, 308p], [156p, 158p, 202p, 209p, 219p, 224p, 226p, 236p, "-", "-", "-", "-", "-", "-"], ["-", "-", "-", "-", "-", "-", "-", 255p, 305p, 311p, 315p, 322p, 331p, 339p], [226p, 228p, 232p, 239p, 249p, 254p, 256p, 306p, "-", "-", "-", "-", "-", "-"], ["-", "-", "-", "-", "-", "-", "-", 329p, 339p, 345p, 349p, 356p, 405p, 413p], [256p, 258p, 302p, 309p, 319p, 324p, 326p, 336p, "-", "-", "-", "-", "-", "-"], ["-", "-", "-", "-", "-", "-", "-", 359p, 409p, 415p, 419p, 426p, 435p, 443p], [326p, 328p, 332p, 339p, 349p, 354p, 356p, 406p, "-", "-", "-", "-", "-", "-"], [341p, 343p, 347p, 354p, 404p, 409p, 411p, 421p, "-", "-", "-", "-", "-", "-"], [356p, 358p, 402p, 409p, 419p, 424p, 426p, 436p, "-", "-", "-", "-", "-", "-"], ["-", "-", "-", "-", "-", "-", "-", 447p, 457p, 503p, 507p, "-", "-", "-"], [411p, 413p, 417p, 424p, 434p, 439p, 441p, 451p, "-", "-", "-", "-", "-", "-"], [426p, 428p, 432p, 439p, 449p, 454p, 456p, 506p, "-", "-", "-", "-", "-", "-"], [441p, 443p, 447p, 454p, 504p, 509p, 511p, 521p, "-", "-", "-", "-", "-", "-"], [456p, 458p, 502p, 509p, 519p, 524p, 526p, 536p, "-", "-", "-", "-", "-", "-"], [511p, 513p, 517p, 524p, 534p, 539p, 541p, 551p, "-", "-", "-", "-", "-", "-"], [526p, 528p, 532p, 539p, 549p, 554p, 556p, 606p, "-", "-", "-", "-", "-", "-"], [541p, 543p, 547p, 554p, 604p, 609p, 611p, 621p, "-", "-", "-", "-", "-", "-"], [620p, 622p, 626p, 633p, 643p, 648p, 650p, 700p, "-", "-", "-", "-", "-", "-"], [720p, 722p, 725p, 732p, 742p, 747p, 749p, 759p, "-", "-", "-", "-", "-", "-"], [820p, 822p, 8