open_street_map 1.1 → 1.1.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 +4 -4
- data/README.md +2 -2
- data/lib/open_street_map/client/request.rb +88 -0
- data/lib/open_street_map/client.rb +11 -5
- data/lib/open_street_map/version.rb +1 -1
- metadata +3 -4
- data/lib/open_street_map/client/reverse.rb +0 -28
- data/lib/open_street_map/client/search.rb +0 -32
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cf89cc2a9860608487a2e39ae028912a15209f675d10ad70e4d09a5d1ca7903f
|
4
|
+
data.tar.gz: b08b3864ed1cb9e843a98faab1f07aefecbfea78eaa609148c78350e8364d126
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e0747f589ef8b0870da627b6706c788d0fa74f5b63b1dcddcf4962b326a19f275c01871d3a1f08033426568273c231d4244bc135aded5bbe136fd1242a537781
|
7
|
+
data.tar.gz: c511bf49cd166de25a90c194618447c04a002a3930a86578a621c4b4e18a8ffaa16beb37d368fa9088dc9a959fb4200f5d7d387d72d9769c805bb535713018da
|
data/README.md
CHANGED
@@ -34,7 +34,7 @@ Request for search objects is #search.
|
|
34
34
|
client.search(q: '135 pilkington avenue, birmingham', format: 'json', addressdetails: '1', accept_language: 'ru')
|
35
35
|
```
|
36
36
|
q - query
|
37
|
-
format - one of the [xml|json|jsonv2]
|
37
|
+
format - one of the [xml|json|jsonv2], default - xml
|
38
38
|
viewbox - The preferred area to find search results like <x1>,<y1>,<x2>,<y2>
|
39
39
|
bounded - Restrict the results to only items contained with the viewbox, one of the [0|1]
|
40
40
|
addressdetails - Include a breakdown of the address into elements, one of the [0|1]
|
@@ -86,7 +86,7 @@ Request for objects by coordinates is #reverse.
|
|
86
86
|
```ruby
|
87
87
|
client.reverse(format: 'json', lat: '52.594417', lon: '39.493115', accept_language: 'ru')
|
88
88
|
```
|
89
|
-
format - one of the [xml|json|jsonv2]
|
89
|
+
format - one of the [xml|json|jsonv2], default - xml
|
90
90
|
zoom - Level of detail required where 0 is country and 18 is house/building, one of the [0-18]
|
91
91
|
addressdetails - Include a breakdown of the address into elements, one of the [0|1]
|
92
92
|
lat - Latitude, required
|
@@ -0,0 +1,88 @@
|
|
1
|
+
module OpenStreetMap
|
2
|
+
class Client
|
3
|
+
# methods for request
|
4
|
+
module Request
|
5
|
+
private
|
6
|
+
|
7
|
+
def call(type, args)
|
8
|
+
url = generate_url(type, args)
|
9
|
+
response = fetch(url, args)
|
10
|
+
sleep(REQUEST_TIMEOUT)
|
11
|
+
parse(response, args[:format])
|
12
|
+
rescue
|
13
|
+
{ 'errors' => 'Bad request' }
|
14
|
+
end
|
15
|
+
|
16
|
+
# generate url from args
|
17
|
+
def generate_url(type, args)
|
18
|
+
valid_args_list = valid_args(type)
|
19
|
+
args = args.select { |key, _value| valid_args_list.include?(key) }
|
20
|
+
url = args.inject('') { |acc, (key, value)| acc + add_to_options(key, value, acc) }
|
21
|
+
type + url
|
22
|
+
end
|
23
|
+
|
24
|
+
# make request to API
|
25
|
+
def fetch(url, args)
|
26
|
+
url = hostname(args[:hostname]) + url
|
27
|
+
RestClient.get(url, user_agent: user_agent(args[:user_agent]))
|
28
|
+
end
|
29
|
+
|
30
|
+
# parse response
|
31
|
+
def parse(response, format)
|
32
|
+
if json_parse_valid?(format)
|
33
|
+
JSON.parse(response.body)
|
34
|
+
else
|
35
|
+
response.body
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
# get list of permitted args
|
40
|
+
def valid_args(type)
|
41
|
+
case type
|
42
|
+
when 'search' then %i[q format addressdetails extratags namedetails viewbox bounded exclude_place_ids limit accept_language email]
|
43
|
+
when 'reverse' then %i[format lat lon zoom addressdetails extratags namedetails accept_language email]
|
44
|
+
else []
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
# make combination of special symbol and param with value
|
49
|
+
def add_to_options(key, value, acc)
|
50
|
+
symbol_for_param(acc) + key_value_param(key, remove_spaces(value))
|
51
|
+
end
|
52
|
+
|
53
|
+
# select special symbol
|
54
|
+
def symbol_for_param(acc)
|
55
|
+
acc == '' ? '?' : '&'
|
56
|
+
end
|
57
|
+
|
58
|
+
# make combination of param with value
|
59
|
+
def key_value_param(key, value)
|
60
|
+
if key == :accept_language
|
61
|
+
"accept-language=#{value}"
|
62
|
+
else
|
63
|
+
"#{key}=#{value}"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
# replace spaces with + for values
|
68
|
+
def remove_spaces(value)
|
69
|
+
value.gsub(/\s+/, '+')
|
70
|
+
end
|
71
|
+
|
72
|
+
# select hostname for request
|
73
|
+
def hostname(value)
|
74
|
+
value || BASE_URI
|
75
|
+
end
|
76
|
+
|
77
|
+
# select user_agent for request
|
78
|
+
def user_agent(value)
|
79
|
+
value || DEFAULT_USER_AGENT
|
80
|
+
end
|
81
|
+
|
82
|
+
# if format equal json then allow parsing
|
83
|
+
def json_parse_valid?(format)
|
84
|
+
format == 'json' || format == 'jsonv2'
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -1,18 +1,24 @@
|
|
1
1
|
require 'rest-client'
|
2
2
|
require 'json'
|
3
|
-
require_relative 'client/
|
4
|
-
require_relative 'client/search'
|
3
|
+
require_relative 'client/request'
|
5
4
|
|
6
5
|
module OpenStreetMap
|
7
6
|
# Client requests
|
8
7
|
class Client
|
9
|
-
include OpenStreetMap::Client::
|
10
|
-
include OpenStreetMap::Client::Search
|
8
|
+
include OpenStreetMap::Client::Request
|
11
9
|
|
12
10
|
BASE_URI = 'https://nominatim.openstreetmap.org/'.freeze
|
13
11
|
DEFAULT_USER_AGENT = "webgents/open_street_map_gem_#{SecureRandom.urlsafe_base64}".freeze
|
14
12
|
REQUEST_TIMEOUT = 1
|
15
13
|
|
16
|
-
|
14
|
+
# Search objects by query
|
15
|
+
def search(args = {})
|
16
|
+
call('search', args)
|
17
|
+
end
|
18
|
+
|
19
|
+
# Reverse geocoding generates an address from a latitude and longitude
|
20
|
+
def reverse(args = {})
|
21
|
+
call('reverse', args)
|
22
|
+
end
|
17
23
|
end
|
18
24
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: open_street_map
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- JungleCoders
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date: 2018-
|
12
|
+
date: 2018-10-31 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -101,8 +101,7 @@ files:
|
|
101
101
|
- bin/setup
|
102
102
|
- lib/open_street_map.rb
|
103
103
|
- lib/open_street_map/client.rb
|
104
|
-
- lib/open_street_map/client/
|
105
|
-
- lib/open_street_map/client/search.rb
|
104
|
+
- lib/open_street_map/client/request.rb
|
106
105
|
- lib/open_street_map/version.rb
|
107
106
|
- open_street_map.gemspec
|
108
107
|
homepage: https://github.com/WebGents/open_street_map
|
@@ -1,28 +0,0 @@
|
|
1
|
-
module OpenStreetMap
|
2
|
-
class Client
|
3
|
-
# Reverse geocoding generates an address from a latitude and longitude
|
4
|
-
module Reverse
|
5
|
-
def reverse(args = {})
|
6
|
-
response = RestClient.get("#{args[:hostname] || BASE_URI}reverse?#{reverse_args_to_url(args)}", user_agent: args[:user_agent] || DEFAULT_USER_AGENT)
|
7
|
-
sleep(REQUEST_TIMEOUT)
|
8
|
-
args[:format] == 'xml' ? response.body : JSON.parse(response.body)
|
9
|
-
rescue
|
10
|
-
{ 'errors' => 'Bad request' }
|
11
|
-
end
|
12
|
-
|
13
|
-
private
|
14
|
-
|
15
|
-
def reverse_args_to_url(args, result = [])
|
16
|
-
valid_reverse_args(args).each do |key, value|
|
17
|
-
key = 'accept-language' if key == :accept_language
|
18
|
-
result << "#{key}=#{value}"
|
19
|
-
end
|
20
|
-
result.join('&')
|
21
|
-
end
|
22
|
-
|
23
|
-
def valid_reverse_args(args)
|
24
|
-
args.slice(:format, :lat, :lon, :zoom, :addressdetails, :extratags, :namedetails, :accept_language, :email)
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
@@ -1,32 +0,0 @@
|
|
1
|
-
module OpenStreetMap
|
2
|
-
class Client
|
3
|
-
# Search objects by query
|
4
|
-
module Search
|
5
|
-
def search(args = {})
|
6
|
-
response = RestClient.get("#{args[:hostname] || BASE_URI}search?#{search_arg(args[:q])}&#{search_args_to_url(args)}", user_agent: args[:user_agent] || DEFAULT_USER_AGENT)
|
7
|
-
sleep(REQUEST_TIMEOUT)
|
8
|
-
args[:format] == 'xml' ? response.body : JSON.parse(response.body)
|
9
|
-
rescue
|
10
|
-
{ 'errors' => 'Bad request' }
|
11
|
-
end
|
12
|
-
|
13
|
-
private
|
14
|
-
|
15
|
-
def search_arg(arg)
|
16
|
-
"q=#{arg.gsub(/\s+/, '+')}"
|
17
|
-
end
|
18
|
-
|
19
|
-
def search_args_to_url(args, result = [])
|
20
|
-
valid_search_args(args).each do |key, value|
|
21
|
-
key = 'accept-language' if key == :accept_language
|
22
|
-
result << "#{key}=#{value}"
|
23
|
-
end
|
24
|
-
result.join('&')
|
25
|
-
end
|
26
|
-
|
27
|
-
def valid_search_args(args)
|
28
|
-
args.slice(:format, :addressdetails, :extratags, :namedetails, :viewbox, :bounded, :exclude_place_ids, :limit, :accept_language, :email)
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|