geospatial 0.0.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,113 @@
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/index'
22
+ require_relative 'sorted'
23
+
24
+ RSpec.shared_context "hilbert index" do
25
+ it "computes the correct hash" do
26
+ coordinates.each do |coordinate, encoded|
27
+ index = Geospatial::OrdinalIndex.new(coordinate, bits)
28
+
29
+ # puts "c: #{coordinate} i: #{index.inspect} h: #{index.to_hilbert.inspect} #{index.to_hilbert.to_i} == #{encoded}"
30
+
31
+ expect(index.to_hilbert.to_i).to be == encoded
32
+ end
33
+ end
34
+
35
+ it "computes the correct unhash" do
36
+ coordinates.each do |coordinate, encoded|
37
+ index = Geospatial::HilbertIndex.from_integral(encoded, coordinate.size, bits)
38
+
39
+ expect(index.to_ordinal.axes).to be == coordinate
40
+ end
41
+ end
42
+ end
43
+
44
+ RSpec.describe "order=0 n=2" do
45
+ let(:coordinates) {
46
+ {
47
+ #y, x
48
+ [0, 0] => 0b00,
49
+ [0, 1] => 0b01,
50
+ [1, 1] => 0b10,
51
+ [1, 0] => 0b11
52
+ }
53
+ }
54
+
55
+ let(:bits) {1}
56
+
57
+ it_behaves_like "hilbert index"
58
+ end
59
+
60
+ RSpec.describe "order=0 n=3" do
61
+ let(:coordinates) {
62
+ {
63
+ # The sequence on the left walks through the hilbert curve in 3-space, while on the right is stepping incrementally through the curve.
64
+ [0, 0, 0] => 0b000,
65
+ [0, 0, 1] => 0b001,
66
+ [0, 1, 1] => 0b010,
67
+ [0, 1, 0] => 0b011,
68
+ [1, 1, 0] => 0b100,
69
+ [1, 1, 1] => 0b101,
70
+ [1, 0, 1] => 0b110,
71
+ [1, 0, 0] => 0b111,
72
+ }
73
+ }
74
+
75
+ let(:bits) {1}
76
+
77
+ it_behaves_like "hilbert index"
78
+ end
79
+
80
+ RSpec.describe "order=1 n=2" do
81
+ # Curves of odd order, move on the most significant axis first (so that their top level motion is equivalent)
82
+ let(:coordinates) {
83
+ {
84
+ # Lower left quadrant
85
+ [0, 0] => 0b0000,
86
+ [1, 0] => 0b0001,
87
+ [1, 1] => 0b0010,
88
+ [0, 1] => 0b0011,
89
+
90
+ # Lower right quadrant
91
+ [0, 2] => 0b0100,
92
+ [0, 3] => 0b0101,
93
+ [1, 3] => 0b0110,
94
+ [1, 2] => 0b0111,
95
+
96
+ # Upper right quadrant
97
+ [2, 2] => 0b1000,
98
+ [2, 3] => 0b1001,
99
+ [3, 3] => 0b1010,
100
+ [3, 2] => 0b1011,
101
+
102
+ # Upper left quadrant
103
+ [3, 1] => 0b1100,
104
+ [2, 1] => 0b1101,
105
+ [2, 0] => 0b1110,
106
+ [3, 0] => 0b1111,
107
+ }
108
+ }
109
+
110
+ let(:bits) {2}
111
+
112
+ it_behaves_like "hilbert index"
113
+ end
@@ -22,11 +22,11 @@ require 'geospatial/location'
22
22
 
23
23
  module Geospatial::LocationSpec
24
24
  describe Geospatial::Location do
25
+ let(:lake_tekapo) {Geospatial::Location.new(170.53, -43.89)}
26
+ let(:lake_alex) {Geospatial::Location.new(170.45, -43.94)}
27
+
25
28
  it "compute the correct distance between two points" do
26
- lake_tekapo = Geospatial::Location.new(-43.883, 170.516)
27
- lake_alex = Geospatial::Location.new(-43.95, 170.45)
28
-
29
- expect(lake_alex.distance_from(lake_tekapo)).to be_within(10).of(9_130)
29
+ expect(lake_alex.distance_from(lake_tekapo)).to be_within(100).of(8_500)
30
30
  end
31
31
  end
32
32
  end
