octranspo 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. data/.gitignore +3 -0
  2. data/Gemfile +2 -0
  3. data/Gemfile.lock +26 -0
  4. data/Rakefile +8 -0
  5. data/lib/octranspo.rb +20 -0
  6. data/lib/octranspo/headsign.rb +2539 -0
  7. data/lib/octranspo/headsigns.yml +40565 -0
  8. data/lib/octranspo/landmarks.rb +37 -0
  9. data/lib/octranspo/lingo.rb +125 -0
  10. data/lib/octranspo/lingo/headsign_messages.yml +104 -0
  11. data/lib/octranspo/lingo/headsign_signatures.yml +3 -0
  12. data/lib/octranspo/lingo/landmarks.yml +205 -0
  13. data/lib/octranspo/lingo/roadways.yml +1957 -0
  14. data/lib/octranspo/mobile_resource_methods.rb +98 -0
  15. data/lib/octranspo/mobile_route_data.rb +85 -0
  16. data/lib/octranspo/mobile_route_schedule.rb +118 -0
  17. data/lib/octranspo/mobile_stop_schedule.rb +137 -0
  18. data/lib/octranspo/remote_resource_methods.rb +89 -0
  19. data/lib/octranspo/route.rb +31 -0
  20. data/lib/octranspo/routes.yml +507 -0
  21. data/lib/octranspo/service_date.rb +17 -0
  22. data/lib/octranspo/stations.yml +77 -0
  23. data/lib/octranspo/stop.rb +69 -0
  24. data/lib/octranspo/stop_resource.rb +46 -0
  25. data/lib/octranspo/stops.yml +30696 -0
  26. data/lib/octranspo/version.rb +3 -0
  27. data/octranspo.gemspec +22 -0
  28. data/test/fixtures/mobile_route_data/20090323/route_123_index_0.html +457 -0
  29. data/test/fixtures/mobile_route_data/20090323/route_123_index_1.html +99 -0
  30. data/test/fixtures/mobile_route_data/20090323/route_1_index_0.html +700 -0
  31. data/test/fixtures/mobile_route_data/20090323/route_1_index_1.html +691 -0
  32. data/test/fixtures/mobile_route_data/20090323/route_2_index_0.html +682 -0
  33. data/test/fixtures/mobile_route_data/20090323/route_2_index_1.html +646 -0
  34. data/test/fixtures/mobile_route_data/20100323/route_123_index_0.html +469 -0
  35. data/test/fixtures/mobile_route_data/20100323/route_123_index_1.html +105 -0
  36. data/test/fixtures/mobile_route_data/20100323/route_1_index_0.html +703 -0
  37. data/test/fixtures/mobile_route_data/20100323/route_1_index_1.html +694 -0
  38. data/test/fixtures/mobile_route_data/20100323/route_2_index_0.html +685 -0
  39. data/test/fixtures/mobile_route_data/20100323/route_2_index_1.html +649 -0
  40. data/test/fixtures/mobile_route_data/20100323/route_3_index_0.html +649 -0
  41. data/test/fixtures/mobile_route_data/20100323/route_3_index_1.html +721 -0
  42. data/test/fixtures/mobile_route_schedule/20090323/route_18_direction_2_location_25.html +1038 -0
  43. data/test/fixtures/mobile_route_schedule/20090323/route_1_direction_1_location_0.html +1127 -0
  44. data/test/fixtures/mobile_route_schedule/20090323/route_2_direction_2_location_11.html +1430 -0
  45. data/test/fixtures/mobile_route_schedule/20090323/route_2_direction__location_11.html +104 -0
  46. data/test/fixtures/mobile_route_schedule/20100323/route_1_direction_1_location_0.html +1180 -0
  47. data/test/fixtures/mobile_route_schedule/20100323/route_2_direction_2_location_11.html +1554 -0
  48. data/test/fixtures/mobile_route_schedule/20100323/route_3_direction_1_location_0.html +1082 -0
  49. data/test/fixtures/mobile_route_schedule/20100323/route_3_direction_1_location_1.html +1082 -0
  50. data/test/fixtures/mobile_stop_schedule/20090323/location_1987.yml +198 -0
  51. data/test/fixtures/mobile_stop_schedule/20090323/location_1987_route_index_0.html +1283 -0
  52. data/test/fixtures/mobile_stop_schedule/20090323/location_1987_route_index_1.html +194 -0
  53. data/test/fixtures/mobile_stop_schedule/20090323/location_1987_route_index_2.html +116 -0
  54. data/test/fixtures/mobile_stop_schedule/20090323/location_3058_route_index_12.html +149 -0
  55. data/test/fixtures/mobile_stop_schedule/20090323/location_8789_route_index_0.html +1002 -0
  56. data/test/fixtures/mobile_stop_schedule/20100323/location_1987.yml +209 -0
  57. data/test/fixtures/mobile_stop_schedule/20100323/location_1987_route_index_0.html +1393 -0
  58. data/test/fixtures/mobile_stop_schedule/20100323/location_1987_route_index_1.html +206 -0
  59. data/test/fixtures/mobile_stop_schedule/20100323/location_1987_route_index_2.html +123 -0
  60. data/test/fixtures/mobile_stop_schedule/20100323/location_3058_route_index_12.html +278 -0
  61. data/test/fixtures/mobile_stop_schedule/20100323/location_7558_route_index_0.html +979 -0
  62. data/test/fixtures/mobile_stop_schedule/20100323/location_8789_route_index_0.html +1059 -0
  63. data/test/fixtures/stop_resource/1987.html +126 -0
  64. data/test/test_helper.rb +15 -0
  65. data/test/unit/headsign_test.rb +34 -0
  66. data/test/unit/lingo_test.rb +139 -0
  67. data/test/unit/mobile_resource_methods_test.rb +25 -0
  68. data/test/unit/mobile_route_data_test.rb +124 -0
  69. data/test/unit/mobile_route_schedule_test.rb +210 -0
  70. data/test/unit/mobile_stop_schedule_test.rb +153 -0
  71. data/test/unit/service_date_test.rb +27 -0
  72. data/test/unit/stop_resource_test.rb +26 -0
  73. metadata +251 -0
