mapbox-sdk 1.0.0 → 2.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|