overpass-api-ruby 0.1.3 → 0.2
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/.gitignore +1 -0
- data/CHANGELOG.md +7 -0
- data/Gemfile.lock +21 -25
- data/README.md +36 -16
- data/lib/base.rb +40 -0
- data/lib/overpass_api_ruby.rb +2 -92
- data/lib/ql.rb +16 -0
- data/lib/xml.rb +12 -0
- data/overpass-api-ruby.gemspec +1 -3
- data/spec/overpass_api_ruby_spec.rb +25 -10
- metadata +9 -32
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8ef9346aa556dd932264aaa04f016c2d86553a93
|
4
|
+
data.tar.gz: f6366d26fa31b74b910400e11f92376996dd0204
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 013cc225d04ad2f4fe501f2beb430ad837831ddc134e4630ac962d7f47518d34b9c9f796418d103862a2aca2a762f10be631a7db8a0b4abf252c9c16e5542f7a
|
7
|
+
data.tar.gz: 05eb5f15ed2b487300124889ca2ce7ecf5fedaa86cd3ec1c281af66c226083ca80bde55831b76ea525ecf66cf553053f20d98e25645ebca149b796bca1d37e35
|
data/.gitignore
CHANGED
data/CHANGELOG.md
ADDED
data/Gemfile.lock
CHANGED
@@ -1,43 +1,39 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
overpass-api-ruby (0.
|
5
|
-
diskcached
|
4
|
+
overpass-api-ruby (0.2)
|
6
5
|
httpi (~> 2.4.0)
|
7
|
-
nokogiri
|
8
6
|
|
9
7
|
GEM
|
10
8
|
remote: https://rubygems.org/
|
11
9
|
specs:
|
12
|
-
coderay (1.1.
|
13
|
-
diff-lcs (1.
|
14
|
-
|
15
|
-
httpi (2.4.1)
|
10
|
+
coderay (1.1.1)
|
11
|
+
diff-lcs (1.3)
|
12
|
+
httpi (2.4.2)
|
16
13
|
rack
|
14
|
+
socksify
|
17
15
|
method_source (0.8.2)
|
18
|
-
|
19
|
-
nokogiri (1.6.6.2)
|
20
|
-
mini_portile (~> 0.6.0)
|
21
|
-
pry (0.10.1)
|
16
|
+
pry (0.10.4)
|
22
17
|
coderay (~> 1.1.0)
|
23
18
|
method_source (~> 0.8.1)
|
24
19
|
slop (~> 3.4)
|
25
|
-
rack (
|
26
|
-
rake (
|
27
|
-
rspec (3.
|
28
|
-
rspec-core (~> 3.
|
29
|
-
rspec-expectations (~> 3.
|
30
|
-
rspec-mocks (~> 3.
|
31
|
-
rspec-core (3.
|
32
|
-
rspec-support (~> 3.
|
33
|
-
rspec-expectations (3.
|
20
|
+
rack (2.0.3)
|
21
|
+
rake (12.0.0)
|
22
|
+
rspec (3.6.0)
|
23
|
+
rspec-core (~> 3.6.0)
|
24
|
+
rspec-expectations (~> 3.6.0)
|
25
|
+
rspec-mocks (~> 3.6.0)
|
26
|
+
rspec-core (3.6.0)
|
27
|
+
rspec-support (~> 3.6.0)
|
28
|
+
rspec-expectations (3.6.0)
|
34
29
|
diff-lcs (>= 1.2.0, < 2.0)
|
35
|
-
rspec-support (~> 3.
|
36
|
-
rspec-mocks (3.
|
30
|
+
rspec-support (~> 3.6.0)
|
31
|
+
rspec-mocks (3.6.0)
|
37
32
|
diff-lcs (>= 1.2.0, < 2.0)
|
38
|
-
rspec-support (~> 3.
|
39
|
-
rspec-support (3.
|
33
|
+
rspec-support (~> 3.6.0)
|
34
|
+
rspec-support (3.6.0)
|
40
35
|
slop (3.6.0)
|
36
|
+
socksify (1.7.1)
|
41
37
|
|
42
38
|
PLATFORMS
|
43
39
|
ruby
|
@@ -50,4 +46,4 @@ DEPENDENCIES
|
|
50
46
|
rspec (>= 3)
|
51
47
|
|
52
48
|
BUNDLED WITH
|
53
|
-
1.
|
49
|
+
1.13.6
|
data/README.md
CHANGED
@@ -1,7 +1,9 @@
|
|
1
1
|
Overpass API Ruby
|
2
2
|
=================
|
3
3
|
|
4
|
-
A Ruby wrapper for OpenStreetMap Overpass API.
|
4
|
+
A Ruby wrapper for OpenStreetMap Overpass API. Supports both QL and XML.
|
5
|
+
|
6
|
+
Note: Version 0.2 introduces breaking changes. Check the file CHANGELOG.md.
|
5
7
|
|
6
8
|
Install
|
7
9
|
-------
|
@@ -13,47 +15,65 @@ or add `gem 'overpass-api-ruby'` to your Gemfile
|
|
13
15
|
Usage
|
14
16
|
-----
|
15
17
|
|
18
|
+
Using XML:
|
19
|
+
|
16
20
|
```ruby
|
17
21
|
require 'overpass_api_ruby'
|
18
22
|
|
19
|
-
|
20
|
-
|
23
|
+
options={:bbox => {:s => -34.705448, :n => -34.526562,
|
24
|
+
:w => -58.531471, :e => -58.335159},
|
25
|
+
:timeout => 900,
|
26
|
+
:maxsize => 1073741824}
|
27
|
+
|
28
|
+
overpass = OverpassAPI::XML.new(options)
|
29
|
+
|
30
|
+
query = "<union><query type='relation'><has-kv k='route' v='subway'/></query>" <<
|
31
|
+
"</union><union><item/><recurse type='down'/></union>"
|
32
|
+
|
33
|
+
response = overpass.query(query)
|
34
|
+
```
|
35
|
+
|
36
|
+
Using QL:
|
37
|
+
|
38
|
+
```ruby
|
39
|
+
require 'overpass_api_ruby'
|
21
40
|
|
22
41
|
options={:bbox => {:s => -34.705448, :n => -34.526562,
|
23
42
|
:w => -58.531471, :e => -58.335159},
|
24
43
|
:timeout => 900,
|
25
|
-
:
|
26
|
-
:json => true}
|
44
|
+
:maxsize => 1073741824}
|
27
45
|
|
28
|
-
overpass = OverpassAPI.new(options)
|
29
|
-
|
46
|
+
overpass = OverpassAPI::QL.new(options)
|
47
|
+
|
48
|
+
query = "rel['route'='subway'];(._;>;);out body;"
|
49
|
+
|
50
|
+
response = overpass.query(query)
|
30
51
|
```
|
31
52
|
|
32
53
|
Options on instantiation
|
33
54
|
------------------------
|
34
55
|
```
|
35
56
|
bbox Hash. Global bounding box.
|
36
|
-
endpoint String.
|
57
|
+
endpoint String.
|
37
58
|
Defaults to http://overpass-api.de/api/interpreter
|
38
59
|
timeout Integer.
|
39
|
-
|
40
|
-
json Boolean. API response is in JSON format, so parse to hash
|
41
|
-
doesn't use the private parse_nokogiri method.
|
42
|
-
Default: false.
|
43
|
-
cache_expiration_time Integer. Default: 7200.
|
44
|
-
dont_use_cache Boolean. Default: false.
|
60
|
+
maxsize Integer.
|
45
61
|
```
|
46
62
|
See [Overpass API](http://wiki.openstreetmap.org/wiki/Overpass_API/Language_Guide)
|
47
63
|
|
48
64
|
Public methods
|
49
65
|
--------------
|
50
66
|
|
67
|
+
Both `QL` and `XML` classes have the same public methods:
|
68
|
+
|
51
69
|
```ruby
|
52
|
-
query (<String query>)
|
70
|
+
query (<String query>) Performs the query passed using the global values set on instantiation.
|
53
71
|
|
54
72
|
raw_query (<String query>) The whole query must be passed.
|
55
73
|
|
56
|
-
|
74
|
+
buid_query (<String query>) Returns a String containing the whole query.
|
75
|
+
|
76
|
+
bounding_box (s,n,w,e) Defines the global bounding box.
|
57
77
|
```
|
58
78
|
|
59
79
|
|
data/lib/base.rb
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'httpi'
|
2
|
+
require 'open-uri'
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
module OverpassAPI
|
6
|
+
VERSION='0.2'
|
7
|
+
|
8
|
+
class Base
|
9
|
+
DEFAULT_ENDPOINT='http://overpass-api.de/api/interpreter?data='
|
10
|
+
|
11
|
+
def initialize(args={})
|
12
|
+
bbox = args[:bbox]
|
13
|
+
bounding_box(bbox[:s],bbox[:n],bbox[:w],bbox[:e]) if bbox
|
14
|
+
|
15
|
+
@endpoint = args[:endpoint] || DEFAULT_ENDPOINT
|
16
|
+
@timeout = args[:timeout]
|
17
|
+
@maxsize = args[:maxsize]
|
18
|
+
end
|
19
|
+
|
20
|
+
def bounding_box(s,n,w,e)
|
21
|
+
@bbox = "#{s},#{w},#{n},#{e}"
|
22
|
+
end
|
23
|
+
|
24
|
+
def query(q)
|
25
|
+
perform build_query(q)
|
26
|
+
end
|
27
|
+
|
28
|
+
def raw_query(q)
|
29
|
+
perform q
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def perform(q)
|
35
|
+
url = URI::encode("#{@endpoint}#{q}")
|
36
|
+
r = HTTPI::Request.new(url)
|
37
|
+
JSON.parse(HTTPI.get(r).body, symbolize_names: true)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
data/lib/overpass_api_ruby.rb
CHANGED
@@ -1,92 +1,2 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require 'open-uri'
|
4
|
-
require 'json'
|
5
|
-
require 'nokogiri'
|
6
|
-
|
7
|
-
class OverpassAPI
|
8
|
-
VERSION='0.1.3'
|
9
|
-
DEFAULT_ENDPOINT='http://overpass-api.de/api/interpreter?data='
|
10
|
-
|
11
|
-
def initialize(args={})
|
12
|
-
bbox = args[:bbox]
|
13
|
-
bbox(bbox[:s],bbox[:n],bbox[:w],bbox[:e]) if bbox
|
14
|
-
|
15
|
-
cache_expiration_time = args[:cache_expiration_time] || 7200
|
16
|
-
@cache = Diskcached.new('/tmp/cache',cache_expiration_time,true)
|
17
|
-
|
18
|
-
@endpoint = args[:endpoint] || DEFAULT_ENDPOINT
|
19
|
-
@json = args[:json] ? "output='json'" : ''
|
20
|
-
@timeout = args[:timeout] ? "timeout='#{args[:timeout]}'" : ''
|
21
|
-
@element_limit = args[:element_limit] ? "element-limit='#{args[:element_limit]}'" : ''
|
22
|
-
@dont_use_cache = args[:dont_use_cache]
|
23
|
-
end
|
24
|
-
|
25
|
-
def bbox(s,n,w,e)
|
26
|
-
@bbox = "bbox='#{s},#{w},#{n},#{e}'"
|
27
|
-
end
|
28
|
-
|
29
|
-
def query(query)
|
30
|
-
return unless query
|
31
|
-
perform "<osm-script #{@bbox} #{@timeout} #{@element_limit} #{@json}>" <<
|
32
|
-
"#{query}<print/></osm-script>"
|
33
|
-
end
|
34
|
-
|
35
|
-
def raw_query(query)
|
36
|
-
return unless query
|
37
|
-
perform query
|
38
|
-
end
|
39
|
-
|
40
|
-
private
|
41
|
-
def request(url)
|
42
|
-
r = HTTPI::Request.new(url)
|
43
|
-
HTTPI.get(r).body
|
44
|
-
end
|
45
|
-
|
46
|
-
def perform(query)
|
47
|
-
url = URI::encode("#{@endpoint}#{query}")
|
48
|
-
data = if @dont_use_cache
|
49
|
-
request url
|
50
|
-
else
|
51
|
-
@cache.cache("overpass_api_ruby_#{query}") do
|
52
|
-
request url
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
return JSON.parse(data, :symbolize_names=> true)[:elements] unless @json.empty?
|
57
|
-
|
58
|
-
doc = Nokogiri::XML(data) do |config|
|
59
|
-
config.options = Nokogiri::XML::ParseOptions::NOBLANKS
|
60
|
-
end
|
61
|
-
|
62
|
-
raw = doc.children.first.children.select{|e| e.name != 'note' and e.name != 'meta'}
|
63
|
-
parse_nokogiri raw
|
64
|
-
end
|
65
|
-
|
66
|
-
def parse_nokogiri(xml)
|
67
|
-
xml.map {|e|
|
68
|
-
element = {:type => e.name}
|
69
|
-
|
70
|
-
e.attributes.each {|a|
|
71
|
-
element[a[1].name.to_sym] = a[1].value
|
72
|
-
}
|
73
|
-
|
74
|
-
members = e.children.select{|n| n.name != 'tag'}.map {|child|
|
75
|
-
key_values={:type => child.name }
|
76
|
-
child.attributes.each {|a|
|
77
|
-
key_values[a[1].name.to_sym] = a[1].value
|
78
|
-
}
|
79
|
-
key_values
|
80
|
-
}
|
81
|
-
element[:members] = members unless members.empty?
|
82
|
-
|
83
|
-
tags={}
|
84
|
-
e.children.select{|n| n.name == 'tag'}.each {|child|
|
85
|
-
tags[child.values.first] = child.values[1]
|
86
|
-
}
|
87
|
-
element[:tags] = tags unless tags.empty?
|
88
|
-
|
89
|
-
element
|
90
|
-
}
|
91
|
-
end
|
92
|
-
end
|
1
|
+
require_relative "xml"
|
2
|
+
require_relative "ql"
|
data/lib/ql.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
require_relative "base"
|
2
|
+
|
3
|
+
module OverpassAPI
|
4
|
+
class QL < Base
|
5
|
+
def build_query(q)
|
6
|
+
header = ""
|
7
|
+
header << "[bbox:#{@bbox}]" if @bbox
|
8
|
+
header << "[timeout:#{@timeout}]" if @timeout
|
9
|
+
header << "[maxsize:#{@maxsize}]" if @maxsize
|
10
|
+
|
11
|
+
header << "[out:json]"
|
12
|
+
|
13
|
+
"#{header};#{q}"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/lib/xml.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
require_relative 'base'
|
2
|
+
|
3
|
+
module OverpassAPI
|
4
|
+
class XML < Base
|
5
|
+
def build_query(q)
|
6
|
+
bbox = @bbox ? "bbox='#{@bbox}'" : ''
|
7
|
+
timeout = @timeout ? "timeout='#{@timeout}'" : ''
|
8
|
+
maxsize = @maxsize ? "maxsize='#{@maxsize}'" : ''
|
9
|
+
"<osm-script #{bbox} #{timeout} #{maxsize} output='json'>#{q}<print/></osm-script>"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
data/overpass-api-ruby.gemspec
CHANGED
@@ -9,7 +9,7 @@ Gem::Specification.new do |spec|
|
|
9
9
|
spec.authors = ["Bruno Salerno"]
|
10
10
|
spec.email = ["br.salerno@gmail.com"]
|
11
11
|
spec.description = %q{A Ruby wrapper for OpenStreetMap Overpass API}
|
12
|
-
spec.summary = %q{
|
12
|
+
spec.summary = %q{This gem will allow you to perform queries to OSM Overpass API using QL or XML}
|
13
13
|
spec.homepage = "https://github.com/BrunoSalerno/overpass-api-ruby"
|
14
14
|
spec.license = "MIT"
|
15
15
|
|
@@ -19,8 +19,6 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
21
|
spec.add_runtime_dependency "httpi", "~> 2.4.0"
|
22
|
-
spec.add_runtime_dependency "diskcached"
|
23
|
-
spec.add_runtime_dependency "nokogiri"
|
24
22
|
|
25
23
|
spec.add_development_dependency "bundler", "~> 1.3"
|
26
24
|
spec.add_development_dependency "rake"
|
@@ -2,18 +2,33 @@ require 'spec_helper'
|
|
2
2
|
require 'overpass_api_ruby'
|
3
3
|
|
4
4
|
describe OverpassAPI do
|
5
|
-
|
5
|
+
describe OverpassAPI::XML do
|
6
|
+
it "'s example works" do
|
7
|
+
options={:bbox => {:s => -34.705448, :n => -34.526562,
|
8
|
+
:w => -58.531471, :e => -58.335159},
|
9
|
+
:timeout => 900}
|
6
10
|
|
7
|
-
|
8
|
-
"</union><union><item/><recurse type='down'/></union>"
|
11
|
+
overpass = OverpassAPI::XML.new(options)
|
9
12
|
|
10
|
-
|
11
|
-
|
12
|
-
:timeout => 900,
|
13
|
-
:element_limit => 1,
|
14
|
-
:json => true}
|
13
|
+
ba_query = "<union><query type='relation'><has-kv k='route' v='subway'/></query>" <<
|
14
|
+
"</union><union><item/><recurse type='down'/></union>"
|
15
15
|
|
16
|
-
|
17
|
-
|
16
|
+
|
17
|
+
expect(overpass.query(ba_query)[:elements]).to be_a(Array)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe OverpassAPI::QL do
|
22
|
+
it "'s example works" do
|
23
|
+
options={:bbox => {:s => -34.705448, :n => -34.526562,
|
24
|
+
:w => -58.531471, :e => -58.335159},
|
25
|
+
:timeout => 900}
|
26
|
+
|
27
|
+
overpass = OverpassAPI::QL.new(options)
|
28
|
+
|
29
|
+
ba_query = "rel['route'='subway'];(._;>;);out body;"
|
30
|
+
|
31
|
+
expect(overpass.query(ba_query)[:elements]).to be_a(Array)
|
32
|
+
end
|
18
33
|
end
|
19
34
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: overpass-api-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: '0.2'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bruno Salerno
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-05-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: httpi
|
@@ -24,34 +24,6 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 2.4.0
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: diskcached
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - ">="
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '0'
|
34
|
-
type: :runtime
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - ">="
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '0'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: nokogiri
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - ">="
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '0'
|
48
|
-
type: :runtime
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - ">="
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '0'
|
55
27
|
- !ruby/object:Gem::Dependency
|
56
28
|
name: bundler
|
57
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -117,12 +89,16 @@ extra_rdoc_files: []
|
|
117
89
|
files:
|
118
90
|
- ".gitignore"
|
119
91
|
- ".rspec"
|
92
|
+
- CHANGELOG.md
|
120
93
|
- Gemfile
|
121
94
|
- Gemfile.lock
|
122
95
|
- LICENSE
|
123
96
|
- README.md
|
124
97
|
- Rakefile
|
98
|
+
- lib/base.rb
|
125
99
|
- lib/overpass_api_ruby.rb
|
100
|
+
- lib/ql.rb
|
101
|
+
- lib/xml.rb
|
126
102
|
- overpass-api-ruby.gemspec
|
127
103
|
- spec/overpass_api_ruby_spec.rb
|
128
104
|
- spec/spec_helper.rb
|
@@ -146,10 +122,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
146
122
|
version: '0'
|
147
123
|
requirements: []
|
148
124
|
rubyforge_project:
|
149
|
-
rubygems_version: 2.
|
125
|
+
rubygems_version: 2.5.1
|
150
126
|
signing_key:
|
151
127
|
specification_version: 4
|
152
|
-
summary:
|
128
|
+
summary: This gem will allow you to perform queries to OSM Overpass API using QL or
|
129
|
+
XML
|
153
130
|
test_files:
|
154
131
|
- spec/overpass_api_ruby_spec.rb
|
155
132
|
- spec/spec_helper.rb
|