@@ -0,0 +1,41 @@
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/map/index'
22
+
23
+ RSpec.describe Geospatial::Map::Index do
24
+ let(:map) {Geospatial::Map.for_earth(30)}
25
+ let(:subject) {map.index}
26
+
27
+ let(:lake_alex) {Geospatial::Location.new(170.45, -43.94)}
28
+ let(:point) {map.point_for_coordinates(lake_alex.to_a)}
29
+
30
+ it "should dump to hash" do
31
+ expect(subject.dump(point)).to be == point.hash
32
+ end
33
+
34
+ it "should load hash" do
35
+ truncated_point = subject.load(point.hash)
36
+ distance = Geospatial::Location.new(*truncated_point.coordinates).distance_from(lake_alex)
37
+
38
+ # The distance between the truncated point and the original point should be < 10 meters.
39
+ expect(distance).to be < 10
40
+ end
41
+ end
@@ -0,0 +1,71 @@
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/hilbert'
22
+ require 'geospatial/map'
23
+
24
+ require_relative 'visualization'
25
+
26
+ RSpec.describe Geospatial::Map.for_earth do
27
+ let(:lake_tekapo) {Geospatial::Location.new(170.53, -43.89)}
28
+ let(:lake_alex) {Geospatial::Location.new(170.45, -43.94)}
29
+ let(:sydney) {Geospatial::Location.new(151.21, -33.85)}
30
+
31
+ let(:new_zealand) {Geospatial::Box.from_bounds(Vector[166.0, -48.0], Vector[180.0, -34.0])}
32
+ let(:australia) {Geospatial::Box.from_bounds(Vector[112.0, -45.0], Vector[155.0, -10.0])}
33
+
34
+ it "can generate visualisation" do
35
+ Geospatial::Visualization.for_map(subject) do |pdf, origin|
36
+ size = australia.size
37
+ top_left = (origin + australia.min) + Vector[0, size[1]]
38
+ pdf.rectangle(top_left.to_a, *size.to_a)
39
+
40
+ pdf.fill
41
+
42
+ subject.traverse(australia, depth: subject.order - 10) do |child, prefix, order|
43
+ size = child.size
44
+ top_left = (origin + child.min) + Vector[0, size[1]]
45
+ pdf.rectangle(top_left.to_a, *size.to_a)
46
+ end
47
+
48
+ pdf.fill_and_stroke
49
+ end.render_file "map.pdf"
50
+ end
51
+
52
+ it "should add points" do
53
+ subject << lake_tekapo
54
+ subject << lake_alex
55
+
56
+ subject.sort!
57
+
58
+ expect(subject.count).to be == 2
59
+ expect(subject.points[0].hash).to be <= subject.points[1].hash
60
+ end
61
+
62
+ it "should find points in New Zealand" do
63
+ subject << lake_tekapo << lake_alex << sydney
64
+
65
+ subject.sort!
66
+
67
+ points = subject.query(new_zealand, depth: 10)
68
+ expect(points).to include(lake_tekapo, lake_alex)
69
+ expect(points).to_not include(sydney)
70
+ end
71
+ end
@@ -0,0 +1,96 @@
1
+ # Copyright, 2016, 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/polygon'
22
+
23
+ require_relative 'visualization'
24
+
25
+ RSpec.shared_context "kaikoura region" do
26
+ let(:region) do
27
+ Geospatial::Polygon[
28
+ Vector[173.7218528654108, -42.32817252073923],
29
+ Vector[173.6307775307161, -42.32729039137249],
30
+ Vector[173.5400659958715, -42.39758413896335],
31
+ Vector[173.5446498680837, -42.43847509799515],
32
+ Vector[173.6833471779081, -42.44870319335309],
33
+ Vector[173.7608096128163, -42.42144813099029],
34
+ Vector[173.7218528654108, -42.32817252073923],
35
+ ]
36
+ end
37
+
38
+ let(:filter) {subject.filter_for(region)}
39
+ let(:kaikoura) {Geospatial::Location.new(173.6814, -42.4008)}
40
+ end
41
+
42
+ RSpec.describe Geospatial::Polygon.new([Vector[0.0, 0.0], Vector[1.0, 0.0], Vector[0.0, 1.0]]) do
43
+ it "should intersect point on edge" do
44
+ is_expected.to be_include_point(Vector[0.0, 0.0])
45
+ end
46
+
47
+ it "should not intersect point outside" do
48
+ is_expected.to_not be_include_point(Vector[1.0, 0.5])
49
+ end
50
+
51
+ it "should intersect point inside" do
52
+ is_expected.to be_include_point(Vector[0.2, 0.2])
53
+ end
54
+ end
55
+
56
+ RSpec.describe Geospatial::Map.for_earth(22) do
57
+ include_context "kaikoura region"
58
+
59
+ it "should contain some prefixes" do
60
+ expect(filter.ranges).to_not be_empty
61
+ end
62
+
63
+ it "should contain kaikoura" do
64
+ point = subject.point_for_object(kaikoura)
65
+ expect(filter).to include(point)
66
+ end
67
+ end
68
+
69
+ RSpec.describe Geospatial::Polygon do
70
+ include_context "kaikoura region"
71
+
72
+ it "can generate visualisation" do
73
+ map = Geospatial::Map.for_earth
74
+
75
+ map << kaikoura
76
+
77
+ Geospatial::Visualization.for_map(map) do |pdf, origin|
78
+ region.edges do |pa, pb|
79
+ pdf.line (origin + pa).to_a, (origin + pb).to_a
80
+ end
81
+
82
+ #count = 0
83
+ map.traverse(region, depth: map.order - 15) do |child, prefix, order|
84
+ #count += 1
85
+ size = child.size
86
+ top_left = (origin + child.min) + Vector[0, size[1]]
87
+ pdf.rectangle(top_left.to_a, *size.to_a)
88
+ # puts "#{top_left.to_a} #{size.to_a}"
89
+ end
90
+
91
+ #puts "count=#{count}"
92
+
93
+ pdf.fill_and_stroke
94
+ end.render_file "polygon.pdf"
95
+ end
96
+ end
@@ -0,0 +1,6 @@
1
+
2
+ module Enumerable
3
+ def sorted?
4
+ each_cons(2).all?{|a,b| (a <=> b) <= 0}
5
+ end
6
+ end
@@ -0,0 +1,46 @@
1
+
2
+ require 'geospatial/map'
3
+ require 'prawn'
4
+
5
+ module Geospatial
6
+ module Visualization
7
+ def self.for_map(map)
8
+ margin = 10
9
+ scale = 16.0
10
+ size = map.bounds.size.to_a
11
+ half_size = size.map{|i| i.to_f / 2}
12
+ origin = [size[0] / 2, size[1] / 2]
13
+
14
+ pdf = Prawn::Document.new(
15
+ page_size: [(size[0] + 40) * scale, (size[1] + 40) * scale],
16
+ margin: 20,
17
+ )
18
+
19
+ pdf.line_width 0.001
20
+ pdf.scale(scale)
21
+
22
+ world_path = File.expand_path("world.png", __dir__)
23
+ pdf.image world_path, :at => [0, 180], width: 360, height: 180
24
+
25
+ pdf.stroke_axis(step_length: 45)
26
+
27
+ pdf.transparent(0.3, 0.9) do
28
+ pdf.stroke_color "000000"
29
+ pdf.fill_color "00abcc"
30
+
31
+ yield pdf, Vector[*origin]
32
+
33
+ pdf.fill_color "00ff00"
34
+
35
+ map.points.each do |point|
36
+ center = [origin[0] + point[0], origin[1] + point[1]]
37
+ pdf.circle center, 0.1
38
+ end
39
+
40
+ pdf.fill
41
+ end
42
+
43
+ return pdf
44
+ end
45
+ end
46
+ end
Binary file
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: 0.0.1
4
+ version: 1.0.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: 2015-09-29 00:00:00.000000000 Z
11
+ date: 2016-12-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 3.1.0
19
+ version: '3.4'
20
20
  type: :development
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: 3.1.0
26
+ version: '3.4'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -66,13 +66,36 @@ files:
66
66
  - Gemfile
