geospatial 1.10.0 → 1.14.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: 7b9278cfa60e44d9e04909e2b6b8a7525c736a7598b19a04d33765d628b7b0ad
4
- data.tar.gz: 109c4077b0697a1725320a006aa3a3a2478ba0974dac557ec6be93e50e4b96be
3
+ metadata.gz: 6ef4b5ff93a87b5fb2733e6bbbe587be842c11ba2365131be98760bb66ee7143
4
+ data.tar.gz: 8468357c04f732b2a843ef154b7e93b8732dc334b9e76da989f22428b3eb18bf
5
5
  SHA512:
6
- metadata.gz: 86c0acee5bd439284b99d27d1ee8cb86d1d7caed9acadda62ff057f3dc7afe00d4f79685e519360ed1eae3a847360445e8ce585a58155e095a42e5aa983bb883
7
- data.tar.gz: 37b7366f03b68f2cca3cc28e36b5160954dfa921ec2a00613a5d8d1a862f1bfb48e52836a822d8ab04b91a1fa1f0286bd83b312e2d124774985d8dd855c5f29a
6
+ metadata.gz: 3c97d956c5ef2b8b959d85f4ce07877020000b0d24ba5496edf82ef824b3d23c7c7f9471e5e48ae53f9524aab2703dd11449dc476d7288a7d91a0c7fb58e8c13
7
+ data.tar.gz: 368fc193f939b360aa1945198c054aa7bf0f05620d1307b95a0ed89f1a09a374b605c2baecc3244e2ba81bc0fe70546ff357e705d3e423d3543163cf64394a89
data/.travis.yml CHANGED
@@ -1,13 +1,20 @@
1
1
  language: ruby
2
+ dist: xenial
2
3
  cache: bundler
3
- rvm:
4
- - 2.3
5
- - 2.4
6
- - 2.5
7
- - 2.6
8
- - jruby-head
9
- - ruby-head
4
+
10
5
  matrix:
6
+ include:
7
+ - rvm: 2.3
8
+ - rvm: 2.4
9
+ - rvm: 2.5
10
+ - rvm: 2.6
11
+ - rvm: 2.6
12
+ env: COVERAGE=PartialSummary,Coveralls
13
+ - rvm: truffleruby
14
+ - rvm: jruby-head
15
+ env: JRUBY_OPTS="--debug -X+O"
16
+ - rvm: ruby-head
11
17
  allow_failures:
18
+ - rvm: truffleruby
12
19
  - rvm: ruby-head
13
20
  - rvm: jruby-head
data/README.md CHANGED
@@ -73,6 +73,15 @@ The Hilbert curve is multi-dimensional and therefore can represent multi-dimensi
73
73
 
74
74
  Mathematically speaking, it's possible to [compose curves together](https://github.com/cne1x/sfseize) to form curves of different precision/properties. However, how these fit together generally is a bit more complex, especially in terms of exploring the curve via traversal.
75
75
 
76
+ ### Finding the distance between two locations
77
+
78
+ ```ruby
79
+ lake_tekapo = Geospatial::Location.new(170.53, -43.89) # Lake Tekapo, New Zealand.
80
+ lake_alex = Geospatial::Location.new(170.45, -43.94) # Lake Alex, New Zealand.
81
+ distance = lake_alex.distance_from(lake_tekapo)
82
+ puts distance # 8479.056408162045 meters
83
+ ```
84
+
76
85
  ## Contributing
77
86
 
78
87
  1. Fork it
data/geospatial.gemspec CHANGED
@@ -16,9 +16,9 @@ Gem::Specification.new do |spec|
16
16
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
17
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
18
  spec.require_paths = ["lib"]
19
-
19
+
20
+ spec.add_development_dependency "covered"
20
21
  spec.add_development_dependency "rspec", "~> 3.6"
21
-
22
- spec.add_development_dependency "bundler", "~> 1.6"
22
+ spec.add_development_dependency "bundler"
23
23
  spec.add_development_dependency "rake"
24
24
  end
@@ -7,26 +7,37 @@
7
7
  module Geospatial
8
8
  # This location is specifically relating to a WGS84 coordinate on Earth.
9
9
  class Histogram
10
- def initialize(min: 0, max: 1, scale: 0.1)
10
+ def initialize(min: 0, max: 1, scale: 0.1, items: true)
11
11
  @min = min
