citi_bike_directions 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,97 @@
1
+ require 'citibikenyc'
2
+ require 'json'
3
+ require 'addressable/uri'
4
+ require 'rest-client'
5
+ require 'geocoder'
6
+ require 'citi_bike_directions/helper_methods'
7
+ require 'citi_bike_directions/distance_matrix_helper'
8
+
9
+ class CitiBikeDirections
10
+ include HelperMethods
11
+ include DistanceMatrixHelper
12
+
13
+ attr_reader :client, :stations, :avail_bike_stations, :avail_dock_stations
14
+
15
+ def initialize(user_agent, availability_tolerance = 5)
16
+ @client = Citibikenyc.client(user_agent: user_agent, debug: true)
17
+ @stations = @client.stations.results
18
+ @avail_tol = availability_tolerance
19
+ end
20
+
21
+ def find_by_id(id)
22
+ @stations.find { |station| station.id == id }
23
+ end
24
+
25
+ def find_avail_bike_stations(n = @avail_tol)
26
+ stations.select { |station| station.availableBikes > n }
27
+ end
28
+
29
+ def find_avail_dock_stations(n = @avail_tol)
30
+ stations.select{ |station| station.availableDocks > n }
31
+ end
32
+
33
+ def find_nearest_avail_bike(address)
34
+ coords = address_to_lat_lng(address)
35
+ find_nearest_avail(coords, :bike)
36
+ end
37
+
38
+ def find_nearest_avail_dock(address)
39
+ coords = address_to_lat_lng(address)
40
+ find_nearest_avail(coords, :dock)
41
+ end
42
+
43
+ private
44
+
45
+ def station_locations_with_ids(stations)
46
+ stations.map { |s| [s.latitude, s.longitude, s.id]}
47
+ end
48
+
49
+ def find_nearest_avail(coords, bike_or_dock)
50
+ case bike_or_dock
51
+ when :bike
52
+ dests = find_nearest_avail_bike_locations(coords)
53
+ when :dock
54
+ dests = find_nearest_avail_dock_locations(coords)
55
+ else
56
+ raise "bike_or_dock has to be bike or dock symbol"
57
+ end
58
+
59
+ params = build_dmatrix_params(dests, coords)
60
+ url = build_dmatrix_url(params)
61
+ p url #debug
62
+
63
+ results = JSON.parse(RestClient.get(url))
64
+ distances = parse_results_into_distance_array(results)
65
+
66
+ find_by_id(dests[distances.index(distances.min)][2])
67
+ end
68
+
69
+ def parse_results_into_distance_array(results)
70
+ results["rows"][0]["elements"].map do |element|
71
+ element["distance"]["value"]
72
+ end
73
+ end
74
+
75
+ def find_nearest_avail_bike_locations(coords, n = @avail_tol)
76
+ locs = station_locations_with_ids(find_avail_bike_stations)
77
+ sort_locations_by_distance(coords, locs, n)
78
+ end
79
+
80
+ def find_nearest_avail_dock_locations(coords, n = @avail_tol)
81
+ locs = station_locations_with_ids(find_avail_dock_stations)
82
+ sort_locations_by_distance(coords, locs, n)
83
+ end
84
+
85
+ def sort_locations_by_distance(coords, locs, n)
86
+ sorted_locs = locs.sort_by { |rack| distance(coords,rack[0..1]) }
87
+ sorted_locs[0...n]
88
+ end
89
+
90
+ def distance(start,finish)
91
+ dx, dy = finish[0] - start[0], finish[1] - start[1]
92
+
93
+ Math.sqrt(dx**2 + dy**2)
94
+ end
95
+
96
+ end
97
+
@@ -0,0 +1,22 @@
1
+ module DistanceMatrixHelper
2
+
3
+ def build_dmatrix_url(qv_hash)
4
+ Addressable::URI.new(
5
+ scheme: "http",
6
+ host: "www.google.com",
7
+ path: "maps/api/distancematrix/json",
8
+ query_values: qv_hash
9
+ ).to_s
10
+ end
11
+
12
+ def build_dmatrix_params(dests, coords)
13
+ dest_str = dests.map { |lat, long, id| "#{lat},#{long}" }.join("|")
14
+ p dest_str #debug
15
+ orig_str = coords.join(",")
16
+ { destinations: dest_str,
17
+ origins: orig_str,
18
+ sensor: false,
19
+ mode: "walking" }
20
+ end
21
+
22
+ end
@@ -0,0 +1,9 @@
1
+ module HelperMethods
2
+ def address_to_lat_lng(address)
3
+ result = Geocoder.search(address)
4
+ lat = result.first.data['geometry']['location']['lat']
5
+ lng = result.first.data['geometry']['location']['lng']
6
+
7
+ [lat, lng]
8
+ end
9
+ end
metadata ADDED
@@ -0,0 +1,129 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: citi_bike_directions
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Jin Park
9
+ - Harris Effron
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2013-08-21 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: citibikenyc
17
+ requirement: !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: '0'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ! '>='
29
+ - !ruby/object:Gem::Version
30
+ version: '0'
31
+ - !ruby/object:Gem::Dependency
32
+ name: json
33
+ requirement: !ruby/object:Gem::Requirement
34
+ none: false
35
+ requirements:
36
+ - - ! '>='
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ type: :runtime
40
+ prerelease: false
41
+ version_requirements: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ! '>='
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ - !ruby/object:Gem::Dependency
48
+ name: addressable
49
+ requirement: !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :runtime
56
+ prerelease: false
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ! '>='
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ - !ruby/object:Gem::Dependency
64
+ name: rest-client
65
+ requirement: !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ! '>='
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
71
+ type: :runtime
72
+ prerelease: false
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ! '>='
77
+ - !ruby/object:Gem::Version
78
+ version: '0'
79
+ - !ruby/object:Gem::Dependency
80
+ name: geocoder
81
+ requirement: !ruby/object:Gem::Requirement
82
+ none: false
83
+ requirements:
84
+ - - ! '>='
85
+ - !ruby/object:Gem::Version
86
+ version: '0'
87
+ type: :runtime
88
+ prerelease: false
89
+ version_requirements: !ruby/object:Gem::Requirement
90
+ none: false
91
+ requirements:
92
+ - - ! '>='
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
95
+ description: Enter a start and end point, get full citibike directions to your destination
96
+ email: harris.effron@gmail.com
97
+ executables: []
98
+ extensions: []
99
+ extra_rdoc_files: []
100
+ files:
101
+ - lib/citi_bike_directions.rb
102
+ - lib/citi_bike_directions/helper_methods.rb
103
+ - lib/citi_bike_directions/distance_matrix_helper.rb
104
+ homepage: http://rubygems.org/gems/citi_bike_directions
105
+ licenses:
106
+ - MIT
107
+ post_install_message:
108
+ rdoc_options: []
109
+ require_paths:
110
+ - lib
111
+ required_ruby_version: !ruby/object:Gem::Requirement
112
+ none: false
113
+ requirements:
114
+ - - ! '>='
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ required_rubygems_version: !ruby/object:Gem::Requirement
118
+ none: false
119
+ requirements:
120
+ - - ! '>='
121
+ - !ruby/object:Gem::Version
122
+ version: '0'
123
+ requirements: []
124
+ rubyforge_project:
125
+ rubygems_version: 1.8.25
126
+ signing_key:
127
+ specification_version: 3
128
+ summary: Get citibike directions with Google maps!
129
+ test_files: []