grid_square 0.0.5 → 0.0.6
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.
- data/lib/grid_square.rb +67 -69
- data/lib/grid_square/version.rb +1 -1
- data/lib/location.rb +1 -1
- data/lib/radix_enumerator.rb +1 -1
- metadata +1 -1
data/lib/grid_square.rb
CHANGED
@@ -2,76 +2,74 @@ require 'location'
|
|
2
2
|
require 'radix_enumerator'
|
3
3
|
require 'string_ext'
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
latitude -= lat * size.latitude
|
32
|
-
end
|
33
|
-
|
34
|
-
new grid_reference.downcase_last
|
35
|
-
end
|
36
|
-
|
37
|
-
# Maidenhead locator names
|
38
|
-
def field; precision 1; end
|
39
|
-
def square; precision 2; end
|
40
|
-
def subsquare; precision 3; end
|
41
|
-
def extended_subsquare; precision 4; end
|
42
|
-
|
43
|
-
# Return code to a given number of 2-digit fields
|
44
|
-
def precision(num_fields)
|
45
|
-
raise IndexError.new "GridSquare.square: insufficient precision to index #{num_fields} fields" unless grid_reference.length >= num_fields * 2
|
46
|
-
grid_reference[0...num_fields*2].downcase_last
|
47
|
-
end
|
48
|
-
|
49
|
-
def decode
|
50
|
-
radixes = RadixEnumerator.new
|
51
|
-
@origin, @size = Location.new(-180.0, -90.0), Location.new(360.0, 180.0)
|
52
|
-
|
53
|
-
@grid_reference.upcase.chars.each_slice(2) do |lng, lat|
|
54
|
-
zero, radix = *radixes.next
|
55
|
-
@size /= radix
|
56
|
-
@origin += Location.new(@size.longitude * (lng.ord - zero), @size.latitude * (lat.ord - zero))
|
57
|
-
end
|
5
|
+
class GridSquare
|
6
|
+
attr_reader :grid_reference, :origin
|
7
|
+
|
8
|
+
# location can be a string containing a GS reference or a pair
|
9
|
+
# containing longitude and latitude.
|
10
|
+
def initialize(grid_reference)
|
11
|
+
@grid_reference = grid_reference
|
12
|
+
decode
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.encode(longitude, latitude, precision=4 )
|
16
|
+
longitude += 180
|
17
|
+
latitude += 90
|
18
|
+
radixes = RadixEnumerator.new
|
19
|
+
grid_reference = ''
|
20
|
+
size = Location.new(360.0, 180.0)
|
21
|
+
precision.times do
|
22
|
+
zero,radix = *radixes.next
|
23
|
+
|
24
|
+
lng = (radix * longitude / size.longitude).floor
|
25
|
+
lat = (radix * latitude / size.latitude).floor
|
26
|
+
|
27
|
+
grid_reference += "%s%s" % [(zero + lng).chr, (zero + lat).chr]
|
28
|
+
size /= radix
|
29
|
+
longitude -= lng * size.longitude
|
30
|
+
latitude -= lat * size.latitude
|
58
31
|
end
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
32
|
+
|
33
|
+
new grid_reference.downcase_last
|
34
|
+
end
|
35
|
+
|
36
|
+
# Maidenhead locator names
|
37
|
+
def field; precision 1; end
|
38
|
+
def square; precision 2; end
|
39
|
+
def subsquare; precision 3; end
|
40
|
+
def extended_subsquare; precision 4; end
|
41
|
+
|
42
|
+
# Return code to a given number of 2-digit fields
|
43
|
+
def precision(num_fields)
|
44
|
+
raise IndexError.new "GridSquare.square: insufficient precision to index #{num_fields} fields" unless grid_reference.length >= num_fields * 2
|
45
|
+
grid_reference[0...num_fields*2].downcase_last
|
46
|
+
end
|
47
|
+
|
48
|
+
def decode
|
49
|
+
radixes = RadixEnumerator.new
|
50
|
+
@origin, @size = Location.new(-180.0, -90.0), Location.new(360.0, 180.0)
|
51
|
+
|
52
|
+
@grid_reference.upcase.chars.each_slice(2) do |lng, lat|
|
53
|
+
zero, radix = *radixes.next
|
54
|
+
@size /= radix
|
55
|
+
@origin += Location.new(@size.longitude * (lng.ord - zero), @size.latitude * (lat.ord - zero))
|
75
56
|
end
|
76
57
|
end
|
58
|
+
|
59
|
+
def width; @size.longitude; end
|
60
|
+
def height; @size.latitude; end
|
61
|
+
|
62
|
+
def left; @origin.longitude; end
|
63
|
+
def bottom; @origin.latitude; end
|
64
|
+
def top; (@origin + @size).latitude; end
|
65
|
+
def right; (@origin + @size).longitude; end
|
66
|
+
|
67
|
+
alias :west :left
|
68
|
+
alias :south :bottom
|
69
|
+
alias :east :right
|
70
|
+
alias :north :top
|
71
|
+
|
72
|
+
def center
|
73
|
+
@origin + @size/2
|
74
|
+
end
|
77
75
|
end
|
data/lib/grid_square/version.rb
CHANGED
data/lib/location.rb
CHANGED
data/lib/radix_enumerator.rb
CHANGED