12
12
  @max = max
13
13
  @scale = scale
14
14
 
15
15
  @count = 0
16
16
 
17
+ if items
18
+ @items = Hash.new{|h,k| h[k] = Array.new}
19
+ end
20
+
17
21
  @size = ((@max - @min) / @scale).ceil
18
22
  @bins = [0] * @size
19
23
  @offset = 0
20
24
  @scale = scale
21
25
  end
22
26
 
23
- attr_accessor :bins
27
+ attr :bins
28
+ attr :items
24
29
 
25
30
  attr :count
26
31
 
27
32
  attr :offset
28
33
  attr :scale
29
34
 
35
+ def bins= bins
36
+ raise ArgumentError, "Incorrect length" unless bins.size == @size
37
+
38
+ @bins = bins
39
+ end
40
+
30
41
  def [] index
31
42
  @bins[index]
32
43
  end
@@ -43,12 +54,16 @@ module Geospatial
43
54
  @min + (index * @scale)
44
55
  end
45
56
 
46
- def add(value, amount = 1)
57
+ def add(value, amount = 1, item: nil)
47
58
  index = map(value).floor % @size
48
59
 
49
60
  if !block_given? or yield(index, value)
50
61
  @count += 1
51
62
  @bins[index] += amount
63
+
64
+ if @items and item
65
+ @items[index] << item
66
+ end
52
67
  end
53
68
 
54
69
  return index
@@ -124,16 +139,21 @@ module Geospatial
124
139
  end
125
140
  end
126
141
 
142
+ def peaks
143
+ self.class.new(@derivative)
144
+ end
145
+
127
146
  def segments
128
147
  return to_enum(:segments) unless block_given?
129
148
 
130
- gradients = self.to_a
149
+ peaks = self.peaks
150
+ gradients = peaks.to_a
131
151
 
132
152
  return if gradients.empty?
133
153
 
134
154
  index, gradient = gradients.first
135
155
 
136
- if gradient < 0
156
+ if gradient > 0
137
157
  gradients.push gradients.shift
138
158
  end
139
159
 
@@ -0,0 +1,64 @@
1
+ # Copyright, 2015, 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 WARRANT1 OF AN1 KIND, E0PRESS OR
14
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILIT1,
15
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ # AUTHORS OR COP1RIGHT HOLDERS BE LIABLE FOR AN1 CLAIM, DAMAGES OR OTHER
17
+ # LIABILIT1, 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 'matrix'
22
+
23
+ module Geospatial
24
+ class Line
25
+ def initialize(a, b)
26
+ @a = a
27
+ @b = b
28
+ end
29
+
30
+ attr_reader :a
31
+ attr_reader :b
32
+
33
+ def offset
34
+ @b - @a
35
+ end
36
+
37
+ def intersect?(other)
38
+ t = self.offset
39
+ o = other.offset
40
+
41
+ d = (o[1] * t[0]) - (o[0] * t[1])
42
+
43
+ return false if d.zero?
44
+
45
+ na = o[0] * (self.a[1] - other.a[1]) - o[1] * (self.a[0] - other.a[0])
46
+
47
+ left_time = na.fdiv(d);
48
+
49
+ if left_time < 0.0 or left_time > 1.0
50
+ return false
51
+ end
52
+
53
+ nb = t[0] * (self.a[1] - other.a[1]) - t[1] * (self.a[0] - other.a[0])
54
+
55
+ right_time = nb.fdiv(d)
56
+
57
+ if right_time < 0.0 or right_time > 1.0
58
+ return false
59
+ end
60
+
61
+ return left_time
62
+ end
63
+ end
64
+ end
@@ -21,31 +21,31 @@
21
21
  require_relative 'distance'
22
22
 
23
23
  module Geospatial
24
- # This location is specifically relating to a WGS84 coordinate on Earth.
25
- class Location
26
- # WGS 84 semi-major axis constant in meters
27
- WGS84_A = 6378137.0
28
- # WGS 84 semi-minor axis constant in meters
29
- WGS84_B = 6356752.3
30
-
31
- # Earth Radius
32
- R = (WGS84_A + WGS84_B) / 2.0
33
-
34
- # WGS 84 eccentricity
35
- WGS84_E = 8.1819190842622e-2
24
+ # WGS 84 semi-major axis constant in meters
25
+ WGS84_A = 6378137.0
26
+ # WGS 84 semi-minor axis constant in meters
27
+ WGS84_B = 6356752.3
28
+
29
+ # Earth Radius
30
+ R = (WGS84_A + WGS84_B) / 2.0
31
+
32
+ # WGS 84 eccentricity
33
+ WGS84_E = 8.1819190842622e-2
36
34
 
