geospatial 1.7.0 → 1.8.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7e053b1210f1e0fa945a2e07de86aa8c211cf77e792298c849f209a73e7a34c1
4
- data.tar.gz: bcb46dc6b66f6b532a95006ee1013df86833492bc8486bdbde7ff7c4ac088639
3
+ metadata.gz: 110738e0a022fbd6b133c9d9e28b12e0bcb695c7ab7649cf17d654e634172489
4
+ data.tar.gz: 9b95095906672c0e8e7cc1db514ef60ef3382bf26c64a6b3197d767a38582715
5
5
  SHA512:
6
- metadata.gz: ed146165687208fde777a2ef91bd523b8a1a6ab8f9c4a3691828708c08aa4e450be46b639a0c8ac1b668b131db15c87901b4739bc50d9cd66c69bdf7e80f6aec
7
- data.tar.gz: 9c7f1051fd9f06cb87281ba32b89e8cddedbb64e735817d777220a96690ba90aae4a4ea0d851a0f86407a5a2f2e3d7ebb2d65d3cb9aadc166e62933cd927b378
6
+ metadata.gz: 347668d651ee545201053b43be845dd9812e54cf1921125decd7aa6875423a9fb3bd8493c0187c8d77d2e85e9e720f9f8b503176bf7e584d277b99cb973c870c
7
+ data.tar.gz: 19228fff1b436087f3ce92a64b753b2a2338040d40f13c919b2d2a2d0d4f69f7428aca95ffb48ade10615c77439bc78714affa9141ee03e8d77796764139fd92
@@ -1,18 +1,13 @@
1
1
  language: ruby
2
- sudo: false
3
- dist: trusty
4
2
  cache: bundler
5
3
  rvm:
6
- - 2.0
7
- - 2.1
8
- - 2.2
9
4
  - 2.3
10
5
  - 2.4
6
+ - 2.5
7
+ - 2.6
11
8
  - jruby-head
12
9
  - ruby-head
13
- - rbx-3
14
10
  matrix:
15
11
  allow_failures:
16
12
  - rvm: ruby-head
17
13
  - rvm: jruby-head
18
- - rvm: rbx-3
@@ -23,6 +23,10 @@ require 'matrix'
23
23
  module Geospatial
24
24
  # An integral dimension which maps a continuous space into an integral space. The scale is the maximum integral unit.
25
25
  class Dimension
26
+ def self.map(min, max, steps)
27
+ self.new(min, max-min, steps)
28
+ end
29
+
26
30
  def initialize(origin, size, scale = 1.0)
27
31
  @origin = origin
28
32
  @size = size
@@ -23,8 +23,16 @@ module Geospatial
23
23
  attr :offset
24
24
  attr :scale
25
25
 
26
+ def map(value)
27
+ ((value - @min) / @scale)
28
+ end
29
+
30
+ def unmap(index)
31
+ @min + ((index + 0.5) * @scale)
32
+ end
33
+
26
34
  def add(value, amount = 1)
27
- index = ((value - @min) / @scale).floor
35
+ index = map(value).floor
28
36
 
29
37
  if @bins[index]
30
38
  @bins[index] += amount
@@ -35,23 +43,23 @@ module Geospatial
35
43
  return self
36
44
  end
37
45
 
38
- def peaks
39
- @bins.each_with_index
40
- end
41
-
42
- def offset(index)
43
- @min + (index * @scale)
44
- end
45
-
46
46
  def inspect
47
47
  buffer = String.new("\#<#{self.class}")
48
48
 
49
49
  @bins.each_with_index do |bin, index|
50
- buffer << "\n#{offset(index).to_s.rjust(8)}: #{bin}"
50
+ buffer << "\n#{unmap(index).to_s.rjust(8)}: #{bin}"
51
51
  end
52
52
 
53
53
  buffer << "\n>"
54
54
  end
55
+
56
+ def each
57
+ return to_enum unless block_given?
58
+
59
+ @bins.each_with_index do |value, index|
60
+ yield unmap(index), value
61
+ end
62
+ end
55
63
  end