@@ -0,0 +1,37 @@
1
+ module OCTranspo
2
+ module Landmarks
3
+ class << self
4
+
5
+ def simplify_accented_characters_in (query)
6
+ query = query.gsub(/È|É/, 'E')
7
+ query = query.gsub(/é/, 'e')
8
+ end
9
+
10
+ def find_landmarks_surrounding (query)
11
+ query = simplify_accented_characters_in(query)
12
+ url = URI.parse('http://www.octranspo.com/maps/busstops/imap.asp')
13
+ params = {"address" => query, "page"=>"search"}
14
+ response = Net::HTTP.post_form(url, params)
15
+ chunks = response.body.split("var marker = createMarker(new GPoint").map do |chunk|
16
+ chunk.strip.sub(");\r\nmap.addOverlay(marker);", '')
17
+ end
18
+ chunks.shift
19
+ chunks.pop
20
+ chunks.map do |chunk|
21
+ results = {}
22
+ first_part, second_part = chunk.split("\"").compact
23
+ latitude, longitude = first_part.sub("(", '').sub('), ', '').split(", ")
24
+ results.merge!(:latitude => latitude, :longitude => longitude)
25
+ results[:number] = Array(/INFO_PHONE=(\d\d\d\d)/.match(second_part))[1]
26
+ if id_matches = /<small> \(([A-Z0-9]+)\)<\/small>/.match(second_part)
27
+ results[:id] = id_matches[1]
28
+ end
29
+ if detour_matches = / - Detour<br><\/span>/.match(second_part)
30
+ results[:temporary?] = true
31
+ end
32
+ results
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,125 @@
1
+ module OCTranspo
2
+ module Lingo
3
+ extend self
4
+
5
+ def translate_headsign_message (lingo)
6
+ headsign_messages[lingo] || inflect_headsign(lingo)
7
+ end
8
+
9
+ def translate_headsign_signature (lingo)
10
+ headsign_signatures[lingo] || inflect_headsign(lingo)
11
+ end
12
+
13
+ def inflect_headsign (lingo)
14
+ lingo.mb_chars.upcase
15
+ end
16
+
17
+ def translate_location (lingo)
18
+ lingo = lingo.strip.gsub("\\", "/")
19
+ if landmark? lingo: return translate_landmark(lingo) end
20
+ if platform? lingo: return translate_platform(lingo) end
21
+ if address? lingo: return translate_address(lingo) end
22
+ if intersection? lingo: return translate_intersection(lingo) end
23
+ translate_landmark(lingo)
24
+ end
25
+
26
+ def inflect_location (lingo)
27
+ lingo.mb_chars.downcase.titlecase
28
+ end
29
+
30
+ def landmark? (lingo)
31
+ landmarks.key? lingo
32
+ end
33
+
34
+ def translate_landmark (lingo)
35
+ landmarks[lingo] || inflect_location(lingo)
36
+ end
37
+
38
+ def translate_roadway (lingo)
39
+ roadways[lingo] || translate_landmark(lingo)
40
+ end
41
+
42
+ def intersection? (lingo)
43
+ if address?(lingo)
44
+ false
45
+ else
46
+ extract_intersection_from(lingo) ? true : false
47
+ end
48
+ end
49
+
50
+ def extract_intersection_from (lingo)
51
+ if matched = lingo.match(/(.*) \/ (.*)/)
52
+ [matched[1], matched[2]].map!(&:strip)
53
+ end
54
+ end
55
+
56
+ def translate_intersection (lingo)
57
+ extracted = extract_intersection_from(lingo).map { |part| translate_roadway(part) }
58
+ "#{extracted.first} at #{extracted.last}"
59
+ end
60
+
61
+ def address? (lingo)
62
+ extract_address_from(lingo) ? true : false
63
+ end
64
+
65
+ def extract_address_from (lingo)
66
+ if matched = lingo.match(/(.*) \/ AD. (\d+)/)
67
+ {:street => matched[1], :number => matched[2]}
68
+ end
69
+ end
70
+
71
+ def translate_address (lingo)
72
+ extracted = extract_address_from(lingo)
73
+ "#{extracted[:number]} #{translate_roadway(extracted[:street])}"
74
+ end
75
+
76
+ def platform? (lingo)
77
+ extract_platform_from(lingo) ? true : false
78
+ end
79
+
80
+ def extract_platform_from (lingo)
81
+ extract_bus_platform_from(lingo) || extract_train_platform_from(lingo)
82
+ end
83
+
84
+ def extract_bus_platform_from (lingo)
85
+ if matched = lingo.match(/(.+[A-Z]+) +(\d[A-E])$/)
86
+ {:station => matched[1], :platform => matched[2]}
87
+ end
88
+ end
89
+
90
+ def extract_train_platform_from (lingo)
91
+ if matched = lingo.match(/^O-TRAIN CARLETON ([A-Z]).$/)
92
+ platforms = {'S' => "Southbound", 'N' => "Northbound"}
93
+ return {:station => "CARLETON", :platform => platforms[matched[1]]}
94
+ end
95
+ if matched = lingo.match(/^O-TRAIN (.+[A-Z]+)/)
96
+ return {:station => matched[1], :platform => "O-Train"}
97
+ end
98
+ end
99
+
100
+ def bus_platform_number_pattern
101
+ /[1-9][A-E]/
102
+ end
103
+
104
+ def format_platform (platform)
105
+ if platform.match(bus_platform_number_pattern)
106
+ "Platform #{platform}"
107
+ else
108
+ "#{platform} Platform"
109
+ end
110
+ end
111
+
112
+ def translate_platform (lingo)
113
+ extracted = extract_platform_from(lingo)
114
+ "#{translate_landmark(extracted[:station])}, #{format_platform extracted[:platform]}"
115
+ end
116
+
117
+ [:headsign_messages, :headsign_signatures, :landmarks, :roadways].each do |collection|
118
+ module_eval <<-END
119
+ def #{collection}
120
+ @#{collection} ||= YAML.load_file("#{File.dirname(__FILE__)}/lingo/#{collection}.yml")
121
+ end
122
+ END
123
+ end
124
+ end
125
+ end
@@ -0,0 +1,104 @@
1
+ "AIRPORT / AéROPORT": "AIRPORT"
2
+
3
+ "ALTA-VISTA": "ALTA VISTA"
4
+
5
+ "BARRHAVEN CTR": "BARRHAVEN CENTRE"
6
+ "Barrhaven Ctr Strandherd": "BARRHAVEN CENTRE"
7
+
8
+ "U. CARLETON U.": "CARLETON"
9
+
10
+ "DOWNTOWN/CENTRE-VILLE" : "DOWNTOWN"
11
+ "DOWNTOWN CENTRE-VILLE": "DOWNTOWN"
12
+ "DOWNTOWN / CENTRE-VILLE": "DOWNTOWN"
13
+ "2X DOWNTOWN CENTRE-VILLE": "DOWNTOWN"
14
+ "2X DOWNTOWN CENTRE-VILLE - BANK SOMERSET": "DOWNTOWN"
15
+ "7X DOWNTOWN CENTRE-VILLE": "DOWNTOWN"
16
+ "7X DOWNTOWN CENTRE-VILLE-BANK SOMERSET": "DOWNTOWN"
17
+ "14X DOWNTOWN CENTRE-VILLE": "DOWNTOWN"
18
+ "DOWNTOWN CENTRE-VILLE LEBRETON": "DOWNTOWN"
19
+ "DOWNTOWN CENTRE-VILLE HURDMAN": "DOWNTOWN"
20
+ "DOWNTOWN CENTRE-VILLE HURDMAN": "DOWNTOWN"
21
+
22
+ "NEPEAN S. / FALLOWFIELD": "FALLOWFIELD"
23
+
24
+ "ORLéANS": "ORLEANS"
25
+ "ORLÉANS": "ORLEANS"
26
+ "ORLEANS": "ORLEANS"
27
+
28
+ "PLACE D'ORLÉANS": "PLACE D’ORLÉANS"
29
+ "PLACE D' ORLÉANS": "PLACE D’ORLÉANS"
30
+ "PLACE D'ORLEANS": "PLACE D’ORLÉANS"
31
+
32
+ "OTTAWA-ROCKCLIFFE": "OTTAWA ROCKCLIFFE"
33
+ "3X OTTAWA-ROCKCLIFFE": "OTTAWA ROCKCLIFFE"
34
+ "7X OTT ROCKCLIFFE - BRITTANY MONTREAL": "OTTAWA ROCKCLIFFE"
35
+
36
+ "OTTAWA S.": "OTTAWA SOUTH"
37
+ "OTTAWA SOUTH / SUD": "OTTAWA SOUTH"
38
+
39
+ "CUMBERLAND - TRIM": "TRIM"
40
+ "CUMBERLAND TRIM via Belfast": "TRIM"
41
+ "CUMBERLAND TRIM via Jeanne d'Arc": "TRIM"
42
+ "CUMBERLND Trim via Rideau & Jeanne d'Arc": "TRIM"
43
+
44
+ "KANATA NORTH NORD": "KANATA NORTH"
45
+
46
+ "RIVERSIDE SOUTH / SUD": "RIVERSIDE SOUTH"
47
+
48
+ "GATINEAU / HULL OR TUNNEY'S PASTURE": "HULL"
49
+
50
+ "GLOUCESTER N. & BLAIR": "GLOUCESTER NORTH"
51
+ "GLOUCESTER NORTH / NORD": "GLOUCESTER NORTH"
52
+
53
+ "GLOUCESTER SOUTH / SUD": "GLOUCESTER SOUTH"
54
+ "GLOUCESTER SOUTH / SUD AM": "GLOUCESTER SOUTH"
55
+ "GLOUCESTER SOUTH / SUD OR/OU SOUTH KEYS": "GLOUCESTER SOUTH"
56
+
57
+ "IMMACULATA H.S.": "IMMACULATA HIGH SCHOOL"
58
+ "SPECIAL IMMACULATA H.S.": "IMMACULATA HIGH SCHOOL"
59
+
60
+ "LINCOLN FIELDS \ NEPEAN CENTRE": "LINCOLN FIELDS"
61
+
62
+ "LOCAL NORTH/NORD": "LOCAL NORTH"
63
+ "LOCAL NORTH / NORD": "LOCAL NORTH"
64
+
65
+ "LOCAL SOUTH/SUD": "LOCAL SOUTH"
66
+ "LOCAL SOUTH / SUD": "LOCAL SOUTH"
67
+
68
+ "LOCAL WEST / OUEST": "LOCAL WEST"
69
+
70
+ "NEPEAN CENTRE - ROBERTSON MOODIE": "NEPEAN CENTRE"
71
+ "3X NEPEAN CENTRE MERIVALE VIEWMOUNT": "NEPEAN CENTRE"
72
+
73
+ "NEPEAN CENTRE - BAYSHORE": "NEPEAN CENTRE & BAYSHORE"
74
+
75
+ "NEPEAN NORTH NORD": "NEPEAN NORTH"
76
+ "NEPEAN NORTH NORD": "NEPEAN NORTH"
77
+ "NEPEAN NORTH / NORD": "NEPEAN NORTH"
78
+ "NEPEAN NORTH / NORD - BAYSHORE": "NEPEAN NORTH"
79
+
80
+ "NEPEAN SOUTH / SUD": "NEPEAN SOUTH"
81
+
82
+ "ST LAURENT": "ST. LAURENT"
83
+
84
+ "TUNNEY'S PASTURE": "TUNNEY’S PASTURE"
85
+
86
+ "97X SOUTH KEYS HUNT CLUB": "SOUTH KEYS"
87
+
88
+ "97X NEPEAN N. BAYSHORE WOODRIDGE": "NEPEAN NORTH VIA BAYSHORE"
89
+
90
+ "129 X SPECIAL CARSON-MONTREAL": "CARSON MONTREAL"
91
+
92
+ "130 X SPECIAL ST. JOSEPH-GREY NUNS": "ST. JOSEPH-GREY NUNS"
93
+
94
+ "130 X SPECIAL JEANNE D'ARC\CHAMPLAIN": "JEANNE D’ARC CHAMPLAIN"
95
+
96
+ "135X SPECIAL ST. PETER'S H.S.": "ST. PETER’S HIGH SCHOOL"
97
+
98
+ "144X GLOUCESTER S. HINDU TEMPLE": "GLOUCESTER SOUTH HINDU TEMPLE"
99
+
100
+ "148X SPECIAL CANTERBURY": "CANTERBURY"
101
+
102
+ "156X SPECIAL MERIVALE AND VIEWMOUNT": "MERIVALE & VIEWMOUNT"
103
+
104
+ "156X SPECIAL MERIVALE & MEADOWLANDS.": "MERIVALE & MEADOWLANDS"
@@ -0,0 +1,3 @@
1
+ "1 SAMPLE SIGNATURE": "1 SAMPLE SIGNATURE"
2
+
3
+ "97 NEPEAN NORTH VIA BAYSHORE": "97X NEPEAN NORTH VIA BAYSHORE"
@@ -0,0 +1,205 @@
1
+ # Transit Stations
2
+ "BASELINE": "Baseline Station"
3
+ "BAYSHORE": "Bayshore Station"
4
+ "BAYVIEW": "Bayview Station"
5
+ "BILLINGS BRIDGE": "Billings Bridge Station"
6
+ "BLAIR": "Blair Station"
7
+ "CAMPUS": "Campus Station"
8
+ "CYRVILLE": "Cyrville Station"
9
+ "DOMINION": "Dominion Station"
10
+ "EAGLESON": "Eagleson Station"
11
+ "FALLOWFIELD": "Fallowfield Station"
12
+ "GREENBORO": "Greenboro Station"
13
+ "HERON": "Heron Station"
14
+ "HURDMAN": "Hurdman Station"
15
+ "IRIS": "Iris Station"
16
+ "LAURIER": "Laurier Station"
17
+ "LEBRETON": "Lebreton Station"
18
+ "LEES": "Lees Station"
19
+ "LINCOLN FIELDS": "Lincoln Fields Station"
20
+ "LYCÉE CLAUDEL": "Lycée Claudel Station"
21
+ "MACKENZIE KING": "Mackenzie King Station"
22
+ "PINECREST": "Pinecrest Station"
23
+ "PLEASANT PARK": "Pleasant Park Station"
24
+ "QUEENSWAY": "Queensway Station"
25
+ "RIVERSIDE": "Riverside Station"
26
+ "SMYTH": "Smyth Station"
27
+ "SOUTH KEYS": "South Keys Station"
28
+ "STRANDHERD": "Strandherd Station"
29
+ "TERRY FOX": "Terry Fox Station"
30
+ "TRAIN": "Train Station"
31
+ "TRIM": "Trim Station"
32
+ "WALKLEY": "Walkley Station"
33
+ "WESTBORO": "Westboro Station"
34
+ "CARLETON": "Carleton Station"
35
+ "CARLING": "Carling Station"
36
+ "CONFEDERATION": "Confederation Station"
37
+ "PLACE D’ORLÉANS": "Place d’Orléans Station"
38
+ "ORLÉANS": "Place d’Orléans Station"
39
+ "ST LAURENT": "St. Laurent Station"
40
+ "TUNNEY'S PASTURE": "Tunney’s Pasture Station"
41
+
42
+ # Park and Ride
43
+ "EAGLESON / EAGLESON PARK & RIDE - PARC-O-BUS": "Eagleson Rd. at Eagleson Station Park & Ride"
44
+
45
+ # Fix broken stations platforms
46
+ "TUNNEY'S PASTURE4A": "Tunney’s Pasture Station, Platform 4A"
47
+ "HERON 4A ": "Heron Station, Platform 4A"
48
+
49
+ # Rideau Centre platforms
50
+ "RIDEAU 3A": "Rideau Centre, Platform 3A"
51
+ "RIDEAU 4A": "Rideau Centre, Platform 4A"
52
+
53
+ # Hunt Club Loop platforms
54
+ "HUNT CLUB LOOP - BOUCLE / STOP - ARRÊT 1A": "Hunt Club Loop, Platform 1A"
55
+ "BOUCHE HUNT CLUB LOOP - STOP / ARRÊT 2A": "Hunt Club Loop, Platform 2A"
56
+
57
+ # Loops
58
+ "LOOP / MCEWEN": "McKewen Ave. Loop"
59
+ "SOLANDT LOOP": "Solandt Rd. Loop"
60
+
61
+ # OC Transpo garages
62
+ "MERIVALE GARAGE / GARAGE MERIVALE": "Colonnade Rd. at OC Transpo Garage"
63
+ "COLONNADE / GARAGE O.C. TRANSPO GARAGE": "Colonnade Rd. at OC Transpo Garage"
64
+
65
+ # Fix intersections
66
+ "FALLOWFIELD / STATION FALLOWFIELD STATION": "Fallowfield Rd. at Fallowfield Station"
67
+ "ALBERT / STATION BAYVIEW STATION": "Albert St. at Bayview Station"
68
+ "CARLING / ACRES SIDE": "Carling Ave. at Holly Acres Rd."
69
+ "CAMPUS / COMMONS": "Campus Ave. at Library Rd."
70
+ "OLD STRANDHERD / HOULAHAN": "Opal Ln. at Houlahan St."
71
+ "MONTRÉAL / NRC": "Montreal Rd. at McArthur Ave."
72
+ "BANK / VISITOR": "Bank St. at South Keys Shopping Centre"
73
+ "TENTH LINE / BLACKBURN": "Tenth Line Rd. at Blackburn Bypass"
74
+ "BLAIR / DAVIDSON": "Blair Rd. at Davidson Dr."
75
+ "BLAIR E / DAVIDSON": "Blair Rd. at Davidson Dr."
76
+ "CARLING / DAVIDSON": "Carling Ave. at Davidsons Side Rd."
77
+ "CARLING / DAVIDSON''S SIDE": "Carling Ave. at Davidsons Side Rd."
78
+ "CARLING / STATION O-TRAIN STATION": "Carling Ave. at O-Train"
79
+ "MORGAN''S GRANT / FLAMBOROUGH": "Morgan’s Grant Way at. Flamborough Way"
80
+ "PROM D'ORLEANS / CENTRUM": "Place d’Orleans Dr. at Centrum Blvd."
81
+ "RUE IRIS ST./ INTERSECTION TRANSIT": "Iris St. at Transitway"
82
+ "BRONSON / HERON": "Bronson Ave. at Confederation Station"
83
+ "STOP/ARRÊT ON/SUR HERON AT/À CONFEDERATION STN.": "Heron Rd. at Confederation Station"
84
+ "HERON / BRONSON": "Heron Rd. at Confederation Station"
85
+ "SHEA / SHEA / COMPLEXE GOULBOURN COMPLEX": "Shea Rd. at Goulbourn Recreation Complex"
86
+ "SHEA / COMPLEXE GOULBOURN COMPLEX": "Shea Rd. at Goulbourn Recreation Complex"
87
+ "PRINCE OF WALES / MUSÉE D'/AGRICULTURE / MUSEUM": "Prince Of Wales Dr. at Agriculture Museum"
88
+ "HWY 417/MOODIE (PRESS BUTTON/APPUYEZ LE BOUTON)": "Highway 417 at Moodie Dr."
89
+
90
+ # Fix forward slash without whitespace.
91
+ "HERON/EDGEHILL": "Heron Rd. at Edge Hill Pl."
92
+ "LONGFIELD/STRANDHERD": "Longfields Dr. at Strandherd Dr."
93
+ "CASTLEFRANK/HAZELDEAN": "Castlefrank Rd. at Hazeldean Rd."
94
+ "GRASSY PLAINS/STONEHAVEN": "Grassy Plains Dr. at Stonehaven Dr."
95
+ "GOLDRIDGE/NORGOLD": "Goldridge Dr. at Norgold Crescent"
96
+ "STEVENAGE/GLENFIELD": "Stevenage Dr. at Glenfield Dr."
97
+
98
+ # Fix forward slash without leading whitespace.
99
+ "HAWTHORNE/ AD. 3101": "3101 Hawthorne Rd."
100
+ "LONGFIELDS/ PROTHURSH": "Longfields Dr. at Portrush Ave."
101
+ "JEANNE D'ARC/ AVIGNON": "Jeanne d’Arc Blvd. at Avignon Ct."
102
+ "SWANSEA/ PATHWAY - SENTIER": "Swansea Crescent at Pathway"
103
+ "MANN/ CHAPEL": "Mann Ave. at Chapel Rd."
104
+
105
+ # Fix forward slash without trailing whitespace.
106
+ "STAR TOP /INNES": "Star Top Rd. at Innes Rd."
107
+
108
+ # Fix node
109
+ "NODE4518": "Dauphin Rd. at Hillcrest High School"
110
+
111
+ # Airport
112
+ "AIRPORT STOP / ARRÊT AÉROPORT": "Ottawa International Airport"
113
+ "AIRPORT/ AIR CANADA CARGO": "Airport Pkwy. at Air Canada Cargo"
114
+ "AIRPORT / UPLANDS - ON REQUEST/SUR DEMANDE": "Airport Pkwy. at Uplands Dr."
115
+
116
+ # Cemetaries
117
+ "CIMETIÈRE NOTRE DAME CEMETERY": "Notre Dame Cemetery"
118
+
119
+ # Government properties
120
+ "SHIRLEY'S BAY": "Shirley’s Bay Campus"
121
+ "TERRASSES DE LA CHAUDIÈRE": "Terrasses de la Chaudière"
122
+ "NRC GUARDHOUSE - POSTE DE GARDE": "NRC Building M-2"
123
+ "NRC ROAD MACALLUM/ ÉDIFICE M 1 BLDG": "NRC Building M-2"
124
+ "NRC ROAD BALLARD / BLAIR": "Ballard Rd. at Blair Rd."
125
+ "NRC ROAD BALLARD / ÉDIFICE M 50 BLDG": "Ballard Rd. at NRC Buidling M-50"
126
+ "NRC ROAD BALLARD / ÉDIFICE M 50 BLDG": "Ballard Rd. at NRC Buidling M-50"
127
+ "NRC ROAD HOWLETT / ÉDIFICE M21 BLDG": "Howlett Rd. at NRC Building M-21"
128
+ "NRC ROAD HOWLETT / ÉDIFICE M36 BLDG": "Howlett Rd. at NRC Building M-36"
129
+ "NRC ROAD HOWLETT / ÉDIFICE M 36 BLDG": "Howlett Rd. at NRC Building M-36"
130
+ "NRC ROAD LATHE / ÉDIFICE M 54 BLDG": "Lathe Rd. at NRC Buidling M-54"
131
+ "NRC ROAD LATHE / ÉDIFICE M 55 BLDG": "Lathe Rd. at NRC Buidling M-55"
132
+ "NRC ROAD LATHE / ÉDIFICE M 79 BLDG": "Lathe Rd. at NRC Building M-79"
133
+
134
+ # Health Centres
135
+ "HÔPITAL PERLEY HOSPITAL": "Perley Rideau Veterans’ Health Centre"
136
+
137
+ # Hospitals
138
+ "HÔPITAL D'ENFANT-CHILDRENS HOSPITAL": "Children’s Hospital of Eastern Ontario"
139
+ "HÔPITAL CIVIC HOSPITAL": "Ottawa Civic Hospital"
140
+ "HÔPITAL MONTFORT HOSPITAL": "Hôpital Montfort"
141
+ "HÔPITAL QUEENSWAY HOSPITAL": "Queensway Carleton Hospital"
142
+
143
+ # Ottawa Hospital – General Campus
144
+ "HOSPITAL ENTRANCE- ENTRÉE D''HÔPITAL": "Ottawa General Hospital"
145
+ "RING ROAD / HÔPITAL GENERAL HOSPITAL": "Ottawa General Hospital"
146
+ "RING ROAD / SMYTH": "Ottawa General Hospital, Parking Lot"
147
+ "RING ROAD": "Ottawa General Hospital Ring Rd."
148
+ "RING ROAD / REHABILITATION/CENTRE/RÉHABILITATION": "Ottawa Hospital Rehabilitation Centre"
149
+ "RING ROAD / MAISON RONALD MCDONALD HOUSE": "Ronald McDonald House"
150
+ "RING ROAD / HÔPITAL D'ENFANT-CHILDRENS HOSPITAL": "Children’s Hospital of Eastern Ontario"
151
+
152
+ # Hull
153
+ "LAURIER / ÉLISABETH-BRUYÈRE": "Rue Laurier at Rue Élisabeth-Bruyère"
154
+ "ALLUMETTIÈRES / LAURIER": "Boulevard Des Allumettières at Rue Laurier"
155
+ "MAISONNEUVE / HÔTEL DE VILLE": "Boulevard Maisonneuve at Rue De l’Hôtel-de-Ville"
156
+
157
+ # Malls
158
+ "MAIL BEACON HILL MALL": "Beacon Hill Mall"
159
+ "MAIL CARLINGWOOD MALL": "Carlingwood Mall"
160
+ "MAIL HAZELDEAN MALL": "Hazeldean Mall"
161
+ "MAIL LINCOLN HEIGHTS MALL": "Lincoln Heights Mall"
162
+ "MAIL PINCREST MALL": "Pinecrest Mall"
163
+ "MAIL PINECREST MALL": "Pinecrest Mall"
164
+ "MAIL WESTGATE MALL": "Westgate Mall"
165
+ "MAIL PLACE D'ORLÉANS MALL": "Place d’Orléans Mall"
166
+ "ELMVALE MALL STOP / ARRÊT MAIL ELMVALE": "Elmvale Mall"
167
+ "HAZELDEAN MALL / ARRÊT EST - EAST STOP": "Hazeldean Mall"
168
+ "HAZELDEAN MALL / ARRÊT OUEST - WEST STOP": "Hazeldean Mall"
169
+ "CENTRE KANATA CENTRE": "Kanata Town Centre"
170
+
171
+ # Museums
172
+ "MUSÉE DE L AGRICULTURE MUSEUM": "Agriculture Museum"
173
+ "MUSÉE D' AVIATION MUSEUM": "Aviation Museum"
174
+
175
+ # Parks
176
+ "PARC ANDREW HAYDON PARK": "Andrew Haydon Park"
177
+ "PARC BATHGATE PARK": "Bathgate Park"
178
+ "PARC BAYSHORE PARK": "Bayshore Park"
179
+ "PARC BRITANNIA PARK": "Britannia Park"
180
+ "PARC BRITANNIA PARK / PARKING - STATIONNEMENT": "Britannia Park"
181
+ "PARC BRITANNIA PARK / LOOP - BOUCLE": "Britannia Park, Parking Lot"
182
+ "PARC HORNET'S NEST PARK": "Hornet’s Nest Park"
183
+ "PARC JETFORM PARK": "Jetform Park"
184
+ "PARC JOE JAMIESON PARK": "Joe Jamieson Park"
185
+ "PARC LANSDOWNE PARK": "Lansdowne Park"
186
+ "PARC UTMAN PARK": "Utman Park"
187
+ "PARC MARQUIS PARK": "Marquis Park"
188
+
189
+ # Places
190
+ "ARÉNA ARMSTRONG ARENA": "Earl Armstrong Arena"
191
+
192
+ # Schools
193
+ "ECOLE TERRY FOX SCHOOL": "Terry Fox Elementary School"
194
+ "ÉCOLE TERRY FOX SCHOOL": "Terry Fox Elementary School"
195
+ "THOMAS D'ARCY MCGEE SCHOOL": "Thomas D’Arcy Mcgee Elementary School"
196
+ "É.S. NOTRE DAME": "Notre Dame High School"
197
+ "ECOLE HILLCREST SCHOOL": "Hillcrest High School"
198
+ "BELL H.S.": "Bell High School"
199
+ "É.S. DE LA SALLE": "École secondaire De La Salle"
200
+ "LAURENTIAN H.S.": "Laurentian High School"
201
+ "L B PEARSON H.S.": "Lester B. Pearson High School"
202
+
203
+ # Ramps
204
+ "HOLLY ACRES / RAMP - BRETELLE": "Holly Acres Rd. at Highway 417 Off-ramp"
205
+ "LEES / HIGHWAY 417 RAMP - BRETELLE": "Lees Ave. at Highway 417 On-ramp"