mapbox-sdk 1.0.0 → 2.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.gitignore +9 -0
- data/.travis.yml +9 -0
- data/CHANGELOG.md +45 -0
- data/Gemfile +6 -2
- data/README.md +27 -25
- data/docs/directions.md +31 -0
- data/docs/geocoding.md +15 -0
- data/docs/isochrone.md +11 -0
- data/docs/mapmatching.md +43 -0
- data/docs/matrix.md +38 -0
- data/docs/optimization.md +52 -0
- data/docs/tilequery.md +12 -0
- data/lib/mapbox-sdk.rb +1 -0
- data/lib/mapbox.rb +24 -8
- data/lib/mapbox/directions.rb +53 -11
- data/lib/mapbox/geocoder.rb +41 -4
- data/lib/mapbox/isochrone.rb +35 -0
- data/lib/mapbox/map_matching.rb +57 -0
- data/lib/mapbox/matrix.rb +32 -0
- data/lib/mapbox/optimization.rb +47 -0
- data/lib/mapbox/tilequery.rb +15 -0
- data/mapbox-sdk.gemspec +2 -3
- data/test/all_tests.rb +4 -0
- data/test/directions_test.rb +7 -5
- data/test/geocoding_test.rb +50 -3
- data/test/isochrone_test.rb +15 -0
- data/test/map_matching_test.rb +46 -0
- data/test/mapbox_test.rb +23 -0
- data/test/matrix_test.rb +40 -0
- data/test/optimization_test.rb +56 -0
- data/test/tilequery_test.rb +15 -0
- metadata +45 -33
- data/Gemfile.lock +0 -64
data/lib/mapbox/geocoder.rb
CHANGED
@@ -1,20 +1,57 @@
|
|
1
1
|
require 'rest-client'
|
2
2
|
require 'json'
|
3
|
+
require 'uri'
|
3
4
|
|
4
5
|
module Mapbox
|
5
6
|
class Geocoder
|
6
7
|
include Mapbox::APIOperations::Request
|
7
|
-
|
8
|
+
extend Mapbox::HashUtils
|
9
|
+
|
10
|
+
def self.assemble_params(options={})
|
11
|
+
proximity = options[:proximity]
|
12
|
+
bbox = options[:bbox]
|
13
|
+
types = options[:types]
|
14
|
+
params = ''
|
15
|
+
opts = options.select { |key, value| key != :proximity && key != :bbox && key != :types}
|
16
|
+
if opts.length > 0
|
17
|
+
params += "#{params.length > 0 ? '&' : '?'}#{URI.encode_www_form(opts)}"
|
18
|
+
end
|
19
|
+
|
20
|
+
if proximity then
|
21
|
+
lon = proximity[:longitude].round(3)
|
22
|
+
lat = proximity[:latitude].round(3)
|
23
|
+
params += "#{params.length > 0 ? '&' : '?'}proximity=#{lon}%2C#{lat}"
|
24
|
+
end
|
25
|
+
|
26
|
+
if bbox then
|
27
|
+
params += "#{params.length > 0 ? '&' : '?'}bbox=#{bbox.join('%2C')}"
|
28
|
+
end
|
29
|
+
|
30
|
+
if types then
|
31
|
+
params += "#{params.length > 0 ? '&' : '?'}types=#{types.join('%2C')}"
|
32
|
+
end
|
33
|
+
|
34
|
+
return params
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.geocode_forward(query, options={}, dataset='mapbox.places')
|
38
|
+
params = self.assemble_params(options)
|
39
|
+
|
8
40
|
return request(
|
9
41
|
:get,
|
10
|
-
"/
|
42
|
+
"/geocoding/v5/#{dataset}/#{URI.escape(query)}.json#{params}",
|
11
43
|
nil)
|
12
44
|
end
|
13
45
|
|
14
|
-
def self.geocode_reverse(location, dataset='mapbox.places')
|
46
|
+
def self.geocode_reverse(location, options={}, dataset='mapbox.places')
|
47
|
+
location[:longitude] = location[:longitude].round(5)
|
48
|
+
location[:latitude] = location[:latitude].round(5)
|
49
|
+
|
50
|
+
params = self.assemble_params(options)
|
51
|
+
|
15
52
|
return request(
|
16
53
|
:get,
|
17
|
-
"/
|
54
|
+
"/geocoding/v5/#{dataset}/#{xy_from_hash(location).join(',')}.json#{params}",
|
18
55
|
nil)
|
19
56
|
end
|
20
57
|
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Mapbox
|
2
|
+
class Isochrone
|
3
|
+
include Mapbox::APIOperations::Request
|
4
|
+
|
5
|
+
def self.assemble_params(options={})
|
6
|
+
contours_minutes = options[:contours_minutes]
|
7
|
+
contours_colors = options[:contours_colors]
|
8
|
+
|
9
|
+
params = ''
|
10
|
+
opts = options.select { |key, value| key != :contours_minutes && key != :contours_colors }
|
11
|
+
if opts.length > 0
|
12
|
+
params += "#{params.length > 0 ? '&' : '?'}#{URI.encode_www_form(opts)}"
|
13
|
+
end
|
14
|
+
|
15
|
+
if contours_minutes then
|
16
|
+
params += "#{params.length > 0 ? '&' : '?'}contours_minutes=#{contours_minutes.join(',')}"
|
17
|
+
end
|
18
|
+
|
19
|
+
if contours_colors then
|
20
|
+
params += "#{params.length > 0 ? '&' : '?'}contours_colors=#{contours_colors.join(',')}"
|
21
|
+
end
|
22
|
+
|
23
|
+
return params
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.isochrone(profile, coordinates, options={})
|
27
|
+
params = self.assemble_params(options)
|
28
|
+
|
29
|
+
return request(
|
30
|
+
:get,
|
31
|
+
"/isochrone/v1/mapbox/#{profile}/#{coordinates}#{params}",
|
32
|
+
nil)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
module Mapbox
|
2
|
+
class MapMatching
|
3
|
+
include Mapbox::APIOperations::Request
|
4
|
+
extend Mapbox::HashUtils
|
5
|
+
|
6
|
+
def self.assemble_params(options={})
|
7
|
+
annotations = options[:annotations]
|
8
|
+
approaches = options[:approaches]
|
9
|
+
radiuses = options[:radiuses]
|
10
|
+
timestamps = options[:timestamps]
|
11
|
+
waypoint_names = options[:waypoint_names]
|
12
|
+
waypoints = options[:waypoints]
|
13
|
+
|
14
|
+
params = ''
|
15
|
+
opts = options.select { |key, value| key != :annotations && key != :approaches && key != :radiuses && key != :timestamps && key != :waypoint_names && key != :waypoints }
|
16
|
+
if opts.length > 0
|
17
|
+
params += "#{params.length > 0 ? '&' : '?'}#{URI.encode_www_form(opts)}"
|
18
|
+
end
|
19
|
+
|
20
|
+
if annotations then
|
21
|
+
params += "#{params.length > 0 ? '&' : '?'}annotations=#{annotations.join(',')}"
|
22
|
+
end
|
23
|
+
|
24
|
+
if approaches then
|
25
|
+
params += "#{params.length > 0 ? '&' : '?'}approaches=#{approaches.join(';')}"
|
26
|
+
end
|
27
|
+
|
28
|
+
if radiuses then
|
29
|
+
params += "#{params.length > 0 ? '&' : '?'}radiuses=#{radiuses.join ';'}"
|
30
|
+
end
|
31
|
+
|
32
|
+
if timestamps then
|
33
|
+
params += "#{params.length > 0 ? '&' : '?'}timestamps=#{timestamps.join ';'}"
|
34
|
+
end
|
35
|
+
|
36
|
+
if waypoint_names then
|
37
|
+
params += "#{params.length > 0 ? '&' : '?'}waypoint_names=#{waypoint_names.join ';'}"
|
38
|
+
end
|
39
|
+
|
40
|
+
if waypoints then
|
41
|
+
params += "#{params.length > 0 ? '&' : '?'}waypoints=#{waypoints.join ';'}"
|
42
|
+
end
|
43
|
+
|
44
|
+
return params
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.map_matching(waypoints, profile, options={})
|
48
|
+
formatted_waypoints = waypoints.map {|p| xy_from_hash(p).join ','}.join ';'
|
49
|
+
params = self.assemble_params(options)
|
50
|
+
|
51
|
+
return request(
|
52
|
+
:get,
|
53
|
+
"/matching/v5/mapbox/#{profile}/#{formatted_waypoints}.json#{params}",
|
54
|
+
nil)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Mapbox
|
2
|
+
class Matrix
|
3
|
+
include Mapbox::APIOperations::Request
|
4
|
+
extend Mapbox::HashUtils
|
5
|
+
|
6
|
+
def self.assemble_params(options={})
|
7
|
+
opts = options.dup
|
8
|
+
|
9
|
+
self.joinArrayParam(opts, :destinations)
|
10
|
+
self.joinArrayParam(opts, :annotations, ',')
|
11
|
+
self.joinArrayParam(opts, :approaches)
|
12
|
+
self.joinArrayParam(opts, :sources)
|
13
|
+
|
14
|
+
return "?#{URI.encode_www_form(opts)}"
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.joinArrayParam(opts, name, joinSymbol = ';')
|
18
|
+
if opts[name].kind_of?(Array)
|
19
|
+
opts[name] = opts[name].join(joinSymbol)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.matrix(waypoints, profile, options={})
|
24
|
+
formatted_waypoints = waypoints.map {|p| xy_from_hash(p).join ','}.join ';'
|
25
|
+
params = self.assemble_params(options)
|
26
|
+
return request(
|
27
|
+
:get,
|
28
|
+
"/directions-matrix/v1/mapbox/#{profile}/#{formatted_waypoints}.json#{params}",
|
29
|
+
nil)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Mapbox
|
2
|
+
class Optimization
|
3
|
+
include Mapbox::APIOperations::Request
|
4
|
+
extend Mapbox::HashUtils
|
5
|
+
|
6
|
+
def self.assemble_params(options={})
|
7
|
+
annotations = options[:annotations]
|
8
|
+
approaches = options[:approaches]
|
9
|
+
distributions = options[:distributions]
|
10
|
+
radiuses = options[:radiuses]
|
11
|
+
|
12
|
+
params = ''
|
13
|
+
opts = options.select { |key, value| key != :annotations && key != :approaches && key != :distributions && key != :radiuses }
|
14
|
+
if opts.length > 0
|
15
|
+
params += "#{params.length > 0 ? '&' : '?'}#{URI.encode_www_form(opts)}"
|
16
|
+
end
|
17
|
+
|
18
|
+
if annotations then
|
19
|
+
params += "#{params.length > 0 ? '&' : '?'}annotations=#{annotations.join(',')}"
|
20
|
+
end
|
21
|
+
|
22
|
+
if approaches then
|
23
|
+
params += "#{params.length > 0 ? '&' : '?'}approaches=#{approaches.join(';')}"
|
24
|
+
end
|
25
|
+
|
26
|
+
if distributions then
|
27
|
+
params += "#{params.length > 0 ? '&' : '?'}distributions=#{distributions.join(';')}"
|
28
|
+
end
|
29
|
+
|
30
|
+
if radiuses then
|
31
|
+
params += "#{params.length > 0 ? '&' : '?'}radiuses=#{radiuses.join(';')}"
|
32
|
+
end
|
33
|
+
|
34
|
+
return params
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.optimization(waypoints, profile, options={})
|
38
|
+
formatted_waypoints = waypoints.map {|p| xy_from_hash(p).join ','}.join ';'
|
39
|
+
params = self.assemble_params(options)
|
40
|
+
|
41
|
+
return request(
|
42
|
+
:get,
|
43
|
+
"/optimized-trips/v1/mapbox/#{profile}/#{formatted_waypoints}.json#{params}",
|
44
|
+
nil)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Mapbox
|
2
|
+
class Tilequery
|
3
|
+
include Mapbox::APIOperations::Request
|
4
|
+
extend Mapbox::HashUtils
|
5
|
+
|
6
|
+
def self.tilequery(mapid, location, radius, limit)
|
7
|
+
lon = location['longitude'].round(5)
|
8
|
+
lat = location['latitude'].round(5)
|
9
|
+
return request(
|
10
|
+
:get,
|
11
|
+
"/v4/#{mapid}/tilequery/#{lon},#{lat}.json?radius=#{radius}&limit=#{limit}",
|
12
|
+
nil)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/mapbox-sdk.gemspec
CHANGED
@@ -2,7 +2,7 @@ $:.unshift(File.join(File.dirname(__FILE__), 'lib'))
|
|
2
2
|
|
3
3
|
spec = Gem::Specification.new do |s|
|
4
4
|
s.name = 'mapbox-sdk'
|
5
|
-
s.version = '
|
5
|
+
s.version = '2.3.1'
|
6
6
|
s.summary = 'Ruby bindings for the Mapbox API'
|
7
7
|
s.description = ''
|
8
8
|
s.authors = ['Tom MacWright']
|
@@ -10,8 +10,7 @@ spec = Gem::Specification.new do |s|
|
|
10
10
|
s.homepage = 'https://mapbox.com/developers'
|
11
11
|
s.license = 'MIT'
|
12
12
|
|
13
|
-
s.add_dependency('rest-client', '~> 1.
|
14
|
-
s.add_dependency('json', '~> 1.8.1')
|
13
|
+
s.add_dependency('rest-client', '~> 2.1.0')
|
15
14
|
|
16
15
|
s.add_development_dependency('mocha', '~> 0.13.2')
|
17
16
|
s.add_development_dependency('shoulda', '~> 3.4.0')
|
data/test/all_tests.rb
ADDED
data/test/directions_test.rb
CHANGED
@@ -9,14 +9,16 @@ module Mapbox
|
|
9
9
|
Mapbox.access_token = ENV["MapboxAccessToken"]
|
10
10
|
result = Mapbox::Directions.directions([
|
11
11
|
{
|
12
|
-
|
13
|
-
|
12
|
+
:longitude => -100,
|
13
|
+
:latitude => 38
|
14
14
|
},
|
15
15
|
{
|
16
|
-
|
17
|
-
|
16
|
+
:longitude => -90,
|
17
|
+
:latitude => 38
|
18
18
|
}
|
19
|
-
]
|
19
|
+
], "cycling", {
|
20
|
+
geometries: "geojson"
|
21
|
+
})
|
20
22
|
assert result
|
21
23
|
end
|
22
24
|
end
|
data/test/geocoding_test.rb
CHANGED
@@ -11,13 +11,60 @@ module Mapbox
|
|
11
11
|
assert result
|
12
12
|
end
|
13
13
|
|
14
|
-
|
14
|
+
should "#geocode_forward (rounded proximity to 3 decimal places)" do
|
15
|
+
Mapbox.access_token = ENV["MapboxAccessToken"]
|
16
|
+
result = Mapbox::Geocoder.geocode_forward("Chester, NJ", {:proximity => {:longitude => 0.1234567, :latitude => -10.987654}})
|
17
|
+
assert result
|
18
|
+
assert Mapbox.request_opts[:url].include? '?proximity=0.123%2C-10.988&'
|
19
|
+
end
|
20
|
+
|
21
|
+
should "#geocode_forward (include bbox param)" do
|
22
|
+
Mapbox.access_token = ENV["MapboxAccessToken"]
|
23
|
+
result = Mapbox::Geocoder.geocode_forward("Washington", {:bbox => [-78.3284,38.6039,-78.0428,38.7841]})
|
24
|
+
assert result
|
25
|
+
assert Mapbox.request_opts[:url].include? '?bbox=-78.3284%2C38.6039%2C-78.0428%2C38.7841';
|
26
|
+
end
|
27
|
+
|
28
|
+
should "#geocode_forward (include extra param)" do
|
29
|
+
Mapbox.access_token = ENV["MapboxAccessToken"]
|
30
|
+
result = Mapbox::Geocoder.geocode_forward("Washington", {:bbox => [-78.3284,38.6039,-78.0428,38.7841], :foo_key => "foo_val", :bar_key => "bar_val"})
|
31
|
+
assert result
|
32
|
+
assert Mapbox.request_opts[:url].include? '?foo_key=foo_val&bar_key=bar_val';
|
33
|
+
end
|
34
|
+
|
35
|
+
should "#geocode_forward (include country param)" do
|
36
|
+
Mapbox.access_token = ENV["MapboxAccessToken"]
|
37
|
+
result = Mapbox::Geocoder.geocode_forward("Washington", {:country => "ca"})
|
38
|
+
assert result
|
39
|
+
assert Mapbox.request_opts[:url].include? '?country=ca';
|
40
|
+
end
|
41
|
+
|
42
|
+
should "#geocode_forward (include types param)" do
|
43
|
+
Mapbox.access_token = ENV["MapboxAccessToken"]
|
44
|
+
result = Mapbox::Geocoder.geocode_forward("Washington", {:types => ['poi.landmark', 'address'], :foo_key => "foo_val", :bar_key => "bar_val"})
|
45
|
+
assert result
|
46
|
+
assert Mapbox.request_opts[:url].include? '?foo_key=foo_val&bar_key=bar_val&types=poi.landmark%2Caddress';
|
47
|
+
end
|
48
|
+
|
49
|
+
should "#geocode_reverse" do
|
15
50
|
Mapbox.access_token = ENV["MapboxAccessToken"]
|
16
51
|
result = Mapbox::Geocoder.geocode_reverse({
|
17
|
-
|
18
|
-
|
52
|
+
:latitude => 38,
|
53
|
+
:longitude => -100
|
19
54
|
})
|
20
55
|
assert result
|
21
56
|
end
|
57
|
+
|
58
|
+
should "#geocode_reverse (rounded coordinates to 5 decimal places)" do
|
59
|
+
Mapbox.access_token = ENV["MapboxAccessToken"]
|
60
|
+
result = Mapbox::Geocoder.geocode_reverse({
|
61
|
+
:latitude => 1.23456789,
|
62
|
+
:longitude => -99.8765432
|
63
|
+
})
|
64
|
+
for coord in result.first['query'] do
|
65
|
+
assert coord.to_s.split('.')[-1].length <= 5
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
22
69
|
end
|
23
70
|
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'mapbox'
|
2
|
+
require 'test/unit'
|
3
|
+
require 'mocha/setup'
|
4
|
+
require 'shoulda'
|
5
|
+
|
6
|
+
module Mapbox
|
7
|
+
class IsochroneTest < Test::Unit::TestCase
|
8
|
+
should "#isochrone" do
|
9
|
+
Mapbox.access_token = ENV["MapboxAccessToken"]
|
10
|
+
result = Mapbox::Isochrone.isochrone(
|
11
|
+
"walking", "-118.22258,33.99038", {contours_minutes: [5,10,15]})
|
12
|
+
assert result
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'mapbox'
|
2
|
+
require 'test/unit'
|
3
|
+
require 'mocha/setup'
|
4
|
+
require 'shoulda'
|
5
|
+
|
6
|
+
module Mapbox
|
7
|
+
class MapMatchingTest < Test::Unit::TestCase
|
8
|
+
should "#map match with just coordinates and profile" do
|
9
|
+
Mapbox.access_token = ENV["MapboxAccessToken"]
|
10
|
+
result = Mapbox::MapMatching.map_matching([{
|
11
|
+
"longitude" => -117.17282,
|
12
|
+
"latitude" => 32.71204
|
13
|
+
}, {
|
14
|
+
"longitude" => -117.17288,
|
15
|
+
"latitude" => 32.71225
|
16
|
+
}, {
|
17
|
+
"longitude" => -117.17293,
|
18
|
+
"latitude" => 32.71244
|
19
|
+
},{
|
20
|
+
"longitude" => -117.17292,
|
21
|
+
"latitude" => 32.71256
|
22
|
+
}], "driving")
|
23
|
+
assert result
|
24
|
+
end
|
25
|
+
should "#map match with optional params" do
|
26
|
+
Mapbox.access_token = ENV["MapboxAccessToken"]
|
27
|
+
result = Mapbox::MapMatching.map_matching([{
|
28
|
+
"longitude" => -117.17282,
|
29
|
+
"latitude" => 32.71204
|
30
|
+
}, {
|
31
|
+
"longitude" => -117.17288,
|
32
|
+
"latitude" => 32.71225
|
33
|
+
}, {
|
34
|
+
"longitude" => -117.17293,
|
35
|
+
"latitude" => 32.71244
|
36
|
+
}, {
|
37
|
+
"longitude" => -117.17292,
|
38
|
+
"latitude" => 32.71256
|
39
|
+
}], "driving", {
|
40
|
+
annotations: ["duration", "distance", "speed"],
|
41
|
+
approaches: ["curb","curb","curb","curb"]
|
42
|
+
})
|
43
|
+
assert result
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
data/test/mapbox_test.rb
CHANGED
@@ -15,4 +15,27 @@ module Mapbox
|
|
15
15
|
Mapbox.access_token = "foo"
|
16
16
|
end
|
17
17
|
end
|
18
|
+
|
19
|
+
class HashUtilTest < Test::Unit::TestCase
|
20
|
+
include Mapbox::HashUtils
|
21
|
+
|
22
|
+
should "return array of long,lat from hash with string keys" do
|
23
|
+
assert_equal xy_from_hash({'longitude' => -122, 'latitude' => 45}),
|
24
|
+
[-122, 45]
|
25
|
+
end
|
26
|
+
|
27
|
+
should "return array of long,lat from hash with symbol keys" do
|
28
|
+
assert_equal xy_from_hash({:longitude => -122, :latitude => 45}),
|
29
|
+
[-122, 45]
|
30
|
+
end
|
31
|
+
|
32
|
+
should "return array of long,lat from hash with mixed keys" do
|
33
|
+
assert_equal xy_from_hash({:longitude => -122, 'latitude' => 45}),
|
34
|
+
[-122, 45]
|
35
|
+
end
|
36
|
+
|
37
|
+
should "raise arguemnt error if not given a hash" do
|
38
|
+
assert_raise { xy_from_hash(Object.new) }
|
39
|
+
end
|
40
|
+
end
|
18
41
|
end
|