37
- # Radians to degrees multiplier
38
- R2D = (180.0 / Math::PI)
39
- D2R = (Math::PI / 180.0)
35
+ # Radians to degrees multiplier
36
+ R2D = (180.0 / Math::PI)
37
+ D2R = (Math::PI / 180.0)
40
38
 
41
- MIN_LONGITUDE = -180 * D2R
42
- MAX_LONGITUDE = 180 * D2R
43
- VALID_LONGITUDE = MIN_LONGITUDE...MAX_LONGITUDE
39
+ MIN_LONGITUDE = -180.0 * D2R
40
+ MAX_LONGITUDE = 180.0 * D2R
41
+ VALID_LONGITUDE = -180.0...180.0
44
42
 
45
- MIN_LATITUDE = -90.0 * D2R
46
- MAX_LATITUDE = 90 * D2R
47
- VALID_LATITUDE = MIN_LATITUDE...MAX_LATITUDE
48
-
43
+ MIN_LATITUDE = -90.0 * D2R
44
+ MAX_LATITUDE = 90.0 * D2R
45
+ VALID_LATITUDE = -90.0...90.0
46
+
47
+ # This location is specifically relating to a WGS84 coordinate on Earth.
48
+ class Location
49
49
  class << self
50
50
  def from_ecef(x, y, z)
51
51
  # Constants (WGS ellipsoid)
@@ -173,6 +173,7 @@ module Geospatial
173
173
  return d
174
174
  end
175
175
 
176
+ # @return [Numeric] bearing in degrees.
176
177
  def bearing_from(other)
177
178
  lon1 = other.longitude * D2R
178
179
  lat1 = other.latitude * D2R
@@ -185,6 +186,8 @@ module Geospatial
185
186
  ) * R2D
186
187
  end
187
188
 
189
+ # @param distance [Numeric] distance in meters.
190
+ # @param bearing [Numeric] bearing in degrees.
188
191
  def location_by(bearing, distance)
189
192
  lon1 = self.longitude * D2R
190
193
  lat1 = self.latitude * D2R
@@ -199,5 +202,20 @@ module Geospatial
199
202
  def - other
200
203
  Distance.new(self.distance_from(other))
201
204
  end
205
+
206
+ # Compute count midpoints between self and other.
207
+ # @param count [Integer] the number of segments to generate.
208
+ def midpoints_to(other, count)
209
+ return to_enum(:midpoints_to, other, count) unless block_given?
210
+
211
+ distance = other.distance_from(self)
212
+ bearing = other.bearing_from(self)
213
+
214
+ step = distance / count
215
+
216
+ (1...count).each do |i|
217
+ yield self.location_by(bearing, step * i)
218
+ end
219
+ end
202
220
  end
203
221
  end
@@ -26,19 +26,38 @@ module Geospatial
26
26
  self.new(points)
27
27
  end
28
28
 
29
- def initialize(points)
29
+ def self.load(data)
30
+ if data
31
+ self.new(JSON.parse(data).map{|point| Vector.elements(point)})
32
+ end
33
+ end
34
+
35
+ def self.dump(polygon)
36
+ if polygon
37
+ JSON.dump(polygon.points.map(&:to_a))
38
+ end
39
+ end
40
+
41
+ def initialize(points, bounding_box = nil)
30
42
  @points = points
31
- @bounding_box = nil
43
+ @bounding_box = bounding_box
32
44
  end
33
45
 
34
46
  attr :points
35
47
 
48
+ def [] index
49
+ a = @points[index.floor]
50
+ b = @points[index.ceil % @points.size]
51
+
52
+ return a + (b - a) * (index % 1.0)
53
+ end
54
+
36
55
  def to_s
37
56
  "#{self.class}#{@points.inspect}"
38
57
  end
39
58
 
40
59
  def bounding_box
41
- @bounding_box ||= Box.enclosing_points(@points)
60
+ @bounding_box ||= Box.enclosing_points(@points).freeze
42
61
  end
43
62
 