67
67
  - README.md
68
68
  - Rakefile
69
+ - australia.png
69
70
  - geospatial.gemspec
70
71
  - lib/geospatial.rb
72
+ - lib/geospatial/box.rb
73
+ - lib/geospatial/circle.rb
74
+ - lib/geospatial/dimensions.rb
75
+ - lib/geospatial/filter.rb
71
76
  - lib/geospatial/hilbert.rb
77
+ - lib/geospatial/hilbert/curve.rb
78
+ - lib/geospatial/hilbert/traverse.rb
79
+ - lib/geospatial/index.rb
80
+ - lib/geospatial/interleave.rb
72
81
  - lib/geospatial/location.rb
82
+ - lib/geospatial/map.rb
83
+ - lib/geospatial/map/index.rb
84
+ - lib/geospatial/polygon.rb
73
85
  - lib/geospatial/version.rb
74
- - spec/geoquery/hilbert_spec.rb
75
- - spec/geoquery/location_spec.rb
86
+ - spec/geospatial/box_spec.rb
87
+ - spec/geospatial/circle_spec.rb
88
+ - spec/geospatial/dimensions_spec.rb
89
+ - spec/geospatial/hilbert_curve_spec.rb
90
+ - spec/geospatial/hilbert_traverse_spec.rb
91
+ - spec/geospatial/index_spec.rb
92
+ - spec/geospatial/location_spec.rb
93
+ - spec/geospatial/map_index_spec.rb
94
+ - spec/geospatial/map_spec.rb
95
+ - spec/geospatial/polygon_spec.rb
96
+ - spec/geospatial/sorted.rb
97
+ - spec/geospatial/visualization.rb
98
+ - spec/geospatial/world.png
76
99
  homepage: https://github.com/ioquatix/geospatial