56
64
 
57
65
  class RadialHistogram < Histogram
@@ -65,5 +73,4 @@ module Geospatial
65
73
  super(point.bearing_from(@center), value)
66
74
  end
67
75
  end
68
-
69
76
  end
@@ -28,7 +28,8 @@ module Geospatial
28
28
  # WGS 84 semi-minor axis constant in meters
29
29
  WGS84_B = 6356752.3
30
30
 
31
- EARTH_RADIUS = (WGS84_A + WGS84_B) / 2.0
31
+ # Earth Radius
32
+ R = (WGS84_A + WGS84_B) / 2.0
32
33
 
33
34
  # WGS 84 eccentricity
34
35
  WGS84_E = 8.1819190842622e-2
@@ -82,6 +83,10 @@ module Geospatial
82
83
  [@longitude, @latitude]
83
84
  end
84
85
 
86
+ def to_ary
87
+ to_a
88
+ end
89
+
85
90
  def to_s
86
91
  "#{self.class}[#{self.longitude.to_f}, #{self.latitude.to_f}]"
87
92
  end
@@ -92,7 +97,7 @@ module Geospatial
92
97
  attr :latitude # -90 -> 90 (equivalent to y)
93
98
 
94
99
  # http://janmatuschek.de/LatitudeLongitudeBoundingCoordinates
95
- def bounding_box(distance, radius = EARTH_RADIUS)
100
+ def bounding_box(distance, radius = R)
96
101
  raise ArgumentError.new("Invalid distance or radius") if distance < 0 or radius < 0
97
102
 
98
103
  # angular distance in radians on a great circle
@@ -153,7 +158,7 @@ module Geospatial
153
158
 
154
159
  a = Math::sin(dlat/2) ** 2 + Math::cos(rlat1) * Math::cos(rlat2) * Math::sin(dlon/2) ** 2
155
160
  c = 2 * Math::atan2(Math::sqrt(a), Math::sqrt(1-a))
156
- d = EARTH_RADIUS * c
161
+ d = R * c
157
162
 
158
163
  return d
159
164
  end
@@ -170,6 +175,17 @@ module Geospatial
170
175
  ) * R2D
171
176
  end
172
177
 
178
+ def location_by(bearing, distance)
179
+ lon1 = self.longitude * D2R
180
+ lat1 = self.latitude * D2R
181
+
182
+ lat2 = Math::asin(Math::sin(lat1)*Math::cos(distance/R) + Math::cos(lat1)*Math::sin(distance/R)*Math::cos(bearing * D2R))
183
+
184
+ lon2 = lon1 + Math::atan2(Math::sin(bearing * D2R)*Math::sin(distance/R)*Math::cos(lat1), Math::cos(distance/R)-Math::sin(lat1)*Math::sin(lat2))
185
+
186
+ return self.class.new(lon2 * R2D, lat2 * R2D)
187
+ end
188
+
173
189
  def - other
174
190
  Distance.new(self.distance_from(other))
175
191
  end