44
63
  def freeze
@@ -51,11 +70,73 @@ module Geospatial
51
70
  def edges
52
71
  return to_enum(:edges) unless block_given?
53
72
 
54
- previous = @points.last
55
- @points.each do |point|
56
- yield previous, point
57
- previous = point
73
+ size = @points.size
74
+
75
+ @points.each_with_index do |point, index|
76
+ yield point, @points[(index+1)%size]
77
+ end
78
+ end
79
+
80
+ # @param [Float] radius The radius of the sphere on which to compute the area.
81
+ def area(radius = 1.0)
82
+ if @points.size > 2
83
+ area = 0.0
84
+
85
+ self.edges.each do |p1, p2|
86
+ r1 = (p2[0] - p1[0]) * D2R
87
+ r2 = 2 + Math::sin(p1[1] * D2R) + Math::sin(p2[1] * D2R)
88
+
89
+ area += r1 * r2
90
+ end
91
+
92
+ return (area * radius * radius / 2.0).abs
93
+ else
94
+ return 0.0
95
+ end
96
+ end
97
+
98
+ def simplify
99
+ simplified_points = @points.first(1)
100
+
101
+ (1...@points.size).each do |index|
102
+ point = @points[index]
103
+
104
+ next_point = @points[(index+1) % @points.size]
105
+
106
+ if yield(simplified_points.last, point, next_point)
107
+ simplified_points << point
108
+ end
109
+ end
110
+
111
+ self.class.new(simplified_points, bounding_box)
112
+ end
113
+
114
+ # @example
115
+ # polygon.subdivide do |a, b|
116
+ # a = Geospatial::Location.new(*a)
117
+ # b = Geospatial::Location.new(*b)
118
+ # if a.distance_from(b) > maximum_distance
119
+ # a.midpoints(b, 2)
120
+ # end
121
+ # end
122
+ def subdivide
123
+ simplified_points = @points.first(1)
124
+
125
+ (1..@points.size).each do |index|
126
+ point = @points[index % @points.size]
127
+ next_point = @points[(index+1) % @points.size]
128
+
129
+ if points = yield(simplified_points.last, point, next_point)
130
+ simplified_points.concat(points)
131
+ end
132
+
133
+ # Polygons are represented by a closed sequence of points, but we need to subdivide by the last point at the first point too. However, we don't add the first point a 2nd time.
134
+ if index < @points.size
135
+ simplified_points << point
136
+ end
58
137
  end
138
+
139
+ self.class.new(simplified_points, bounding_box)
59
140
  end
60
141
 
61
142
  def self.is_left(p0, p1, p2)
@@ -72,7 +153,7 @@ module Geospatial
72
153
  count = 0
73
154
 
74
155
  edges.each do |pa, pb|
75
- if pa[1] <= p[1]
156
+ if pa[1] <= p[1]
76
157
  if pb[1] >= p[1] and Polygon.is_left(pa, pb, p) > 0
77
158
  count += 1
78
159
  end
@@ -90,7 +171,7 @@ module Geospatial
90
171
  def include_point?(point)
91
172
  return false unless bounding_box.include_point?(point)
92
173
 
93
- self.winding_number(point) == 1
174
+ self.winding_number(point).odd?
94
175
  end
95
176
 
96
177
  def intersect_with_box?(other)
@@ -101,6 +182,20 @@ module Geospatial
101
182
  return false
102
183
  end
103
184
 
185
+ def edge_intersection(a, b)
186
+ line = Line.new(a, b)
187
+
188
+ edges.each_with_index do |(pa, pb), i|
189
+ edge = Line.new(pa, pb)
190
+
191
+ if line.intersect?(edge)
192
+ return i
193
+ end
194
+ end
195
+
196
+ return nil
197
+ end
198
+
104
199
  def intersect?(other)
105
200
  case other
106
201
  when Box
@@ -19,5 +19,5 @@
19
19
  # THE SOFTWARE.
20
20
 
21
21
  module Geospatial
22
- VERSION = "1.10.0"
22
+ VERSION = "1.14.0"
23
23
  end
