cta-api 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in cta-api.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 fbonetti
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,91 @@
1
+ ## Install
2
+
3
+ Via rubygems.org:
4
+
5
+ ```
6
+ $ gem install cta-api
7
+ ```
8
+
9
+ ## Usage
10
+
11
+ This gem allows you to access the Chicago Transit Authority API via Ruby. You can track the real-time locations of all public transportation vehicles, including buses and trains. You can obtain API keys from the CTA website:
12
+
13
+ http://www.transitchicago.com/developers/bustracker.aspx
14
+ http://www.transitchicago.com/developers/traintracker.aspx
15
+
16
+ ## Bus Tracker
17
+
18
+ ### Setup
19
+
20
+ ``` ruby
21
+ require 'cta-api'
22
+
23
+ key = "XXXXXXXXXXXXXXXXXXXXXXXXX"
24
+ @tracker = CTA::TrainTracker.new(key)
25
+ ```
26
+
27
+ ### Find Routes and Stops
28
+
29
+ ``` ruby
30
+ # list all available routes
31
+ @tracker.routes
32
+
33
+ # gets the available directions for the specified route (north, south, etc.)
34
+ @tracker.route_directions("50")
35
+
36
+ # list all stops that belong to a particular route
37
+ @tracker.stops("50", :north)
38
+ ```
39
+
40
+ ### Find Vehicles
41
+
42
+ ``` ruby
43
+ # returns an array of vehicles that travel the given routes
44
+ @tracker.vehicles_by_routes(["50", "52A"])
45
+
46
+ # returns an array of vehicles with the given vehicle ids
47
+ @tracker.vehicles_by_ids(["1782", "1419", "1773"])
48
+ ```
49
+
50
+ ### Get Predicted Arrival Times
51
+
52
+ ``` ruby
53
+ # get arrival times for a list of stop ids
54
+ # note that the second argument is optional
55
+ @tracker.predictions_by_stop_ids(["8751", "8752"], "50")
56
+
57
+ # get arrival times for a list of vehicle ids
58
+ @tracker.predictions_by_vehicle_ids(["1782", "1419", "1773"])
59
+ ```
60
+
61
+ ### Get System Time
62
+ ``` ruby
63
+ @tracker.time
64
+ ```
65
+
66
+ ## Train Tracker
67
+
68
+ ### Setup
69
+
70
+ ``` ruby
71
+ require 'cta-api'
72
+
73
+ key = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
74
+ tracker = CTA::TrainTracker.new(key)
75
+ ```
76
+
77
+ ## Get a List of Stops and Stations
78
+
79
+ ``` ruby
80
+ # stops
81
+ @tracker.stops
82
+
83
+ # stations
84
+ @tracker.stations
85
+ ```
86
+
87
+ ## Get Predicted Arrival Times
88
+
89
+ ``` ruby
90
+ @tracker.arrivals stop_id: "30106"
91
+ ```
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
@@ -0,0 +1,17 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = 'cta-api'
3
+ s.version = '1.0.0'
4
+ s.author = 'Frank Bonetti'
5
+ s.date = '2013-02-02'
6
+
7
+ s.license = 'MIT'
8
+ s.platform = Gem::Platform::RUBY
9
+
10
+ s.description = 'An easy way to access the Chicago Transit Authority API via the Ruby programming language'
11
+ s.summary = 'An easy way to access the Chicago Transit Authority API via the Ruby programming language'
12
+ s.email = 'frank.r.bonetti@gmail.com'
13
+
14
+ s.require_paths = ['lib']
15
+ s.files = Dir.glob("**/*").reject { |x| File.directory?(x) }
16
+ s.add_dependency('nokogiri', '>= 1.5.6')
17
+ end
@@ -0,0 +1,208 @@
1
+ module CTA
2
+ class BusTracker
3
+
4
+ def initialize(key)
5
+ @key = key
6
+ end
7
+
8
+ def time
9
+ base_url = "http://www.ctabustracker.com/bustime/api/v1/gettime?"
10
+ url = "#{ base_url}key=#{ @key }"
11
+ Time.parse(Nokogiri::XML(open(url)).at("//tm").text)
12
+ end
13
+
14
+ def vehicles_by_routes(routes)
15
+ if routes.kind_of?(Array)
16
+ full_array = []
17
+ until routes.size == 0
18
+ full_array << vehicles(route: routes.shift(10))
19
+ end
20
+ full_array.flatten!
21
+ else
22
+ raise ArgumentError.new "Argument must be an Array."
23
+ end
24
+ end
25
+
26
+ def vehicles_by_ids(vids)
27
+ if vids.kind_of?(Array) && routes.size.between(1,10)
28
+ vehicles(vid: vids)
29
+ else
30
+ raise ArgumentError.new "must be an Array with 1 to 10 elements."
31
+ end
32
+ end
33
+
34
+ def patterns_by_route(route)
35
+ if route.kind_of?(String) && route.length > 0
36
+ patterns(route: route)
37
+ else
38
+ raise ArgumentError.new "must be a String with a length greater than zero."
39
+ end
40
+ end
41
+
42
+ def patterns_by_ids(pid)
43
+ if pid.kind_of?(Array) && pid.size.between?(1,10)
44
+ patterns(pid: pid)
45
+ else
46
+ raise ArgumentError.new "must be an Array with 1 to 10 elements."
47
+ end
48
+ end
49
+
50
+ def predictions_by_stop_ids(stop_id, route="")
51
+ if stop_id.kind_of?(Array) && stop_id.size.between?(1,10)
52
+ predictions(stop_id: stop_id, route: route)
53
+ else
54
+ raise ArgumentError.new "must be an Array with 1 to 10 elements."
55
+ end
56
+ end
57
+
58
+ def predictions_by_vehicle_ids(vid)
59
+ if vid.kind_of?(Array) && vid.size.between?(1,10)
60
+ predictions(vid: vid)
61
+ else
62
+ raise ArgumentError.new "must be an Array with 1 to 10 elements."
63
+ end
64
+ end
65
+
66
+ def routes
67
+ base_url = "http://www.ctabustracker.com/bustime/api/v1/getroutes?"
68
+ url = "#{ base_url }key=#{ @key }"
69
+ route_hash = {}
70
+ Nokogiri::XML(open(url)).xpath("//route").each do |route|
71
+ route_hash[route.at("rt").text] = route.at("rtnm").text
72
+ end
73
+ route_hash
74
+ end
75
+
76
+ def route_directions(route)
77
+ if route.kind_of?(String)
78
+ base_url = "http://www.ctabustracker.com/bustime/api/v1/getdirections?rt=#{ route }"
79
+ url = "#{ base_url }&key=#{ @key }"
80
+ Nokogiri::XML(open(url)).xpath("//dir").map { |x| x.text.split(/ /)[0].to_sym }
81
+ end
82
+ end
83
+
84
+ def stops(route, direction)
85
+ if (route.kind_of?(String) || route.kind_of?(Integer)) && direction.kind_of?(Symbol)
86
+ direction = direction.to_s + "+bound"
87
+ base_url = "http://www.ctabustracker.com/bustime/api/v1/getstops?"
88
+ url = "#{ base_url }key=#{ @key }&rt=#{ route }&dir=#{ direction }"
89
+
90
+ stop_array = Nokogiri::XML(open(url)).xpath("//stop").map do |item|
91
+ Stop.new({
92
+ :id => item.at("stpid").text,
93
+ :name => item.at("stpnm").text,
94
+ :latitude => item.at("lat").text,
95
+ :longitude => item.at("lon").text
96
+ })
97
+ end
98
+ stop_array
99
+ end
100
+ end
101
+
102
+ def service_bulletins(params)
103
+ route = params[:route] || []
104
+ route_direction = params[:route_direction]
105
+ stop_id = params[:stop_id] || []
106
+
107
+ base_url = "http://www.ctabustracker.com/bustime/api/v1/getservicebulletins?"
108
+ url = "#{ base_url }key=#{ @key }&rt=#{ route.join(',') }&rtdir=#{ route_direction }&stpid=#{ stop_id.join(',') }"
109
+ puts url
110
+
111
+ bulletin_array = Nokogiri::XML(open(url)).xpath("//sb").map do |item|
112
+ ServiceBulletin.new({
113
+ :name => item.at("nm") && item.at("nm").text,
114
+ :subject => item.at("sbj") && item.at("sbj").text,
115
+ :detail => item.at("dtl") && item.at("dtl").text.gsub("<br/>", "\n").strip,
116
+ :brief => item.at("brf") && item.at("brf").text,
117
+ :priority => item.at("prty") && item.at("prty").text,
118
+ :services => item.xpath("srvc") && item.xpath("srvc").map do |subitem|
119
+ ServiceBulletin::Service.new({
120
+ :route => subitem.at("rt") && subitem.at("rt").text,
121
+ :route_direction => subitem.at("rtdir") && subitem.at("rtdir").text,
122
+ :stop_id => subitem.at("stpid") && subitem.at("stpid").text,
123
+ :stop_name => subitem.at("stpnm") && subitem.at("stpnm").text
124
+ })
125
+ end
126
+ })
127
+ end
128
+ bulletin_array
129
+ end
130
+
131
+ private
132
+
133
+ def vehicles(params)
134
+ route = params[:route] || []
135
+ vid = params[:vid] || []
136
+
137
+ base_url = "http://www.ctabustracker.com/bustime/api/v1/getvehicles?"
138
+ url = "#{ base_url }key=#{ @key }&rt=#{ route.join(",") }&vid=#{ vid.join(",") }"
139
+
140
+ vehicle_array = Nokogiri::XML(open(url)).xpath("//vehicle").map do |item|
141
+ Vehicle.new({
142
+ :id => item.at("vid").text,
143
+ :timestamp => Time.parse(item.at("tmstmp").text),
144
+ :latitude => item.at("lat").text,
145
+ :longitude => item.at("lon").text,
146
+ :heading => item.at("hdg").text,
147
+ :pattern_id => item.at("pid").text,
148
+ :pattern_distance => item.at("pdist").text,
149
+ :destination => item.at("des").text,
150
+ :delay => item.at("dly") && item.at("dly").text.to_bool
151
+ })
152
+ end
153
+ vehicle_array
154
+ end
155
+
156
+ def patterns(params)
157
+ route = params[:route]
158
+ pid = params[:pid] || []
159
+
160
+ base_url = "http://www.ctabustracker.com/bustime/api/v1/getpatterns?"
161
+ url = "#{ base_url }key=#{ @key }&rt=#{ route }&pid=#{ pid.join(",") }"
162
+
163
+ pattern_array = Nokogiri::XML(open(url)).xpath("//ptr").map do |item|
164
+ Pattern.new({
165
+ :id => item.at("pid").text,
166
+ :length => item.at("ln").text.to_f,
167
+ :direction => item.at("rtdir").text,
168
+ :points => item.xpath("pt").map do |subitem|
169
+ Pattern::Point.new({
170
+ :sequence => subitem.at("seq").text,
171
+ :latitude => subitem.at("lat").text,
172
+ :longitude => subitem.at("lon").text,
173
+ :type => subitem.at("typ").text == "S" ? "stop" : "waypoint",
174
+ :id => subitem.at("stpid") && subitem.at("stpid").text,
175
+ :name => subitem.at("stpnm") && subitem.at("stpnm").text,
176
+ :distance => subitem.at("pdist") && subitem.at("pdist").text
177
+ })
178
+ end
179
+ })
180
+ end
181
+ pattern_array
182
+ end
183
+
184
+ def predictions(params)
185
+ stop_id = params[:stop_id] || []
186
+ route = params[:route] || []
187
+ vid = params[:vid] || []
188
+
189
+ base_url = "http://www.ctabustracker.com/bustime/api/v1/getpredictions?"
190
+ url = "#{ base_url }key=#{ @key }&stpid=#{ stop_id.join(',') }&rt=#{ route.join(',') }&vid=#{ vid.join(',') }"
191
+
192
+ prediction_array = Nokogiri::XML(open(url)).xpath("//prd").map do |item|
193
+ Prediction.new({
194
+ :timestamp => Time.parse(item.at("tmstmp").text),
195
+ :type => item.at("typ").text == "A" ? "arrival" : "departure",
196
+ :stop_name => item.at("stpnm").text,
197
+ :vehicle_id => item.at("vid").text,
198
+ :distance_from_stop => item.at("dstp").text.to_f,
199
+ :route => item.at("rt").text,
200
+ :route_direction => item.at("rtdir").text,
201
+ :destination => item.at("des").text,
202
+ :predicted_time => Time.parse(item.at("prdtm").text)
203
+ })
204
+ end
205
+ prediction_array
206
+ end
207
+ end
208
+ end
@@ -0,0 +1,13 @@
1
+ module CTA
2
+ class BusTracker
3
+ class Pattern
4
+ attr_reader :id, :length, :direction, :points
5
+
6
+ def initialize(params)
7
+ params.each do |key, value|
8
+ self.instance_variable_set("@#{ key }".to_sym, value)
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,15 @@
1
+ module CTA
2
+ class BusTracker
3
+ class Pattern
4
+ class Point
5
+ attr_reader :sequence, :latitude, :longitude, :type, :id, :name, :distance
6
+
7
+ def initialize(params)
8
+ params.each do |key, value|
9
+ self.instance_variable_set("@#{ key }".to_sym, value)
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,13 @@
1
+ module CTA
2
+ class BusTracker
3
+ class Prediction
4
+ attr_reader :timestamp, :type, :stop_name, :stop_id, :vehicle_id, :distance_from_stop, :route, :route_direction, :destination, :predicted_time
5
+
6
+ def initialize(params)
7
+ params.each do |key, value|
8
+ self.instance_variable_set("@#{ key }".to_sym, value)
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module CTA
2
+ class BusTracker
3
+ class ServiceBulletin
4
+ attr_reader :name, :subject, :detail, :brief, :priority, :services
5
+
6
+ def initialize(params)
7
+ params.each do |key, value|
8
+ self.instance_variable_set("@#{ key }".to_sym, value)
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,15 @@
1
+ module CTA
2
+ class BusTracker
3
+ class ServiceBulletin
4
+ class Service
5
+ attr_reader :route, :route_direction, :stop_id, :stop_name
6
+
7
+ def initialize(params)
8
+ params.each do |key, value|
9
+ self.instance_variable_set("@#{ key }".to_sym, value)
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,13 @@
1
+ module CTA
2
+ class BusTracker
3
+ class Stop
4
+ attr_reader :id, :name, :latitude, :longitude
5
+
6
+ def initialize(params)
7
+ params.each do |key, value|
8
+ self.instance_variable_set("@#{ key }".to_sym, value)
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module CTA
2
+ class BusTracker
3
+ class Vehicle
4
+ attr_reader :id, :timestamp, :latitude, :longitude, :heading, :pattern_id, :pattern_distance, :destination, :delay
5
+
6
+ def initialize(params)
7
+ params.each do |key, value|
8
+ self.instance_variable_set("@#{ key }".to_sym, value)
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,23 @@
1
+ require 'nokogiri'
2
+ require 'open-uri'
3
+ require 'time'
4
+ require 'csv'
5
+
6
+ require 'bus-tracker/bus-tracker'
7
+ require 'bus-tracker/pattern'
8
+ require 'bus-tracker/stop'
9
+ require 'bus-tracker/vehicle'
10
+ require 'bus-tracker/point'
11
+ require 'bus-tracker/prediction'
12
+ require 'bus-tracker/service-bulletin'
13
+ require 'bus-tracker/service'
14
+ require 'train-tracker/train-tracker'
15
+ require 'train-tracker/estimate'
16
+
17
+ class String
18
+ def to_bool
19
+ return true if self == true || self =~ (/(true|t|yes|y|1)$/i)
20
+ return false if self == false || self =~ (/(false|f|no|n|0)$/i)
21
+ raise ArgumentError.new("invalid value for Boolean: \"#{self}\"")
22
+ end
23
+ end
@@ -0,0 +1,3 @@
1
+ module CTA
2
+ VERSION = "1.0.1"
3
+ end
@@ -0,0 +1,299 @@
1
+ STOP_ID,DIRECTION_ID,STOP_NAME,LON,LAT,STATION_NAME,STATION_DESCRIPTIVE_NAME,PARENT_STOP_ID,ADA,Red,Blue,Brn,G,P,Pexp,Y,Pink,Org
2
+ 30162,W,18th (54th/Cermak-bound),-87.669147,41.857908,18th,18th (Pink Line),40830,1,0,0,0,0,0,0,0,1,0
3
+ 30161,E,18th (Loop-bound),-87.669147,41.857908,18th,18th (Pink Line),40830,1,0,0,0,0,0,0,0,1,0
4
+ 30022,N,35th/Archer (Loop-bound),-87.680622,41.829353,35th/Archer,35th/Archer (Orange Line),40120,1,0,0,0,0,0,0,0,0,1
5
+ 30023,S,35th/Archer (Midway-bound),-87.680622,41.829353,35th/Archer,35th/Archer (Orange Line),40120,1,0,0,0,0,0,0,0,0,1
6
+ 30214,S,35-Bronzeville-IIT (63rd-bound),-87.625826,41.831677,35th-Bronzeville-IIT,35th-Bronzeville-IIT (Green Line),41120,1,0,0,0,1,0,0,0,0,0
7
+ 30213,N,35-Bronzeville-IIT (Harlem-bound),-87.625826,41.831677,35th-Bronzeville-IIT,35th-Bronzeville-IIT (Green Line),41120,1,0,0,0,1,0,0,0,0,0
8
+ 30246,S,43rd (63rd-bound),-87.619021,41.816462,43rd,43rd (Green Line),41270,1,0,0,0,1,0,0,0,0,0
9
+ 30245,N,43rd (Harlem-bound),-87.619021,41.816462,43rd,43rd (Green Line),41270,1,0,0,0,1,0,0,0,0,0
10
+ 30210,S,47th (63rd-bound) Elevated (63rd-bound),-87.618826,41.809209,47th,47th (Green Line),41080,1,0,0,0,1,0,0,0,0,0
11
+ 30209,N,47th (SB) Elevated (Harlem-bound),-87.618826,41.809209,47th,47th (Green Line),41080,1,0,0,0,1,0,0,0,0,0
12
+ 30238,S,47th-Dan Ryan (95th-bound),-87.63094,41.810318,47th,47th (Red Line),41230,1,1,0,0,0,0,0,0,0,0
13
+ 30237,N,47th-Dan Ryan (Howard-bound),-87.63094,41.810318,47th,47th (Red Line),41230,1,1,0,0,0,0,0,0,0,0
14
+ 30025,S,51st (63rd-bound),-87.618487,41.80209,51st,51st (Green Line),40130,1,0,0,0,1,0,0,0,0,0
15
+ 30024,N,51st (Harlem-bound),-87.618487,41.80209,51st,51st (Green Line),40130,1,0,0,0,1,0,0,0,0,0
16
+ 30113,E,54th/Cermak (Loop-bound),-87.75669201,41.85177331,54th/Cermak,54th/Cermak (Pink Line),40580,1,0,0,0,0,0,0,0,1,0
17
+ 30114,W,54th/Cermak (Terminal arrival),-87.75669201,41.85177331,54th/Cermak,54th/Cermak (Pink Line),40580,1,0,0,0,0,0,0,0,1,0
18
+ 30178,S,63rd-Dan Ryan (95th-bound),-87.630952,41.780536,63rd,63rd (Red Line),40910,0,1,0,0,0,0,0,0,0,0
19
+ 30177,N,63rd-Dan Ryan (Howard-bound),-87.630952,41.780536,63rd,63rd (Red Line),40910,0,1,0,0,0,0,0,0,0,0
20
+ 30192,S,69th (95th-bound),-87.625724,41.768367,69th,69th (Red Line),40990,1,1,0,0,0,0,0,0,0,0
21
+ 30191,N,69th (Howard-bound),-87.625724,41.768367,69th,69th (Red Line),40990,1,1,0,0,0,0,0,0,0,0
22
+ 30047,S,79th (95th-bound),-87.625112,41.750419,79th,79th (Red Line),40240,1,1,0,0,0,0,0,0,0,0
23
+ 30046,N,79th (Howard-bound),-87.625112,41.750419,79th,79th (Red Line),40240,1,1,0,0,0,0,0,0,0,0
24
+ 30276,S,87th (95th-bound),-87.624717,41.735372,87th,87th (Red Line),41430,0,1,0,0,0,0,0,0,0,0
25
+ 30275,N,87th (Howard-bound),-87.624717,41.735372,87th,87th (Red Line),41430,0,1,0,0,0,0,0,0,0,0
26
+ 30089,S,95th/Dan Ryan (95th-bound),-87.624342,41.722377,95th/Dan Ryan,95th/Dan Ryan (Red Line),40450,1,1,0,0,0,0,0,0,0,0
27
+ 30088,N,95th/Dan Ryan (Howard-bound),-87.624342,41.722377,95th/Ran Ryan,95th/Ran Ryan (Red Line),40450,1,1,0,0,0,0,0,0,0,0
28
+ 30132,S,Adams/Wabash (Inner Loop),-87.626037,41.879507,Adams/Wabash,"Adams/Wabash (Brown, Green, Orange, Pink & Purple Lines)",40680,0,0,0,0,1,0,1,0,1,1
29
+ 30131,N,Adams/Wabash (Outer Loop),-87.626037,41.879507,Adams/Wabash,"Adams/Wabash (Brown, Green, Orange, Pink & Purple Lines)",40680,0,0,0,1,1,0,0,0,0,0
30
+ 30240,S,Addison (O'Hare Branch) (Forest Pk-bound),-87.71906,41.94738,Addison,Addison (Blue Line),41240,0,0,1,0,0,0,0,0,0,0
31
+ 30239,N,Addison (O'Hare Branch) (O'Hare-bound),-87.71906,41.94738,Addison,Addison (Blue Line),41240,0,0,1,0,0,0,0,0,0,0
32
+ 30277,N,Addison (Kimball-bound),-87.674642,41.947028,Addison,Addison (Brown Line),41440,1,0,0,1,0,0,0,0,0,0
33
+ 30278,S,Addison (Loop-bound),-87.674642,41.947028,Addison,Addison (Brown Line),41440,1,0,0,1,0,0,0,0,0,0
34
+ 30274,S,Addison (95th-bound),-87.653626,41.947428,Addison,Addison (Red Line),41420,1,1,0,0,0,0,0,0,0,0
35
+ 30273,N,Addison (Howard-bound),-87.653626,41.947428,Addison,Addison (Red Line),41420,1,1,0,0,0,0,0,0,0,0
36
+ 30230,S,Argyle (95th-bound),-87.65853,41.973453,Argyle,Argyle (Red Line),41200,0,1,0,0,0,0,0,0,0,0
37
+ 30229,N,Argyle (Howard-bound),-87.65853,41.973453,Argyle,Argyle (Red Line),41200,0,1,0,0,0,0,0,0,0,0
38
+ 30127,N,Armitage (Kimball-Linden-bound),-87.652644,41.918217,Armitage,Armitage (Brown & Purple Lines),40660,1,0,0,1,0,0,1,0,0,0
39
+ 30128,S,Armitage (Loop-bound),-87.652644,41.918217,Armitage,Armitage (Brown & Purple Lines),40660,1,0,0,1,0,0,1,0,0,0
40
+ 30205,N,Ashland (Loop-bound),-87.665317,41.839234,Ashland,Ashland (Orange Line),41060,1,0,0,0,0,0,0,0,0,1
41
+ 30206,S,Ashland (Midway-bound),-87.665317,41.839234,Ashland,Ashland (Orange Line),41060,1,0,0,0,0,0,0,0,0,1
42
+ 30032,E,Ashland (Harlem-54th/Cermak-bound),-87.666969,41.885269,Ashland,Ashland (Green & Pink Lines),40170,1,0,0,0,1,0,0,0,1,0
43
+ 30033,W,Ashland (Loop-63rd-bound),-87.666969,41.885269,Ashland,Ashland (Green & Pink Lines),40170,1,0,0,0,1,0,0,0,1,0
44
+ 30056,E,Ashland/63rd (Harlem-bound),-87.663766,41.77886,Ashland/63rd,Ashland/63rd (Green Line),40290,1,0,0,0,1,0,0,0,0,0
45
+ 30057,W,Ashland/63rd (Terminal arrival),-87.663766,41.77886,Ashland/63rd,Ashland/63rd (Green Line),40290,1,0,0,0,1,0,0,0,0,0
46
+ 30002,W,Austin (Forest Pk-bound),-87.776812,41.870851,Austin,Austin (Blue Line),40010,0,0,1,0,0,0,0,0,0,0
47
+ 30001,E,Austin (O'Hare-bound),-87.776812,41.870851,Austin,Austin (Blue Line),40010,0,0,1,0,0,0,0,0,0,0
48
+ 30243,E,Austin (63rd-bound),-87.774135,41.887293,Austin,Austin (Green Line),41260,0,0,0,0,1,0,0,0,0,0
49
+ 30244,W,Austin (Harlem-bound),-87.774135,41.887293,Austin,Austin (Green Line),41260,0,0,0,0,1,0,0,0,0,0
50
+ 30013,S,Belmont (O'Hare Branch) (Forest Pk-bound),-87.712359,41.938132,Belmont,Belmont (Blue Line),40060,0,0,1,0,0,0,0,0,0,0
51
+ 30012,N,Belmont (O'Hare Branch) (O'Hare-bound),-87.712359,41.938132,Belmont,Belmont (Blue Line),40060,0,0,1,0,0,0,0,0,0,0
52
+ 30256,S,Belmont (95th-bound),-87.65338,41.939751,Belmont,"Belmont (Red, Brown & Purple Lines)",41320,1,1,0,0,0,0,0,0,0,0
53
+ 30255,N,Belmont (Howard-bound),-87.65338,41.939751,Belmont,"Belmont (Red, Brown & Purple Lines)",41320,1,1,0,0,0,0,0,0,0,0
54
+ 30257,N,Belmont (Kimball-Linden-bound),-87.65338,41.939751,Belmont,"Belmont (Red, Brown & Purple Lines)",41320,1,0,0,1,0,0,1,0,0,0
55
+ 30258,S,Belmont (Loop-bound),-87.65338,41.939751,Belmont,"Belmont (Red, Brown & Purple Lines)",41320,1,0,0,1,0,0,1,0,0,0
56
+ 30067,S,Berwyn (95th-bound),-87.658668,41.977984,Berwyn,Berwyn (Red Line),40340,0,1,0,0,0,0,0,0,0,0
57
+ 30066,N,Berwyn (Howard-bound),-87.658668,41.977984,Berwyn,Berwyn (Red Line),40340,0,1,0,0,0,0,0,0,0,0
58
+ 30268,S,Bryn Mawr (95th-bound),-87.65884,41.983504,Bryn Mawr,Bryn Mawr (Red Line),41380,0,1,0,0,0,0,0,0,0,0
59
+ 30267,N,Bryn Mawr (Howard-bound),-87.65884,41.983504,Bryn Mawr,Bryn Mawr (Red Line),41380,0,1,0,0,0,0,0,0,0,0
60
+ 30087,W,California (54th/Cermak-bound),-87.694774,41.854109,California,California (Pink Line),40440,1,0,0,0,0,0,0,0,1,0
61
+ 30086,E,California (Loop-bound),-87.694774,41.854109,California,California (Pink Line),40440,1,0,0,0,0,0,0,0,1,0
62
+ 30112,S,California/Milwaukee (Forest Pk-bound),-87.69689,41.921939,California,California (Blue Line),40570,0,0,1,0,0,0,0,0,0,0
63
+ 30265,E,California (63rd-bound),-87.696234,41.88422,California,California (Green Line),41360,1,0,0,0,1,0,0,0,0,0
64
+ 30266,W,California (Harlem-bound),-87.696234,41.88422,California,California (Green Line),41360,1,0,0,0,1,0,0,0,0,0
65
+ 30111,N,California/Milwaukee (O'Hare-bound),-87.69689,41.921939,California,California (Blue Line),40570,0,0,1,0,0,0,0,0,0,0
66
+ 30242,S,Central-Evanston (Howard-Loop-bound),-87.685617,42.063987,Central,Central (Purple Line),41250,0,0,0,0,0,1,1,0,0,0
67
+ 30241,N,Central-Evanston (Linden-bound),-87.685617,42.063987,Central,Central (Purple Line),41250,0,0,0,0,0,1,1,0,0,0
68
+ 30054,E,Central (63rd-bound),-87.76565,41.887389,Central,Central (Green Line),40280,1,0,0,0,1,0,0,0,0,0
69
+ 30055,W,Central (Harlem-bound),-87.76565,41.887389,Central,Central (Green Line),40280,1,0,0,0,1,0,0,0,0,0
70
+ 30152,W,Central Park (54th/Cermak-bound),-87.714842,41.853839,Central Park,Central Park (Pink Line),40780,1,0,0,0,0,0,0,0,1,0
71
+ 30151,E,Central Park (Loop-bound),-87.714842,41.853839,Central Park,Central Park (Pink Line),40780,1,0,0,0,0,0,0,0,1,0
72
+ 30194,S,Cermak-Chinatown (95th-bound),-87.630968,41.853206,Cermak-Chinatown,Cermak-Chinatown (Red Line),41000,1,1,0,0,0,0,0,0,0,0
73
+ 30193,N,Cermak-Chinatown (Howard-bound),-87.630968,41.853206,Cermak-Chinatown,Cermak-Chinatown (Red Line),41000,1,1,0,0,0,0,0,0,0,0
74
+ 30272,S,Chicago/Milwaukee (Forest Pk-bound),-87.655214,41.896075,Chicago,Chicago (Blue Line),41410,0,0,1,0,0,0,0,0,0,0
75
+ 30271,N,Chicago/Milwaukee (O'Hare-bound),-87.655214,41.896075,Chicago,Chicago (Blue Line),41410,0,0,1,0,0,0,0,0,0,0
76
+ 30137,N,Chicago/Franklin (Kimball-Linden-bound),-87.635924,41.89681,Chicago,Chicago (Brown & Purple Lines),40710,1,0,0,1,0,0,1,0,0,0
77
+ 30138,S,Chicago/Franklin (Loop-bound),-87.635924,41.89681,Chicago,Chicago (Brown & Purple Lines),40710,1,0,0,1,0,0,1,0,0,0
78
+ 30280,S,Chicago/State (95th-bound),-87.628176,41.896671,Chicago,Chicago (Red Line),41450,1,1,0,0,0,0,0,0,0,0
79
+ 30279,N,Chicago/State (Howard-bound),-87.628176,41.896671,Chicago,Chicago (Red Line),41450,1,1,0,0,0,0,0,0,0,0
80
+ 30083,W,Cicero (54th/Cermak-bound),-87.745336,41.85182,Cicero,Cicero (Pink Line),40420,1,0,0,0,0,0,0,0,1,0
81
+ 30082,E,Cicero (Loop-bound),-87.745336,41.85182,Cicero,Cicero (Pink Line),40420,1,0,0,0,0,0,0,0,1,0
82
+ 30188,W,Cicero (Forest Pk-bound),-87.745154,41.871574,Cicero,Cicero (Blue Line),40970,0,0,1,0,0,0,0,0,0,0
83
+ 30187,E,Cicero (O'Hare-bound),-87.745154,41.871574,Cicero,Cicero (Blue Line),40970,0,0,1,0,0,0,0,0,0,0
84
+ 30094,E,Cicero (63rd-bound),-87.744698,41.886519,Cicero,Cicero (Green Line),40480,1,0,0,0,1,0,0,0,0,0
85
+ 30009,W,Cicero (Harlem-bound),-87.744698,41.886519,Cicero,Cicero (Green Line),40480,1,0,0,0,1,0,0,0,0,0
86
+ 30122,S,Clark/Division (95th-bound),-87.631412,41.90392,Clark/Division,Clark/Division (Red Line),40630,0,1,0,0,0,0,0,0,0,0
87
+ 30121,N,Clark/Division (Howard-bound),-87.631412,41.90392,Clark/Division,Clark/Division (Red Line),40630,0,1,0,0,0,0,0,0,0,0
88
+ 30074,E,Clark/Lake (Inner Loop),-87.630886,41.885737,Clark/Lake,"Clark/Lake (Blue, Brown, Green, Orange, Purple & Pink Lines)",40380,1,0,0,0,1,0,1,0,1,1
89
+ 30075,W,Clark/Lake (Outer Loop),-87.630886,41.885737,Clark/Lake,"Clark/Lake (Blue, Brown, Green, Orange, Purple & Pink Lines)",40380,1,0,0,1,1,0,0,0,0,0
90
+ 30374,S,Clark/Lake (Forest Pk-bound),-87.630886,41.885737,Clark/Lake,"Clark/Lake (Blue, Brown, Green, Orange, Purple & Pink Lines)",40380,1,0,1,0,0,0,0,0,0,0
91
+ 30375,N,Clark/Lake (O'Hare-bound),-87.630886,41.885737,Clark/Lake,"Clark/Lake (Blue, Brown, Green, Orange, Purple & Pink Lines)",40380,1,0,1,0,0,0,0,0,0,0
92
+ 30085,W,Clinton (Forest Pk-bound),-87.640984,41.875539,Clinton,Clinton (Blue Line),40430,0,0,1,0,0,0,0,0,0,0
93
+ 30084,E,Clinton (O'Hare-bound),-87.640984,41.875539,Clinton,Clinton (Blue Line),40430,0,0,1,0,0,0,0,0,0,0
94
+ 30222,W,Clinton (Harlem-54th/Cermak-bound),-87.641782,41.885678,Clinton,Clinton (Green & Pink Lines),41160,1,0,0,0,1,0,0,0,1,0
95
+ 30221,E,Clinton (Loop-63rd-bound),-87.641782,41.885678,Clinton,Clinton (Green & Pink Lines),41160,1,0,0,0,1,0,0,0,1,0
96
+ 30291,E,Conservatory (63rd-bound),-87.716523,41.884904,Conservatory,Conservatory (Green Line),41670,1,0,0,0,1,0,0,0,0,0
97
+ 30292,W,Conservatory (Harlem-bound),-87.716523,41.884904,Conservatory,Conservatory (Green Line),41670,1,0,0,0,1,0,0,0,0,0
98
+ 30139,E,Cottage Grove (Terminal arrival),-87.605857,41.780309,Cottage Grove,Cottage Grove (Green Line),40720,1,0,0,0,1,0,0,0,0,0
99
+ 30140,W,East 63rd-Cottage Grove (Harlem-bound),-87.605857,41.780309,Cottage Grove,Cottage Grove (Green Line),40720,1,0,0,0,1,0,0,0,0,0
100
+ 30045,S,Cumberland (Forest Pk-bound),-87.838028,41.984246,Cumberland,Cumberland (Blue Line),40230,1,0,1,0,0,0,0,0,0,0
101
+ 30044,N,Cumberland (O'Hare-bound),-87.838028,41.984246,Cumberland,Cumberland (Blue Line),40230,1,0,1,0,0,0,0,0,0,0
102
+ 30041,W,Damen (54th/Cermak-bound),-87.675975,41.854517,Damen,Damen (Pink Line),40210,1,0,0,0,0,0,0,0,1,0
103
+ 30040,E,Damen (Loop-bound),-87.675975,41.854517,Damen,Damen (Pink Line),40210,1,0,0,0,0,0,0,0,1,0
104
+ 30116,S,Damen/Milwaukee (Forest Pk-bound),-87.677437,41.909744,Damen,Damen (Blue Line),40590,0,0,1,0,0,0,0,0,0,0
105
+ 30115,N,Damen/Milwaukee (O'Hare-bound),-87.677437,41.909744,Damen,Damen (Blue Line),40590,0,0,1,0,0,0,0,0,0,0
106
+ 30018,N,Damen (Kimball-bound),-87.678639,41.966286,Damen,Damen (Brown Line),40090,1,0,0,1,0,0,0,0,0,0
107
+ 30019,S,Damen (Loop-bound),-87.678639,41.966286,Damen,Damen (Brown Line),40090,1,0,0,1,0,0,0,0,0,0
108
+ 30011,S,Davis (Howard-Loop-bound),-87.683543,42.04771,Davis,Davis (Purple Line),40050,1,0,0,0,0,1,1,0,0,0
109
+ 30010,N,Davis (Linden-bound),-87.683543,42.04771,Davis,Davis (Purple Line),40050,1,0,0,0,0,1,1,0,0,0
110
+ 30134,S,Dempster (Howard-Loop-bound),-87.681602,42.041655,Dempster,Dempster (Purple Line),40690,0,0,0,0,0,1,1,0,0,0
111
+ 30133,N,Dempster (Linden-bound),-87.681602,42.041655,Dempster,Dempster (Purple Line),40690,0,0,0,0,0,1,1,0,0,0
112
+ 30103,N,Diversey (Kimball-Linden-bound),-87.653131,41.932732,Diversey,Diversey (Brown & Purple Lines),40530,1,0,0,1,0,0,1,0,0,0
113
+ 30104,S,Diversey (Loop-bound),-87.653131,41.932732,Diversey,Diversey (Brown & Purple Lines),40530,1,0,0,1,0,0,1,0,0,0
114
+ 30063,S,Division/Milwaukee (Forest Pk-bound),-87.666496,41.903355,Division,Division (Blue Line),40320,0,0,1,0,0,0,0,0,0,0
115
+ 30062,N,Division/Milwaukee (O'Hare-bound),-87.666496,41.903355,Division,Division (Blue Line),40320,0,0,1,0,0,0,0,0,0,0
116
+ 30076,E,Forest Park (O'Hare-bound),-87.817318,41.874257,Forest Park,Forest Park (Blue Line),40390,1,0,1,0,0,0,0,0,0,0
117
+ 30077,W,Forest Park (Terminal Arrival),-87.817318,41.874257,Forest Park,Forest Park (Blue Line),40390,1,0,1,0,0,0,0,0,0,0
118
+ 30102,S,Foster (Howard-Loop-bound),-87.68356,42.05416,Foster,Foster (Purple Line),40520,0,0,0,0,0,1,1,0,0,0
119
+ 30101,N,Foster (Linden-bound),-87.68356,42.05416,Foster,Foster (Purple Line),40520,0,0,0,0,0,1,1,0,0,0
120
+ 30167,N,Francisco (Kimball-bound),-87.701644,41.966046,Francisco,Francisco (Brown Line),40870,1,0,0,1,0,0,0,0,0,0
121
+ 30168,S,Francisco (Loop-bound),-87.701644,41.966046,Francisco,Francisco (Brown Line),40870,1,0,0,1,0,0,0,0,0,0
122
+ 30234,S,Fullerton (95th-bound),-87.652866,41.925051,Fullerton,"Fullerton (Red, Brown & Purple Lines)",41220,1,1,0,0,0,0,0,0,0,0
123
+ 30233,N,Fullerton (Howard-bound),-87.652866,41.925051,Fullerton,"Fullerton (Red, Brown & Purple Lines)",41220,1,1,0,0,0,0,0,0,0,0
124
+ 30235,N,Fullerton (Kimball-Linden-bound),-87.652866,41.925051,Fullerton,"Fullerton (Red, Brown & Purple Lines)",41220,1,0,0,1,0,0,1,0,0,0
125
+ 30236,S,Fullerton (Loop-bound),-87.652866,41.925051,Fullerton,"Fullerton (Red, Brown & Purple Lines)",41220,1,0,0,1,0,0,1,0,0,0
126
+ 30100,S,Garfield (63rd-bound),-87.618327,41.795172,Garfield,Garfield (Green Line),40510,1,0,0,0,1,0,0,0,0,0
127
+ 30099,N,Garfield (Harlem-bound),-87.618327,41.795172,Garfield,Garfield (Green Line),40510,1,0,0,0,1,0,0,0,0,0
128
+ 30224,S,Garfield-Dan Ryan (95th-bound),-87.631157,41.79542,Garfield,Garfield (Red Line),41170,0,1,0,0,0,0,0,0,0,0
129
+ 30223,N,Garfield-Dan Ryan (Howard-bound),-87.631157,41.79542,Garfield,Garfield (Red Line),41170,0,1,0,0,0,0,0,0,0,0
130
+ 30096,S,Grand/Milwaukee (Forest Pk-bound),-87.647578,41.891189,Grand,Grand (Blue Line),40490,0,0,1,0,0,0,0,0,0,0
131
+ 30095,N,Grand/Milwaukee (O'Hare-bound),-87.647578,41.891189,Grand,Grand (Blue Line),40490,0,0,1,0,0,0,0,0,0,0
132
+ 30065,S,Grand/State (95th-bound),-87.628021,41.891665,Grand,Grand (Red Line),40330,1,1,0,0,0,0,0,0,0,0
133
+ 30064,N,Grand/State (Howard-bound),-87.628021,41.891665,Grand,Grand (Red Line),40330,1,1,0,0,0,0,0,0,0,0
134
+ 30148,S,Granville (95th-bound),-87.659202,41.993664,Granville,Granville (Red Line),40760,1,1,0,0,0,0,0,0,0,0
135
+ 30147,N,Granville (Howard-bound),-87.659202,41.993664,Granville,Granville (Red Line),40760,1,1,0,0,0,0,0,0,0,0
136
+ 30215,N,Halsted (Loop-bound),-87.648088,41.84678,Halsted,Halsted (Orange Line),41130,1,0,0,0,0,0,0,0,0,1
137
+ 30216,S,Halsted (Midway-bound),-87.648088,41.84678,Halsted,Halsted (Orange Line),41130,1,0,0,0,0,0,0,0,0,1
138
+ 30184,W,Halsted/63rd (Ashland-bound),-87.644244,41.778943,Halsted,Halsted (Green Line),40940,1,0,0,0,1,0,0,0,0,0
139
+ 30183,E,Halsted/63rd (Harlem-bound),-87.644244,41.778943,Halsted,Halsted (Green Line),40940,1,0,0,0,1,0,0,0,0,0
140
+ 30190,W,Harlem (Forest Pk-bound),-87.806961,41.87349,Harlem,Harlem (Blue Line - Forest Park Branch),40980,0,0,1,0,0,0,0,0,0,0
141
+ 30189,E,Harlem (O'Hare-bound),-87.806961,41.87349,Harlem,Harlem (Blue Line - Forest Park Branch),40980,0,0,1,0,0,0,0,0,0,0
142
+ 30146,S,Harlem (O'Hare Branch) (Forest Pk-bound),-87.8089,41.98227,Harlem,Harlem (Blue Line - O'Hare Branch),40750,1,0,1,0,0,0,0,0,0,0
143
+ 30145,N,Harlem (O'Hare Branch) (O'Hare-bound),-87.8089,41.98227,Harlem,Harlem (Blue Line - O'Hare Branch),40750,1,0,1,0,0,0,0,0,0,0
144
+ 30004,W,Harlem (Terminal arrival),-87.803176,41.886848,Harlem/Lake,Harlem/Lake (Green Line),40020,1,0,0,0,1,0,0,0,0,0
145
+ 30003,E,Harlem (63rd-bound),-87.803176,41.886848,Harlem/Lake,Harlem/Lake (Green Line),40020,1,0,0,0,1,0,0,0,0,0
146
+ 30166,W,Library (Inner Loop),-87.628196,41.876862,Harold Washington Library-State/Van Buren,"Harold Washington Library-State/Van Buren (Brown, Orange, Purple & Pink Lines)",40850,1,0,0,0,0,0,1,0,1,1
147
+ 30165,E,Library (Outer Loop),-87.628196,41.876862,Harold Washington Library-State/Van Buren,"Harold Washington Library-State/Van Buren (Brown, Orange, Purple & Pink Lines)",40850,1,0,0,1,0,0,0,0,0,0
148
+ 30286,S,Harrison (95th-bound),-87.627479,41.874039,Harrison,Harrison (Red Line),41490,0,1,0,0,0,0,0,0,0,0
149
+ 30285,N,Harrison (Howard-bound),-87.627479,41.874039,Harrison,Harrison (Red Line),41490,0,1,0,0,0,0,0,0,0,0
150
+ 30175,N,"Howard (NB) (Linden, Skokie-bound)",-87.672892,42.019063,Howard,"Howard (Red, Purple & Yellow Lines)",40900,1,0,0,0,0,1,1,1,0,0
151
+ 30176,S,Howard (Terminal arrival),-87.672892,42.019063,Howard,"Howard (Red, Purple & Yellow Lines)",40900,1,0,0,0,0,1,1,1,0,0
152
+ 30173,N,Howard (Terminal arrival),-87.672892,42.019063,Howard,"Howard (Red, Purple & Yellow Lines)",40900,1,1,0,0,0,0,0,0,0,0
153
+ 30174,S,Howard (95th-Bound),-87.672892,42.019063,Howard,"Howard (Red, Purple & Yellow Lines)",40900,1,1,0,0,0,0,0,0,0,0
154
+ 30158,W,Illinois Medical District (Forest Pk-bound),-87.673932,41.875706,Illinois Medical District,Illinois Medical District (Blue Line),40810,1,0,1,0,0,0,0,0,0,0
155
+ 30157,E,Illinois Medical District (O'Hare-bound),-87.673932,41.875706,Illinois Medical District,Illinois Medical District (Blue Line),40810,1,0,1,0,0,0,0,0,0,0
156
+ 30059,S,Indiana (63rd-bound),-87.621371,41.821732,Indiana,Indiana (Green Line),40300,1,0,0,0,1,0,0,0,0,0
157
+ 30058,N,Indiana (Harlem-bound),-87.621371,41.821732,Indiana,Indiana (Green Line),40300,1,0,0,0,1,0,0,0,0,0
158
+ 30108,S,Irving Park (O'Hare Branch) (Forest Pk-bound),-87.729229,41.952925,Irving Park,Irving Park (Blue Line),40550,0,0,1,0,0,0,0,0,0,0
159
+ 30107,N,Irving Park (O'Hare Branch) (O'Hare-bound),-87.729229,41.952925,Irving Park,Irving Park (Blue Line),40550,0,0,1,0,0,0,0,0,0,0
160
+ 30281,N,Irving Park (Kimball-bound),-87.674868,41.954521,Irving Park,Irving Park (Brown Line),41460,1,0,0,1,0,0,0,0,0,0
161
+ 30282,S,Irving Park (Loop-bound),-87.674868,41.954521,Irving Park,Irving Park (Brown Line),41460,1,0,0,1,0,0,0,0,0,0
162
+ 30015,S,Jackson/Dearborn (Forest Pk-bound),-87.629296,41.878183,Jackson,Jackson (Blue Line),40070,1,0,1,0,0,0,0,0,0,0
163
+ 30014,N,Jackson/Dearborn (O'Hare-bound),-87.629296,41.878183,Jackson,Jackson (Blue Line),40070,1,0,1,0,0,0,0,0,0,0
164
+ 30110,S,Jackson/State (95th-bound),-87.627596,41.878153,Jackson,Jackson (Red Line),40560,1,1,0,0,0,0,0,0,0,0
165
+ 30109,N,Jackson/State (Howard-bound),-87.627596,41.878153,Jackson,Jackson (Red Line),40560,1,1,0,0,0,0,0,0,0,0
166
+ 30228,S,Jarvis (95th-bound),-87.669092,42.015876,Jarvis,Jarvis (Red Line),41190,0,1,0,0,0,0,0,0,0,0
167
+ 30227,N,Jarvis (Howard-bound),-87.669092,42.015876,Jarvis,Jarvis (Red Line),41190,0,1,0,0,0,0,0,0,0,0
168
+ 30248,S,Jefferson Park (Forest Pk-bound),-87.760892,41.970634,Jefferson Park,Jefferson Park (Blue Line),41280,1,0,1,0,0,0,0,0,0,0
169
+ 30247,N,Jefferson Park (O'Hare-bound),-87.760892,41.970634,Jefferson Park,Jefferson Park (Blue Line),41280,1,0,1,0,0,0,0,0,0,0
170
+ 30219,N,Kedzie (Loop-bound),-87.704406,41.804236,Kedzie,Kedzie (Orange Line),41150,1,0,0,0,0,0,0,0,0,1
171
+ 30220,S,Kedzie (Midway-bound),-87.704406,41.804236,Kedzie,Kedzie (Orange Line),41150,1,0,0,0,0,0,0,0,0,1
172
+ 30202,W,Kedzie (54th/Cermak-bound),-87.705408,41.853964,Kedzie,Kedzie (Pink Line),41040,1,0,0,0,0,0,0,0,1,0
173
+ 30201,E,Kedzie (Loop-bound),-87.705408,41.853964,Kedzie,Kedzie (Pink Line),41040,1,0,0,0,0,0,0,0,1,0
174
+ 30225,N,Kedzie (Kimball-bound),-87.708821,41.965996,Kedzie,Kedzie (Brown Line),41180,1,0,0,1,0,0,0,0,0,0
175
+ 30226,S,Kedzie (Loop-bound),-87.708821,41.965996,Kedzie,Kedzie (Brown Line),41180,1,0,0,1,0,0,0,0,0,0
176
+ 30207,E,Kedzie (63rd-bound),-87.706155,41.884321,Kedzie,Kedzie (Green Line),41070,1,0,0,0,1,0,0,0,0,0
177
+ 30208,W,Kedzie (Harlem-bound),-87.706155,41.884321,Kedzie,Kedzie (Green Line),41070,1,0,0,0,1,0,0,0,0,0
178
+ 30049,W,Kedzie-Homan (Forest Pk-bound),-87.70604,41.874341,Kedzie-Homan,Kedzie-Homan (Blue Line),40250,1,0,1,0,0,0,0,0,0,0
179
+ 30048,E,Kedzie-Homan (O'Hare-bound),-87.70604,41.874341,Kedzie-Homan,Kedzie-Homan (Blue Line),40250,1,0,1,0,0,0,0,0,0,0
180
+ 30250,S,Kimball (Loop-bound),-87.713065,41.967901,Kimball,Kimball (Brown Line),41290,1,0,0,1,0,0,0,0,0,0
181
+ 30249,N,Kimball (Terminal arrival),-87.713065,41.967901,Kimball,Kimball (Brown Line),41290,1,0,0,1,0,0,0,0,0,0
182
+ 30217,E,King Drive (Cottage Grove-bound),-87.615546,41.78013,King Drive,King Drive (Green Line),41140,1,0,0,0,1,0,0,0,0,0
183
+ 30218,W,King Drive (Harlem-bound),-87.615546,41.78013,King Drive,King Drive (Green Line),41140,1,0,0,0,1,0,0,0,0,0
184
+ 30118,W,Kostner (54th/Cermak-bound),-87.733258,41.853751,Kostner,Kostner (Pink Line),40600,1,0,0,0,0,0,0,0,1,0
185
+ 30117,E,Kostner (Loop-bound),-87.733258,41.853751,Kostner,Kostner (Pink Line),40600,1,0,0,0,0,0,0,0,1,0
186
+ 30290,S,Lake/State (95th-bound),-87.627813,41.884809,Lake,Lake (Red Line),41660,1,1,0,0,0,0,0,0,0,0
187
+ 30289,N,Lake/State (Howard-bound),-87.627813,41.884809,Lake,Lake (Red Line),41660,1,1,0,0,0,0,0,0,0,0
188
+ 30135,E,Laramie (63rd-bound),-87.754986,41.887163,Laramie,Laramie (Green Line),40700,1,0,0,0,1,0,0,0,0,0
189
+ 30136,W,Laramie (Harlem-bound),-87.754986,41.887163,Laramie,Laramie (Green Line),40700,1,0,0,0,1,0,0,0,0,0
190
+ 30262,W,LaSalle (Forest Pk-bound),-87.631722,41.875568,LaSalle,LaSalle (Blue Line),41340,0,0,1,0,0,0,0,0,0,0
191
+ 30261,E,LaSalle (O'Hare-bound),-87.631722,41.875568,LaSalle,LaSalle (Blue Line),41340,0,0,1,0,0,0,0,0,0,0
192
+ 30031,W,LaSalle/Van Buren (Inner Loop),-87.631739,41.8768,LaSalle/Van Buren,"LaSalle/Van Buren (Brown, Orange, Purple & Pink Lines)",40160,0,0,0,0,0,0,1,0,1,1
193
+ 30030,E,LaSalle/Van Buren (Outer Loop),-87.631739,41.8768,LaSalle/Van Buren,"LaSalle/Van Buren (Brown, Orange, Purple & Pink Lines)",40160,0,0,0,1,0,0,0,0,0,0
194
+ 30150,S,Lawrence (95th-bound),-87.658493,41.969139,Lawrence,Lawrence (Red Line),40770,0,1,0,0,0,0,0,0,0,0
195
+ 30149,N,Lawrence (Howard-bound),-87.658493,41.969139,Lawrence,Lawrence (Red Line),40770,0,1,0,0,0,0,0,0,0,0
196
+ 30204,S,Linden (Howard-Loop-bound),-87.69073,42.073153,Linden,Linden (Purple Line),41050,1,0,0,0,0,1,1,0,0,0
197
+ 30203,N,Linden (Linden-bound),-87.69073,42.073153,Linden,Linden (Purple Line),41050,1,0,0,0,0,1,1,0,0,0
198
+ 30198,S,Logan Square (Forest Pk-bound),-87.708541,41.929728,Logan Square,Logan Square (Blue Line),41020,1,0,1,0,0,0,0,0,0,0
199
+ 30197,N,Logan Square (O'Hare-bound),-87.708541,41.929728,Logan Square,Logan Square (Blue Line),41020,1,0,1,0,0,0,0,0,0,0
200
+ 30252,S,Loyola (95th-bound),-87.661061,42.001073,Loyola,Loyola (Red Line),41300,1,1,0,0,0,0,0,0,0,0
201
+ 30251,N,Loyola (Howard-bound),-87.661061,42.001073,Loyola,Loyola (Red Line),41300,1,1,0,0,0,0,0,0,0,0
202
+ 30124,S,Madison/Wabash (Inner Loop),-87.626098,41.882023,Madison/Wabash,"Madison/Wabash (Brown, Green, Orange, Pink & Purple Lines)",40640,0,0,0,0,1,0,1,0,1,1
203
+ 30123,N,Madison/Wabash (Outer Loop),-87.626098,41.882023,Madison/Wabash,"Madison/Wabash (Brown, Green, Orange, Pink & Purple Lines)",40640,0,0,0,1,1,0,0,0,0,0
204
+ 30053,S,Main (Howard-Loop-bound),-87.679538,42.033456,Main,Main (Purple Line),40270,0,0,0,0,0,1,1,0,0,0
205
+ 30052,N,Main (Linden-bound),-87.679538,42.033456,Main,Main (Purple Line),40270,0,0,0,0,0,1,1,0,0,0
206
+ 30090,N,Merchandise Mart (Kimball-Linden-bound),-87.633924,41.888969,Merchandise Mart,Merchandise Mart (Brown & Purple Lines),40460,1,0,0,1,0,0,1,0,0,0
207
+ 30091,S,Merchandise Mart (Loop-bound),-87.633924,41.888969,Merchandise Mart,Merchandise Mart (Brown & Purple Lines),40460,1,0,0,1,0,0,1,0,0,0
208
+ 30182,S,Midway (Arrival),-87.737875,41.78661,Midway,Midway (Orange Line),40930,1,0,0,0,0,0,0,0,0,1
209
+ 30181,N,Midway (Loop-bound),-87.737875,41.78661,Midway,Midway (Orange Line),40930,1,0,0,0,0,0,0,0,0,1
210
+ 30154,S,Monroe/Dearborn (Forest Pk-bound),-87.629378,41.880703,Monroe,Monroe (Blue Line),40790,0,0,1,0,0,0,0,0,0,0
211
+ 30153,N,Monroe/Dearborn (O'Hare-bound),-87.629378,41.880703,Monroe,Monroe (Blue Line),40790,0,0,1,0,0,0,0,0,0,0
212
+ 30212,S,Monroe/State (95th-bound),-87.627696,41.880745,Monroe,Monroe (Red Line),41090,0,1,0,0,0,0,0,0,0,0
213
+ 30211,N,Monroe/State (Howard-bound),-87.627696,41.880745,Monroe,Monroe (Red Line),41090,0,1,0,0,0,0,0,0,0,0
214
+ 30260,S,Montrose (Forest Pk-bound),-87.743574,41.961539,Montrose,Montrose (Blue Line),41330,0,0,1,0,0,0,0,0,0,0
215
+ 30259,N,Montrose (O'Hare-bound),-87.743574,41.961539,Montrose,Montrose (Blue Line),41330,0,0,1,0,0,0,0,0,0,0
216
+ 30287,N,Montrose (Kimball-bound),-87.675047,41.961756,Montrose,Montrose (Brown Line),41500,1,0,0,1,0,0,0,0,0,0
217
+ 30288,S,Montrose (Loop-bound),-87.675047,41.961756,Montrose,Montrose (Brown Line),41500,1,0,0,1,0,0,0,0,0,0
218
+ 30296,W,Morgan (Harlem-54th/Cermak-bound),-87.652193,41.885586,Morgan,Morgan (Green & Pink Lines),41510,1,0,0,0,1,0,0,0,1,0
219
+ 30295,E,Morgan (Loop-63rd-bound),-87.652193,41.885586,Morgan,Morgan (Green & Pink Lines),41510,1,0,0,0,1,0,0,0,1,0
220
+ 30021,S,Morse (95th-bound),-87.665909,42.008362,Morse,Morse (Red Line),40100,0,1,0,0,0,0,0,0,0,0
221
+ 30020,N,Morse (Howard-bound),-87.665909,42.008362,Morse,Morse (Red Line),40100,0,1,0,0,0,0,0,0,0,0
222
+ 30126,S,North/Clybourn (95th-bound),-87.649177,41.910655,North/Clybourn,North/Clybourn (Red Line),40650,0,1,0,0,0,0,0,0,0,0
223
+ 30125,N,North/Clybourn (Howard-bound),-87.649177,41.910655,North/Clybourn,North/Clybourn (Red Line),40650,0,1,0,0,0,0,0,0,0,0
224
+ 30079,S,Noyes (Howard-Loop-bound),-87.683337,42.058282,Noyes,Noyes (Purple Line),40400,0,0,0,0,0,1,1,0,0,0
225
+ 30078,N,Noyes (Linden-bound),-87.683337,42.058282,Noyes,Noyes (Purple Line),40400,0,0,0,0,0,1,1,0,0,0
226
+ 30035,W,Oak Park (Forest Pk-bound),-87.791602,41.872108,Oak Park,Oak Park (Blue Line),40180,0,0,1,0,0,0,0,0,0,0
227
+ 30034,E,Oak Park (O'Hare-bound),-87.791602,41.872108,Oak Park,Oak Park (Blue Line),40180,0,0,1,0,0,0,0,0,0,0
228
+ 30263,E,Oak Park (63rd-bound),-87.793783,41.886988,Oak Park,Oak Park (Green Line),41350,0,0,0,0,1,0,0,0,0,0
229
+ 30264,W,Oak Park (Harlem-bound),-87.793783,41.886988,Oak Park,Oak Park (Green Line),41350,0,0,0,0,1,0,0,0,0,0
230
+ 30297,N,Oakton (Dempster-Skokie-bound),-87.74722084,42.02624348,Oakton-Skokie,Oakton-Skokie (Yellow Line),41680,1,0,0,0,0,0,0,1,0,0
231
+ 30298,S,Oakton (Howard-bound),-87.74722084,42.02624348,Oakton-Skokie,Oakton-Skokie (Yellow Line),41680,1,0,0,0,0,0,0,1,0,0
232
+ 30172,S,O'Hare Airport (Forest Pk-bound),-87.90422307,41.97766526,O'Hare,O'Hare (Blue Line),40890,1,0,1,0,0,0,0,0,0,0
233
+ 30171,N,O'Hare Airport (Terminal Arrival),-87.90422307,41.97766526,O'Hare,O'Hare (Blue Line),40890,1,0,1,0,0,0,0,0,0,0
234
+ 30253,N,Paulina (Kimball-bound),-87.670907,41.943623,Paulina,Paulina (Brown Line),41310,1,0,0,1,0,0,0,0,0,0
235
+ 30254,S,Paulina (Loop-bound),-87.670907,41.943623,Paulina,Paulina (Brown Line),41310,1,0,0,1,0,0,0,0,0,0
236
+ 30200,W,Polk (54th/Cermak-bound),-87.66953,41.871551,Polk,Polk (Pink Line),41030,1,0,0,0,0,0,0,0,1,0
237
+ 30199,E,Polk (Loop-bound),-87.66953,41.871551,Polk,Polk (Pink Line),41030,1,0,0,0,0,0,0,0,1,0
238
+ 30185,N,Pulaski (Loop-bound),-87.724493,41.799756,Pulaski,Pulaski (Orange Line),40960,1,0,0,0,0,0,0,0,0,1
239
+ 30186,S,Pulaski (Midway-bound),-87.724493,41.799756,Pulaski,Pulaski (Orange Line),40960,1,0,0,0,0,0,0,0,0,1
240
+ 30029,W,Pulaski (54th/Cermak-bound),-87.724311,41.853732,Pulaski,Pulaski (Pink Line),40150,1,0,0,0,0,0,0,0,1,0
241
+ 30028,E,Pulaski (Loop-bound),-87.724311,41.853732,Pulaski,Pulaski (Pink Line),40150,1,0,0,0,0,0,0,0,1,0
242
+ 30180,W,Pulaski (Forest Pk-bound),-87.725663,41.873797,Pulaski,Pulaski (Blue Line),40920,0,0,1,0,0,0,0,0,0,0
243
+ 30179,E,Pulaski (O'Hare-bound),-87.725663,41.873797,Pulaski,Pulaski (Blue Line),40920,0,0,1,0,0,0,0,0,0,0
244
+ 30005,E,Pulaski (63rd-bound),-87.725404,41.885412,Pulaski,Pulaski (Green Line),40030,1,0,0,0,1,0,0,0,0,0
245
+ 30006,W,Pulaski (Harlem-bound),-87.725404,41.885412,Pulaski,Pulaski (Green Line),40030,1,0,0,0,1,0,0,0,0,0
246
+ 30007,N,Quincy/Wells (Inner Loop),-87.63374,41.878723,Quincy/Wells,"Quincy/Wells (Brown, Orange, Purple & Pink Lines)",40040,0,0,0,0,0,0,1,0,1,1
247
+ 30008,S,Quincy/Wells (Outer Loop),-87.63374,41.878723,Quincy/Wells,"Quincy/Wells (Brown, Orange, Purple & Pink Lines)",40040,0,0,0,1,0,0,0,0,0,0
248
+ 30093,W,Racine (Forest Pk-bound),-87.659458,41.87592,Racine,Racine (Blue Line),40470,0,0,1,0,0,0,0,0,0,0
249
+ 30092,E,Racine (O'Hare-bound),-87.659458,41.87592,Racine,Racine (Blue Line),40470,0,0,1,0,0,0,0,0,0,0
250
+ 30039,S,Randolph/Wabash (Inner Loop),-87.626149,41.884431,Randolph/Wabash,"Randolph/Wabash (Brown, Green, Orange, Pink & Purple Lines)",40200,0,0,0,0,1,0,1,0,1,1
251
+ 30038,N,Randolph/Wabash (Outer Loop),-87.626149,41.884431,Randolph/Wabash,"Randolph/Wabash (Brown, Green, Orange, Pink & Purple Lines)",40200,0,0,0,1,1,0,0,0,0,0
252
+ 30119,E,Ridgeland (63rd-bound),-87.783661,41.887159,Ridgeland,Ridgeland (Green Line),40610,0,0,0,0,1,0,0,0,0,0
253
+ 30120,W,Ridgeland (Harlem-bound),-87.783661,41.887159,Ridgeland,Ridgeland (Green Line),40610,0,0,0,0,1,0,0,0,0,0
254
+ 30195,N,Rockwell (Kimball-bound),-87.6941,41.966115,Rockwell,Rockwell (Brown Line),41010,1,0,0,1,0,0,0,0,0,0
255
+ 30196,S,Rockwell (Loop-bound),-87.6941,41.966115,Rockwell,Rockwell (Brown Line),41010,1,0,0,1,0,0,0,0,0,0
256
+ 30080,N,Roosevelt/Wabash (Loop-Harlem-bound),-87.62659,41.867405,Roosevelt,"Roosevelt (Red, Orange & Green Lines)",41400,1,0,0,0,1,0,0,0,0,1
257
+ 30081,S,Roosevelt/Wabash (Midway-63rd-bound),-87.62659,41.867405,Roosevelt,"Roosevelt (Red, Orange & Green Lines)",41400,1,0,0,0,1,0,0,0,0,1
258
+ 30269,N,Roosevelt/State (Howard-bound),-87.627402,41.867368,Roosevelt,"Roosevelt (Red, Orange & Green Lines)",41400,1,1,0,0,0,0,0,0,0,0
259
+ 30270,S,Roosevelt/State (Howard-bound),-87.627402,41.867368,Roosevelt,"Roosevelt (Red, Orange & Green Lines)",41400,1,1,0,0,0,0,0,0,0,0
260
+ 30160,S,Rosemont (Forest Pk-bound),-87.859388,41.983507,Rosemont,Rosemont (Blue Line),40820,1,0,1,0,0,0,0,0,0,0
261
+ 30159,N,Rosemont (O'Hare-bound),-87.859388,41.983507,Rosemont,Rosemont (Blue Line),40820,1,0,1,0,0,0,0,0,0,0
262
+ 30155,N,Sedgwick (Kimball-Linden-bound),-87.639302,41.910409,Sedgwick,Sedgwick (Brown & Purple Lines),40800,1,0,0,1,0,0,1,0,0,0
263
+ 30156,S,Sedgwick (Loop-bound),-87.639302,41.910409,Sedgwick,Sedgwick (Brown & Purple Lines),40800,1,0,0,1,0,0,1,0,0,0
264
+ 30017,S,Sheridan (95th-bound),-87.654929,41.953775,Sheridan,Sheridan (Red Line),40080,0,1,0,0,0,0,0,0,0,0
265
+ 30016,N,Sheridan (Howard-bound),-87.654929,41.953775,Sheridan,Sheridan (Red Line),40080,0,1,0,0,0,0,0,0,0,0
266
+ 30293,N,Sheridan (Howard-Linden-bound),-87.654929,41.953775,Sheridan,Sheridan (Red Line),40080,0,0,0,0,0,0,0,0,0,0
267
+ 30294,S,Sheridan (Loop-bound),-87.654929,41.953775,Sheridan,Sheridan (Red Line),40080,0,0,0,0,0,0,0,0,0,0
268
+ 30026,N,Skokie (Arrival),-87.751919,42.038951,Skokie,Dempster-Skokie (Yellow Line),40140,1,0,0,0,0,0,0,1,0,0
269
+ 30027,S,Skokie (Howard-bound),-87.751919,42.038951,Skokie,Dempster-Skokie (Yellow Line),40140,1,0,0,0,0,0,0,1,0,0
270
+ 30164,S,South Blvd (Howard-Loop-bound),-87.678329,42.027612,South Boulevard,South Boulevard (Purple Line),40840,0,0,0,0,0,1,1,0,0,0
271
+ 30163,N,South Blvd (Linden-bound),-87.678329,42.027612,South Boulevard,South Boulevard (Purple Line),40840,0,0,0,0,0,1,1,0,0,0
272
+ 30070,N,Southport (Kimball-bound),-87.663619,41.943744,Southport,Southport (Brown Line),40360,1,0,0,1,0,0,0,0,0,0
273
+ 30071,S,Southport (Loop-bound),-87.663619,41.943744,Southport,Southport (Brown Line),40360,1,0,0,1,0,0,0,0,0,0
274
+ 30037,S,Sox-35th (95th-bound),-87.630636,41.831191,Sox-35th,Sox-35th (Red Line),40190,1,1,0,0,0,0,0,0,0,0
275
+ 30036,N,Sox-35th (Howard-bound),-87.630636,41.831191,Sox-35th,Sox-35th (Red Line),40190,1,1,0,0,0,0,0,0,0,0
276
+ 30050,E,State/Lake (Inner Loop),-87.627835,41.88574,State/Lake,"State/Lake (Brown, Green, Orange, Pink & Purple Lines)",40260,0,0,0,0,1,0,1,0,1,1
277
+ 30051,W,State/Lake (Outer Loop),-87.627835,41.88574,State/Lake,"State/Lake (Brown, Green, Orange, Pink & Purple Lines)",40260,0,0,0,1,1,0,0,0,0,0
278
+ 30170,S,Thorndale (95th-bound),-87.659076,41.990259,Thorndale,Thorndale (Red Line),40880,0,1,0,0,0,0,0,0,0,0
279
+ 30169,N,Thorndale (Howard-bound),-87.659076,41.990259,Thorndale,Thorndale (Red Line),40880,0,1,0,0,0,0,0,0,0,0
280
+ 30069,W,UIC-Halsted (Forest Pk-bound),-87.649707,41.875474,UIC-Halsted,UIC-Halsted (Blue Line),40350,1,0,1,0,0,0,0,0,0,0
281
+ 30068,E,UIC-Halsted (O'Hare-bound),-87.649707,41.875474,UIC-Halsted,UIC-Halsted (Blue Line),40350,1,0,1,0,0,0,0,0,0,0
282
+ 30073,S,Washington/Dearborn (Forest Pk-bound),-87.62944,41.883164,Washington,Washington (Blue Line),40370,0,0,1,0,0,0,0,0,0,0
283
+ 30072,N,Washington/Dearborn (O'Hare-bound),-87.62944,41.883164,Washington,Washington (Blue Line),40370,0,0,1,0,0,0,0,0,0,0
284
+ 30141,N,Washington/Wells (Inner Loop),-87.63378,41.882695,Washington/Wells,"Washington/Wells (Brown, Orange, Purple & Pink Lines)",40730,1,0,0,0,0,0,1,0,1,1
285
+ 30142,S,Washington/Wells (Outer Loop),-87.63378,41.882695,Washington/Wells,"Washington/Wells (Brown, Orange, Purple & Pink Lines)",40730,1,0,0,1,0,0,0,0,0,0
286
+ 30231,N,Wellington (Kimball-Linden-bound),-87.653266,41.936033,Wellington,Wellington (Brown & Purple Lines),41210,1,0,0,1,0,0,1,0,0,0
287
+ 30232,S,Wellington (Loop-bound),-87.653266,41.936033,Wellington,Wellington (Brown & Purple Lines),41210,1,0,0,1,0,0,1,0,0,0
288
+ 30060,N,Western (Loop-bound),-87.684019,41.804546,Western,Western (Orange Line),40310,1,0,0,0,0,0,0,0,0,1
289
+ 30061,S,Western (Midway-bound),-87.684019,41.804546,Western,Western (Orange Line),40310,1,0,0,0,0,0,0,0,0,1
290
+ 30144,W,Western (54th/Cermak-bound),-87.685129,41.854225,Western,Western (Pink Line),40740,1,0,0,0,0,0,0,0,1,0
291
+ 30143,E,Western (Loop-bound),-87.685129,41.854225,Western,Western (Pink Line),40740,1,0,0,0,0,0,0,0,1,0
292
+ 30043,W,Western (Forest Pk-bound),-87.688436,41.875478,Western,Western (Blue Line - Forest Park Branch),40220,0,0,1,0,0,0,0,0,0,0
293
+ 30042,E,Western (O'Hare-bound),-87.688436,41.875478,Western,Western (Blue Line - Forest Park Branch),40220,0,0,1,0,0,0,0,0,0,0
294
+ 30130,S,Western/Milwaukee (Forest Pk-bound),-87.687364,41.916157,Western,Western (Blue Line - O'Hare Branch),40670,1,0,1,0,0,0,0,0,0,0
295
+ 30129,N,Western/Milwaukee (O'Hare-bound),-87.687364,41.916157,Western,Western (Blue Line - O'Hare Branch),40670,1,0,1,0,0,0,0,0,0,0
296
+ 30283,N,Western (Kimball-bound),-87.688502,41.966163,Western,Western (Brown Line),41480,1,0,0,1,0,0,0,0,0,0
297
+ 30284,S,Western (Loop-bound),-87.688502,41.966163,Western,Western (Brown Line),41480,1,0,0,1,0,0,0,0,0,0
298
+ 30106,S,Wilson (95th-bound),-87.657588,41.964273,Wilson,Wilson (Red Line),40540,0,1,0,0,0,0,0,0,0,0
299
+ 30105,N,Wilson (Howard-bound),-87.657588,41.964273,Wilson,Wilson (Red Line),40540,0,1,0,0,0,0,0,0,0,0
@@ -0,0 +1,13 @@
1
+ module CTA
2
+ class TrainTracker
3
+ class Estimate
4
+ attr_reader :station_id, :stop_id, :station_name, :stop_description, :run_number, :route, :destination_stop_id, :destination_name, :direction, :timestamp, :arrival_time, :approaching, :schedule, :fit, :delay
5
+
6
+ def initialize(params)
7
+ params.each do |key, value|
8
+ self.instance_variable_set("@#{ key }".to_sym, value)
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,56 @@
1
+ module CTA
2
+ class TrainTracker
3
+
4
+ def initialize(key)
5
+ @key = key
6
+ @line_table = {
7
+ :red => "Red",
8
+ :blue => "Blue",
9
+ :brown => "Brn",
10
+ :orange => "Org",
11
+ :purple => "P",
12
+ :pink => "Pink",
13
+ :yellow => "Y"
14
+ }
15
+ end
16
+
17
+ def arrivals(params)
18
+ station_id = params[:station_id]
19
+ stop_id = params[:stop_id]
20
+ max = params[:max]
21
+ route = @line_table[params[:route]]
22
+
23
+ base_url = "http://lapi.transitchicago.com/api/1.0/ttarrivals.aspx?"
24
+ url = "#{ base_url }key=#{ @key }&mapid=#{ station_id }&stpid=#{ stop_id }&max=#{ max }&rt=#{ route }"
25
+
26
+ estimate_array = Nokogiri::XML(open(url)).xpath("//eta").map do |item|
27
+ Estimate.new({
28
+ :station_id => item.at("staId").text,
29
+ :stop_id => item.at("stpId").text,
30
+ :station_name => item.at("staNm").text,
31
+ :stop_description => item.at("stpDe").text,
32
+ :run_number => item.at("rn").text,
33
+ :route => @line_table.key(item.at("rt").text),
34
+ :destination_stop_id => item.at("destSt").text,
35
+ :destination_name => item.at("destNm").text,
36
+ :direction => item.at("trDr").text,
37
+ :timestamp => Time.parse(item.at("prdt").text),
38
+ :arrival_time => Time.parse(item.at("arrT").text),
39
+ :approaching => item.at("isApp").text.to_bool,
40
+ :schedule => item.at("isSch").text.to_bool,
41
+ :fit => item.at("isFlt").text.to_bool,
42
+ :delay => item.at("isDly").text.to_bool
43
+ })
44
+ end
45
+ estimate_array
46
+ end
47
+
48
+ def stops
49
+ CSV.read("lib/cta_L_stops.csv").map { |x| {x[0] => x[2]} }
50
+ end
51
+
52
+ def stations
53
+ CSV.read("lib/cta_L_stops.csv").map { |x| {x[7] => x[5]} }
54
+ end
55
+ end
56
+ end
@@ -0,0 +1 @@
1
+ #$LOAD_PATH << File.join(File.dirname(__FILE__), '..', 'lib')
metadata ADDED
@@ -0,0 +1,83 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cta-api
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Frank Bonetti
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-02-02 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: nokogiri
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 1.5.6
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: 1.5.6
30
+ description: An easy way to access the Chicago Transit Authority API via the Ruby
31
+ programming language
32
+ email: frank.r.bonetti@gmail.com
33
+ executables: []
34
+ extensions: []
35
+ extra_rdoc_files: []
36
+ files:
37
+ - cta-api-1.0.0.gem
38
+ - cta-api.gemspec
39
+ - Gemfile
40
+ - lib/bus-tracker/bus-tracker.rb
41
+ - lib/bus-tracker/pattern.rb
42
+ - lib/bus-tracker/point.rb
43
+ - lib/bus-tracker/prediction.rb
44
+ - lib/bus-tracker/service-bulletin.rb
45
+ - lib/bus-tracker/service.rb
46
+ - lib/bus-tracker/stop.rb
47
+ - lib/bus-tracker/vehicle.rb
48
+ - lib/cta-api/version.rb
49
+ - lib/cta-api.rb
50
+ - lib/cta_L_stops.csv
51
+ - lib/train-tracker/estimate.rb
52
+ - lib/train-tracker/train-tracker.rb
53
+ - LICENSE
54
+ - Rakefile
55
+ - README.md
56
+ - spec/spec_helper.rb
57
+ homepage:
58
+ licenses:
59
+ - MIT
60
+ post_install_message:
61
+ rdoc_options: []
62
+ require_paths:
63
+ - lib
64
+ required_ruby_version: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ required_rubygems_version: !ruby/object:Gem::Requirement
71
+ none: false
72
+ requirements:
73
+ - - ! '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ requirements: []
77
+ rubyforge_project:
78
+ rubygems_version: 1.8.24
79
+ signing_key:
80
+ specification_version: 3
81
+ summary: An easy way to access the Chicago Transit Authority API via the Ruby programming
82
+ language
83
+ test_files: []