@@ -0,0 +1,68 @@
1
+ # Copyright, 2018, by Samuel G. D. Williams. <http://www.codeotaku.com>
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ # of this software and associated documentation files (the "Software"), to deal
5
+ # in the Software without restriction, including without limitation the rights
6
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ # copies of the Software, and to permit persons to whom the Software is
8
+ # furnished to do so, subject to the following conditions:
9
+ #
10
+ # The above copyright notice and this permission notice shall be included in
11
+ # all copies or substantial portions of the Software.
12
+ #
13
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ # THE SOFTWARE.
20
+
21
+ require_relative 'box'
22
+
23
+ module Geospatial
24
+ class Tiles
25
+ # Radians to degrees multiplier
26
+ R2D = (180.0 / Math::PI)
27
+ D2R = (Math::PI / 180.0)
28
+
29
+ def initialize(box, zoom = 5)
30
+ @box = box
31
+ @zoom = zoom
32
+ end
33
+
34
+ attr :box
35
+ attr :zoom
36
+
37
+ def map(longitude, latitude, zoom = @zoom)
38
+ n = 2 ** zoom
39
+
40
+ x = n * ((longitude + 180.0) / 360.0)
41
+ y = n * (1.0 - (Math::log(Math::tan(latitude * D2R) + (1.0 / Math::cos(latitude * D2R))) / Math::PI)) / 2.0
42
+
43
+ return x, y
44
+ end
45
+
46
+ def unmap(x, y, zoom = @zoom)
47
+ n = 2 ** zoom
48
+ longitude = x / n * 360.0 - 180.0
49
+ latitude = Math::arctan(Math::sinh(Math::PI * (1.0 - 2.0 * y / n))) * R2D
50
+
51
+ return longitude, latitude
52
+ end
53
+
54
+ def each(zoom = @zoom)
55
+ return to_enum(:each, zoom) unless block_given?
56
+
57
+ min = map(*@box.min, zoom)
58
+ max = map(*@box.max, zoom)
59
+
60
+ (min[0].floor...max[0].ceil).each do |x|
61
+ # The y axis is reversed... (i.e. the origin is in the top left)
62
+ (max[1].floor...min[1].ceil).each do |y|
63
+ yield zoom, x, y
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
@@ -19,5 +19,5 @@
19
19
  # THE SOFTWARE.
20
20
 
21
21
  module Geospatial
22
- VERSION = "1.7.0"
22
+ VERSION = "1.8.0"
23
23
  end
@@ -0,0 +1,31 @@
1
+ # Copyright, 2018, by Samuel G. D. Williams. <http://www.codeotaku.com>
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ # of this software and associated documentation files (the "Software"), to deal
5
+ # in the Software without restriction, including without limitation the rights
6
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ # copies of the Software, and to permit persons to whom the Software is
8
+ # furnished to do so, subject to the following conditions:
9
+ #
10
+ # The above copyright notice and this permission notice shall be included in
11
+ # all copies or substantial portions of the Software.
12
+ #
13
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ # THE SOFTWARE.
20
+
21
+ require 'geospatial/tiles'
22
+
23
+ RSpec.describe Geospatial::Tiles do
24
+ let(:box) {Geospatial::Box.from_bounds(Vector[172.0,-44.0], Vector[173.5,-43.0])}
25
+
26
+ subject {described_class.new(box)}
27
+
28
+ it "should enumerate tiles" do
29
+ expect(subject.each.to_a).to be == [[5, 31, 20]]
30
+ end
31
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: geospatial
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.7.0
4
+ version: 1.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-11-07 00:00:00.000000000 Z
11
+ date: 2018-11-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -83,6 +83,7 @@ files:
83
83
  - lib/geospatial/map.rb
84
84
  - lib/geospatial/map/index.rb
85
85
  - lib/geospatial/polygon.rb
86
+ - lib/geospatial/tiles.rb
86
87
  - lib/geospatial/version.rb
87
88
  - spec/geospatial/box_spec.rb
88
89
  - spec/geospatial/circle_spec.rb
@@ -97,6 +98,7 @@ files:
97
98
  - spec/geospatial/map_spec.rb
98
99
  - spec/geospatial/polygon_spec.rb
99
100
  - spec/geospatial/sorted.rb
101
+ - spec/geospatial/tiles_spec.rb
100
102
  - spec/geospatial/visualization.rb
101
103
  - spec/geospatial/world.png
102
104
  - spec/spec_helper.rb
@@ -138,6 +140,7 @@ test_files:
138
140
  - spec/geospatial/map_spec.rb
139
141
  - spec/geospatial/polygon_spec.rb
140
142
  - spec/geospatial/sorted.rb
143
+ - spec/geospatial/tiles_spec.rb
141
144
  - spec/geospatial/visualization.rb
142
145
  - spec/geospatial/world.png
143
146
  - spec/spec_helper.rb