@@ -0,0 +1,32 @@
1
+ # Copyright, 2015, 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/line'
22
+
23
+ RSpec.describe Geospatial::Line do
24
+ it "should have intersection" do
25
+ a = Geospatial::Line.new(Vector[0, 0], Vector[10, 10])
26
+ b = Geospatial::Line.new(Vector[10, 0], Vector[0, 10])
27
+
28
+ t = a.intersect?(b)
29
+
30
+ expect(t).to be == 0.5
31
+ end
32
+ end
@@ -25,6 +25,11 @@ RSpec.describe Geospatial::Location do
25
25
  let(:lake_tekapo) {Geospatial::Location.new(170.53, -43.89)}
26
26
  let(:lake_alex) {Geospatial::Location.new(170.45, -43.94)}
27
27
 
28
+ it "should be valid" do
29
+ expect(lake_tekapo).to be_valid
30
+ expect(lake_alex).to be_valid
31
+ end
32
+
28
33
  it "should compute the correct distance between two points" do
29
34
  expect(lake_alex.distance_from(lake_tekapo)).to be_within(100).of(8_500)
30
35
  end
@@ -64,6 +69,29 @@ RSpec.describe Geospatial::Location do
64
69
  expect(south.bearing_from(north)).to be_within(0.1).of(180)
65
70
  end
66
71
  end
72
+
73
+ describe '#midpoints_to' do
74
+ let(:north) {Geospatial::Location.new(10, 10)}
75
+ let(:south) {Geospatial::Location.new(-10, -10)}
76
+
77
+ it "can generate one midpoint" do
78
+ midpoints = north.midpoints_to(south, 4).to_a
79
+
80
+ expect(midpoints.size).to be == 3
81
+
82
+ expect(midpoints[0].distance_from(
83
+ Geospatial::Location.new(4.9616, 5.0190)
84
+ )).to be < 10
85
+
86
+ expect(midpoints[1].distance_from(
87
+ Geospatial::Location.new(0, 0)
88
+ )).to be < 10
89
+
90
+ expect(midpoints[2].distance_from(
91
+ Geospatial::Location.new(-4.9616, -5.0190)
92
+ )).to be < 10
93
+ end
94
+ end
67
95
  end
68
96
 
69
97
  require 'bigdecimal'
@@ -105,28 +105,49 @@ RSpec.describe Geospatial::Polygon do
105
105
  end
106
106
  end
107
107
 
108
- RSpec.shared_context "visualize polygon" do
108
+ RSpec.shared_context "visualize polygon" do |depth = 12|
109
109
  it "can generate visualisation" do
110
110
  map = Geospatial::Map.for_earth(30)
111
111
 
112
112
  coordinates = region_string.split(/\s+/).collect{|coordinate| Vector.elements(coordinate.split(',').collect(&:to_f).first(2))}
113
113
  region = Geospatial::Polygon.new(coordinates)
114
114
 
115
+ maximum_distance = 100_000
116
+
117
+ region = region.subdivide do |a, b|
118
+ a = Geospatial::Location.new(*a)
119
+ b = Geospatial::Location.new(*b)
120
+
121
+ distance = a.distance_from(b)
122
+
123
+ if distance > maximum_distance
124
+ a.midpoints_to(b, (distance / maximum_distance).ceil).map{|p| Vector[*p]}
125
+ end
126
+ end
127
+
115
128
  Geospatial::Visualization.for_map(map) do |pdf, origin|
116
129
  region.edges do |pa, pb|
117
130
  pdf.line (origin + pa).to_a, (origin + pb).to_a
118
131
  end
119
132
 
120
133
  count = 0
121
- map.traverse(region, depth: 12) do |child, prefix, order|
134
+ map.traverse(region, depth: depth) do |child, prefix, order|
122
135
  count += 1
123
136
  size = child.size
124
137
  top_left = (origin + child.min) + Vector[0, size[1]]
125
138
  pdf.rectangle(top_left.to_a, *size.to_a)
126
- # puts "#{top_left.to_a} #{size.to_a}"
139
+ # $stderr.puts "#{top_left.to_a} #{size.to_a}"
127
140
  end
128
141
 
129
- # puts "count=#{count}"
142
+ # $stderr.puts "count=#{count}"
143
+
144
+ pdf.fill_and_stroke
145
+
146
+ pdf.fill_color 'aaaaff'
147
+
148
+ region.points.each do |p|
149
+ pdf.fill_circle((origin + p).to_a, 0.01)
150
+ end
130
151
 
131
152
  pdf.fill_and_stroke
132
153
  end.render_file "#{self.class.description}.pdf"
