geo_rb 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +6 -4
- data/geo_rb.gemspec +3 -2
- data/lib/geo_rb/distance.rb +24 -7
- data/lib/geo_rb/version.rb +1 -1
- data/spec/geo_rb/distance_spec.rb +25 -1
- data/spec/geo_rb/geo_coders/location_spec.rb +24 -0
- metadata +23 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d7ef6fbc41f5f8f01523388fd1475698f01ed4877fcf9d6b3fb98a14b3658145
|
4
|
+
data.tar.gz: 557ed9d56a9ca5cee2804685bcb656feb21a076456fc7807eb4fb39f1737e5b8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3e8ec814b6c58aea5c0249ec0fea828b1932a12519328dd21b799d917d105715df0208ee6a874af8d23c0ad7433bbba399c87d21b1d90205853c8e78657fd94f
|
7
|
+
data.tar.gz: 8f15cd64fd2a5bf8b2ca17f6c1bd824faf3548d173fb519ae94dcaede679c819231bfc68a884e18a728cd36169c4226d82d15d3b9c46ef4d3b2184ebba857e59
|
data/README.md
CHANGED
@@ -1,8 +1,5 @@
|
|
1
1
|
# geo_rb
|
2
2
|
|
3
|
-
[![Gem Version](http://img.shields.io/gem/v/geo_rb.svg)][gem]
|
4
|
-
[![Code Climate](https://codeclimate.com/github/kucho/geo_rb.svg)][codeclimate]
|
5
|
-
|
6
3
|
geo_rb makes it easy for Ruby developers to locate the coordinates of addresses, cities, countries, and landmarks across the globe using third-party geocoders.
|
7
4
|
|
8
5
|
It is heavily inspired by [geopy](https://github.com/geopy/geopy).
|
@@ -13,10 +10,15 @@ It is heavily inspired by [geopy](https://github.com/geopy/geopy).
|
|
13
10
|
|
14
11
|
## Usage
|
15
12
|
|
16
|
-
###
|
13
|
+
### Distance between two points
|
17
14
|
```ruby
|
18
15
|
plaza = GeoRb::Location.lookup("Plaza San Martin, Lima, Peru")
|
19
16
|
palacio = GeoRb::Location.lookup("Palacio de Justicia, Lima, Peru")
|
20
17
|
plaza.distance_to(palacio).km # => 0.6649563608870949
|
21
18
|
palacio.distance_to(plaza).km # => 0.6649563608870949
|
22
19
|
```
|
20
|
+
|
21
|
+
### Distance between multiple points
|
22
|
+
```ruby
|
23
|
+
|
24
|
+
```
|
data/geo_rb.gemspec
CHANGED
@@ -9,7 +9,7 @@ Gem::Specification.new do |spec|
|
|
9
9
|
spec.version = GeoRb::VERSION
|
10
10
|
spec.platform = Gem::Platform::RUBY
|
11
11
|
spec.summary = "Client for geolocation services"
|
12
|
-
spec.description = "geo_rb makes it easy for Ruby developers to locate the coordinates of addresses, cities, countries, and landmarks across the globe using third-party geocoders
|
12
|
+
spec.description = "geo_rb makes it easy for Ruby developers to locate the coordinates of addresses, cities, countries, and landmarks across the globe using third-party geocoders."
|
13
13
|
spec.authors = ["Victor Rodriguez"]
|
14
14
|
spec.email = "victor.rodriguez.guriz@gmail.com"
|
15
15
|
spec.license = "MIT"
|
@@ -22,7 +22,8 @@ Gem::Specification.new do |spec|
|
|
22
22
|
"changelog_uri" => "https://github.com/kucho/geo_rb/blob/master/CHANGELOG.md"
|
23
23
|
}
|
24
24
|
|
25
|
-
spec.add_runtime_dependency("
|
25
|
+
spec.add_runtime_dependency("concurrent-ruby", "~> 1.1.8")
|
26
|
+
spec.add_runtime_dependency("geodesic_wgs84", "~> 1.46.1")
|
26
27
|
|
27
28
|
spec.add_development_dependency("bundler", "~> 2.2")
|
28
29
|
spec.add_development_dependency("standardrb", "~> 1.0")
|
data/lib/geo_rb/distance.rb
CHANGED
@@ -1,22 +1,39 @@
|
|
1
|
-
require "
|
1
|
+
require "bigdecimal/util"
|
2
|
+
require "concurrent"
|
3
|
+
require "geodesic_wgs84"
|
4
|
+
|
2
5
|
|
3
6
|
module GeoRb
|
4
7
|
class Distance
|
5
8
|
EARTH_RADIUS = 6_371.0088
|
6
9
|
|
7
|
-
attr_reader :kilometers
|
10
|
+
attr_reader :kilometers, :meters
|
8
11
|
alias_method :km, :kilometers
|
12
|
+
alias_method :m, :meters
|
13
|
+
|
14
|
+
def self.between(*addresses, adapter: GeoRb::GeoCoders::Nominatim)
|
15
|
+
return new if addresses.size == 1
|
16
|
+
|
17
|
+
requests = addresses.map do |address|
|
18
|
+
Concurrent::Promises.future(address) { |a| adapter.new.geocode(a) }
|
19
|
+
end
|
20
|
+
|
21
|
+
locations = Concurrent::Promises.zip(*requests).value!
|
22
|
+
new(*locations)
|
23
|
+
end
|
9
24
|
|
10
25
|
def initialize(*locations)
|
11
|
-
|
12
|
-
|
13
|
-
|
26
|
+
GeoRb.logger.debug locations
|
27
|
+
@meters = case locations.size
|
28
|
+
when 0..1
|
29
|
+
0
|
14
30
|
else
|
15
31
|
locations.each_cons(2).reduce(0) do |distance, pair|
|
16
32
|
a, b = sanitize_location(pair.first), sanitize_location(pair.last)
|
17
33
|
distance + measure(a, b)
|
18
34
|
end
|
19
35
|
end
|
36
|
+
@kilometers = @meters.to_d / 1_000
|
20
37
|
end
|
21
38
|
|
22
39
|
def ensure_same_altitude(a, b)
|
@@ -25,8 +42,8 @@ module GeoRb
|
|
25
42
|
|
26
43
|
def measure(a, b)
|
27
44
|
ensure_same_altitude(a, b)
|
28
|
-
r =
|
29
|
-
r
|
45
|
+
r = Wgs84.new.distance(a.latitude, a.longitude, b.latitude, b.longitude).first
|
46
|
+
r.to_d
|
30
47
|
end
|
31
48
|
|
32
49
|
private
|
data/lib/geo_rb/version.rb
CHANGED
@@ -28,7 +28,31 @@ describe GeoRb::Distance do
|
|
28
28
|
context "when trip between poles" do
|
29
29
|
let(:locations) { [north_pole, south_pole] }
|
30
30
|
|
31
|
-
it { should be_within(
|
31
|
+
it { should be_within(13).of(earth_circumference / 2) }
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe ".between" do
|
36
|
+
subject { described_class.between(*locations).km }
|
37
|
+
|
38
|
+
context "with one valid address" do
|
39
|
+
let(:locations) { ["Jockey Plaza, Lima"] }
|
40
|
+
|
41
|
+
it { is_expected.to eq 0 }
|
42
|
+
end
|
43
|
+
|
44
|
+
context "with two valid addresses" do
|
45
|
+
let(:locations) { ["Plaza San Martin, Lima", "Palacio de Justicia, Lima"] }
|
46
|
+
|
47
|
+
it { is_expected.to eq 0.6650 }
|
48
|
+
end
|
49
|
+
|
50
|
+
context "with mixed addresses" do
|
51
|
+
let(:locations) { ["rhu9223u8r2f", "Palacio de Justicia, Lima"] }
|
52
|
+
|
53
|
+
it "fails" do
|
54
|
+
expect { subject }.to raise_error(GeoRb::LocationError)
|
55
|
+
end
|
32
56
|
end
|
33
57
|
end
|
34
58
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
describe GeoRb::Location do
|
2
|
+
describe ".lookup" do
|
3
|
+
context "with valid location" do
|
4
|
+
let(:plaza) { described_class.lookup("Plaza San Martin, Lima") }
|
5
|
+
|
6
|
+
it "has the expected points" do
|
7
|
+
expect(plaza.latitude).to eq(-12.05165965)
|
8
|
+
expect(plaza.longitude).to eq(-77.03460482707533)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "#distance_to" do
|
14
|
+
context "from valid location" do
|
15
|
+
let(:plaza) { described_class.lookup("Plaza San Martin, Lima, Peru") }
|
16
|
+
context "to valid destination" do
|
17
|
+
let(:palacio) { described_class.lookup("Palacio de Justicia, Lima, Peru") }
|
18
|
+
subject { plaza.distance_to(palacio).km }
|
19
|
+
|
20
|
+
it { is_expected.to eq 0.6650 }
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
metadata
CHANGED
@@ -1,29 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: geo_rb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Victor Rodriguez
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-04-
|
11
|
+
date: 2021-04-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: concurrent-ruby
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 1.1.8
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 1.1.8
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: geodesic_wgs84
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 1.46.1
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 1.46.1
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: bundler
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -67,8 +81,7 @@ dependencies:
|
|
67
81
|
- !ruby/object:Gem::Version
|
68
82
|
version: '3.10'
|
69
83
|
description: geo_rb makes it easy for Ruby developers to locate the coordinates of
|
70
|
-
addresses, cities, countries, and landmarks across the globe using third-party geocoders
|
71
|
-
and other data sources
|
84
|
+
addresses, cities, countries, and landmarks across the globe using third-party geocoders.
|
72
85
|
email: victor.rodriguez.guriz@gmail.com
|
73
86
|
executables: []
|
74
87
|
extensions: []
|
@@ -90,6 +103,7 @@ files:
|
|
90
103
|
- lib/geo_rb/point.rb
|
91
104
|
- lib/geo_rb/version.rb
|
92
105
|
- spec/geo_rb/distance_spec.rb
|
106
|
+
- spec/geo_rb/geo_coders/location_spec.rb
|
93
107
|
- spec/geo_rb/geo_coders/nominatim_spec.rb
|
94
108
|
- spec/spec_helper.rb
|
95
109
|
homepage: https://github.com/kucho/geo_rb
|
@@ -113,11 +127,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
113
127
|
- !ruby/object:Gem::Version
|
114
128
|
version: '0'
|
115
129
|
requirements: []
|
116
|
-
rubygems_version: 3.2.
|
130
|
+
rubygems_version: 3.2.15
|
117
131
|
signing_key:
|
118
132
|
specification_version: 4
|
119
133
|
summary: Client for geolocation services
|
120
134
|
test_files:
|
121
135
|
- spec/geo_rb/distance_spec.rb
|
136
|
+
- spec/geo_rb/geo_coders/location_spec.rb
|
122
137
|
- spec/geo_rb/geo_coders/nominatim_spec.rb
|
123
138
|
- spec/spec_helper.rb
|