octranspo 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
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"