@@ -144,3 +165,10 @@ RSpec.describe "Whanganui Polygon" do
144
165
 
145
166
  include_context "visualize polygon"
146
167
  end
168
+
169
+
170
+ RSpec.describe "New Zealand Bounding Box" do
171
+ let(:region_string) {"165.7930426042,-47.8671059558 179.1461410947,-47.8671059558 179.1461410947,-33.4566032676 165.7930426042,-33.4566032676"}
172
+
173
+ include_context "visualize polygon", 20
174
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,23 +1,6 @@
1
1
 
2
- if ENV['COVERAGE'] || ENV['TRAVIS']
3
- begin
4
- require 'simplecov'
5
-
6
- SimpleCov.start do
7
- add_filter "/spec/"
8
- end
9
-
10
- if ENV['TRAVIS']
11
- require 'coveralls'
12
- Coveralls.wear!
13
- end
14
- rescue LoadError
15
- warn "Could not load simplecov: #{$!}"
16
- end
17
- end
18
-
19
- require "bundler/setup"
20
- require "geospatial"
2
+ require 'covered/rspec'
3
+ require 'geospatial'
21
4
 
22
5
  RSpec.configure do |config|
23
6
  # Enable flags like --only-failures and --next-failure
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: geospatial
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.10.0
4
+ version: 1.14.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-11 00:00:00.000000000 Z
11
+ date: 2019-09-06 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: covered
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: rspec
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -28,16 +42,16 @@ dependencies:
28
42
  name: bundler
29
43
  requirement: !ruby/object:Gem::Requirement
30
44
  requirements:
31
- - - "~>"
45
+ - - ">="
32
46
  - !ruby/object:Gem::Version
33
- version: '1.6'
47
+ version: '0'
34
48
  type: :development
35
49
  prerelease: false
36
50
  version_requirements: !ruby/object:Gem::Requirement
37
51
  requirements:
38
- - - "~>"
52
+ - - ">="
39
53
  - !ruby/object:Gem::Version
40
- version: '1.6'
54
+ version: '0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: rake
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -61,7 +75,6 @@ extra_rdoc_files: []
61
75
  files:
62
76
  - ".gitignore"
63
77
  - ".rspec"
64
- - ".simplecov"
65
78
  - ".travis.yml"
66
79
  - Gemfile
67
80
  - README.md
@@ -79,6 +92,7 @@ files:
79
92
  - lib/geospatial/histogram.rb
80
93
  - lib/geospatial/index.rb
81
94
  - lib/geospatial/interleave.rb
95
+ - lib/geospatial/line.rb
82
96
  - lib/geospatial/location.rb
83
97
  - lib/geospatial/map.rb
84
98
  - lib/geospatial/map/index.rb
@@ -94,6 +108,7 @@ files:
94
108
  - spec/geospatial/hilbert_traverse_spec.rb
95
109
  - spec/geospatial/histogram_spec.rb
96
110
  - spec/geospatial/index_spec.rb
111
+ - spec/geospatial/line_spec.rb
97
112
  - spec/geospatial/location_spec.rb
98
113
  - spec/geospatial/map_index_spec.rb
99
114
  - spec/geospatial/map_spec.rb
@@ -122,8 +137,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
122
137
  - !ruby/object:Gem::Version
123
138
  version: '0'
124
139
  requirements: []
125
- rubyforge_project:
126
- rubygems_version: 2.7.7
140
+ rubygems_version: 3.0.4
127
141
  signing_key:
128
142
  specification_version: 4
129
143
  summary: Provides abstractions for dealing with geographical locations efficiently
@@ -137,6 +151,7 @@ test_files:
137
151
  - spec/geospatial/hilbert_traverse_spec.rb
138
152
  - spec/geospatial/histogram_spec.rb
139
153
  - spec/geospatial/index_spec.rb
154
+ - spec/geospatial/line_spec.rb
140
155
  - spec/geospatial/location_spec.rb
141
156
  - spec/geospatial/map_index_spec.rb
142
157
  - spec/geospatial/map_spec.rb
data/.simplecov DELETED
@@ -1,9 +0,0 @@
1
-
2
- SimpleCov.start do
3
- add_filter "/spec/"
4
- end
5
-
6
- if ENV['TRAVIS']
7
- require 'coveralls'
8
- Coveralls.wear!
9
- end