77
100
  licenses:
78
101
  - MIT
@@ -93,10 +116,21 @@ required_rubygems_version: !ruby/object:Gem::Requirement
93
116
  version: '0'
94
117
  requirements: []
95
118
  rubyforge_project:
96
- rubygems_version: 2.2.2
119
+ rubygems_version: 2.5.2
97
120
  signing_key:
98
121
  specification_version: 4
99
122
  summary: Provides abstractions for dealing with geographical locations efficiently
100
123
  test_files:
101
- - spec/geoquery/hilbert_spec.rb
102
- - spec/geoquery/location_spec.rb
124
+ - spec/geospatial/box_spec.rb
125
+ - spec/geospatial/circle_spec.rb
126
+ - spec/geospatial/dimensions_spec.rb
127
+ - spec/geospatial/hilbert_curve_spec.rb
128
+ - spec/geospatial/hilbert_traverse_spec.rb
129
+ - spec/geospatial/index_spec.rb
130
+ - spec/geospatial/location_spec.rb
131
+ - spec/geospatial/map_index_spec.rb
132
+ - spec/geospatial/map_spec.rb
133
+ - spec/geospatial/polygon_spec.rb
134
+ - spec/geospatial/sorted.rb
135
+ - spec/geospatial/visualization.rb
136
+ - spec/geospatial/world.png
@@ -1,72 +0,0 @@
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/hilbert'
22
-
23
- module Geospatial::HilbertSpec
24
- describe Geospatial::Hilbert do
25
- it "base case should be identity" do
26
- # The base case for our coordinate system:
27
- expect(Geospatial::Hilbert.rotate(0, 0)).to be == 0
28
- expect(Geospatial::Hilbert.rotate(0, 1)).to be == 1
29
- expect(Geospatial::Hilbert.rotate(0, 2)).to be == 2
30
- expect(Geospatial::Hilbert.rotate(0, 3)).to be == 3
31
- end
32
-
33
- it "rotation is self-inverting" do
34
- 4.times do |rotation|
35
- 4.times do |quadrant|
36
- # rotate(rotation, rotate(rotation, quadrant)) == quadrant
37
- rotated = Geospatial::Hilbert.rotate(rotation, quadrant)
38
- expect(Geospatial::Hilbert.rotate(rotation, rotated)).to be == quadrant
39
- end
40
- end
41
- end
42
-
43
- it "compute the correct hash of order=0" do
44
- expect(Geospatial::Hilbert.hash(0, 0, 0)).to be == 0
45
- expect(Geospatial::Hilbert.hash(1, 0, 0)).to be == 1
46
- expect(Geospatial::Hilbert.hash(1, 1, 0)).to be == 2
47
- expect(Geospatial::Hilbert.hash(0, 1, 0)).to be == 3
48
- end
49
-
50
- it "compute the correct hash of order=1" do
51
- expect(Geospatial::Hilbert.hash(0, 0, 1)).to be == 0
52
- expect(Geospatial::Hilbert.hash(1, 0, 1)).to be == 1
53
- expect(Geospatial::Hilbert.hash(1, 1, 1)).to be == 2
54
- expect(Geospatial::Hilbert.hash(0, 1, 1)).to be == 3
55
-
56
- expect(Geospatial::Hilbert.hash(0, 2, 1)).to be == 4
57
- expect(Geospatial::Hilbert.hash(0, 3, 1)).to be == 5
58
- expect(Geospatial::Hilbert.hash(1, 3, 1)).to be == 6
59
- expect(Geospatial::Hilbert.hash(1, 2, 1)).to be == 7
60
-
61
- expect(Geospatial::Hilbert.hash(2, 2, 1)).to be == 8
62
- expect(Geospatial::Hilbert.hash(2, 3, 1)).to be == 9
63
- expect(Geospatial::Hilbert.hash(3, 3, 1)).to be == 10
64
- expect(Geospatial::Hilbert.hash(3, 2, 1)).to be == 11
65
-
66
- expect(Geospatial::Hilbert.hash(3, 1, 1)).to be == 12
67
- expect(Geospatial::Hilbert.hash(2, 1, 1)).to be == 13
68
- expect(Geospatial::Hilbert.hash(2, 0, 1)).to be == 14
69
- expect(Geospatial::Hilbert.hash(3, 0, 1)).to be == 15
70
- end
71
- end
72
- end