geo_calc 0.5.3 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Changelog.textile +4 -0
- data/README.textile +7 -0
- data/VERSION +1 -1
- data/geo_calc.gemspec +27 -19
- data/lib/geo_calc/calc/bearing.rb +51 -0
- data/lib/geo_calc/calc/destination.rb +30 -0
- data/lib/geo_calc/calc/distance.rb +43 -0
- data/lib/geo_calc/calc/intersection.rb +72 -0
- data/lib/geo_calc/calc/midpoint.rb +29 -0
- data/lib/geo_calc/calc/rhumb.rb +98 -0
- data/lib/geo_calc/calc.rb +27 -0
- data/lib/geo_calc/core_ext.rb +97 -39
- data/lib/geo_calc/geo.rb +3 -2
- data/lib/geo_calc/geo_point.rb +13 -2
- data/lib/geo_calc/pretty_print.rb +52 -0
- data/spec/geo_calc/calculations_spec.rb +3 -2
- data/spec/geo_calc/core_ext/array_ext_spec.rb +47 -0
- data/spec/geo_calc/core_ext/hash_ext_spec.rb +44 -0
- data/spec/geo_calc/core_ext/numeric_geo_ext_spec.rb +73 -0
- data/spec/geo_calc/core_ext/string_ext_spec.rb +77 -0
- data/spec/geo_calc/core_ext_spec.rb +6 -220
- data/spec/geo_calc/geo_point_spec.rb +39 -3
- data/spec/geo_calc/geo_spec.rb +1 -1
- data/{lib/geo_calc/js → vendor/assets/javascript}/geo_calc.js +0 -0
- metadata +28 -16
- data/lib/geo_calc/calculations.rb +0 -333
data/lib/geo_calc/geo_point.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
-
require 'geo_calc/
|
1
|
+
require 'geo_calc/geo'
|
2
|
+
require 'geo_calc/calc'
|
2
3
|
|
3
4
|
# Sample usage:
|
4
5
|
# p1 = GeoPoint.new(51.5136, -0.0983)
|
@@ -13,7 +14,7 @@ require 'geo_calc/calculations'
|
|
13
14
|
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
14
15
|
|
15
16
|
class GeoPoint
|
16
|
-
include GeoCalc
|
17
|
+
include GeoCalc::Calc::All
|
17
18
|
# Creates a point on the earth's surface at the supplied latitude / longitude
|
18
19
|
#
|
19
20
|
# Constructor
|
@@ -79,6 +80,16 @@ class GeoPoint
|
|
79
80
|
|
80
81
|
alias_method :to_dms, :to_s
|
81
82
|
|
83
|
+
def reverse_point!
|
84
|
+
self.lat = lat * -1
|
85
|
+
self.lng = lng * -1
|
86
|
+
self
|
87
|
+
end
|
88
|
+
|
89
|
+
def reverse_point
|
90
|
+
self.dup.reverse_point!
|
91
|
+
end
|
92
|
+
|
82
93
|
def to_lat_lng
|
83
94
|
[lat, lng]
|
84
95
|
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module GeoCalc
|
2
|
+
module PrettyPrint
|
3
|
+
# Returns the latitude of this point; signed numeric degrees if no format, otherwise format & dp
|
4
|
+
# as per Geo.to_lat
|
5
|
+
#
|
6
|
+
# - String [format]: Return value as 'd', 'dm', 'dms'
|
7
|
+
# - Numeric [dp=0|2|4]: No of decimal places to display
|
8
|
+
#
|
9
|
+
# Returns {Numeric|String}: Numeric degrees if no format specified, otherwise deg/min/sec
|
10
|
+
#
|
11
|
+
|
12
|
+
def to_lat format = :dms, dp = 0
|
13
|
+
return lat if !format
|
14
|
+
Geo.to_lat lat, format, dp
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
# Returns the longitude of this point; signed numeric degrees if no format, otherwise format & dp
|
19
|
+
# as per Geo.toLon()
|
20
|
+
#
|
21
|
+
# @param {String} [format]: Return value as 'd', 'dm', 'dms'
|
22
|
+
# @param {Number} [dp=0|2|4]: No of decimal places to display
|
23
|
+
# @returns {Number|String} Numeric degrees if no format specified, otherwise deg/min/sec
|
24
|
+
#
|
25
|
+
# @requires Geo
|
26
|
+
|
27
|
+
def to_lon format, dp
|
28
|
+
return lon if !format
|
29
|
+
Geo.to_lon lon, format, dp
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
# Returns a string representation of this point; format and dp as per lat()/lon()
|
34
|
+
#
|
35
|
+
# @param {String} [format]: Return value as 'd', 'dm', 'dms'
|
36
|
+
# @param {Number} [dp=0|2|4]: No of decimal places to display
|
37
|
+
|
38
|
+
# @returns {String} Comma-separated latitude/longitude
|
39
|
+
#
|
40
|
+
|
41
|
+
def to_s format = :dms, dp = 0
|
42
|
+
format ||= :dms
|
43
|
+
|
44
|
+
return '-,-' if !lat || !lon
|
45
|
+
|
46
|
+
_lat = Geo.to_lat lat, format, dp
|
47
|
+
_lon = Geo.to_lon lon, format, dp
|
48
|
+
|
49
|
+
"#{_lat}, #{_lon}"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -51,7 +51,8 @@ describe GeoCalc do
|
|
51
51
|
# Midpoint: 54°21′44″N, 004°31′50″W
|
52
52
|
describe '#midpoint_to' do
|
53
53
|
it 'should return the initial bearing from p1 to p2 as 011 16 31' do
|
54
|
-
@p1.midpoint_to(@p2)
|
54
|
+
mp = @p1.midpoint_to(@p2)
|
55
|
+
mp.to_dms.should match /54.+21.+44.+N, 004.+31.+50.+W/
|
55
56
|
end
|
56
57
|
end
|
57
58
|
end # context
|
@@ -94,7 +95,7 @@ describe GeoCalc do
|
|
94
95
|
# Intersection point: 50°54′06″N, 004°29′39″E
|
95
96
|
describe '#intersection' do
|
96
97
|
it 'should return the intersection between p1 and p2 as (50 54 06 N, 004 29 39 E)' do
|
97
|
-
GeoCalc.intersection(@p1, @brng1, @p2, @brng2).to_dms.should match /50.+54.+06.+N, 004.+29.+39.+E/
|
98
|
+
GeoCalc::Calc::Intersection.intersection(@p1, @brng1, @p2, @brng2).to_dms.should match /50.+54.+06.+N, 004.+29.+39.+E/
|
98
99
|
end
|
99
100
|
end
|
100
101
|
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
# - www.movable-type.co.uk/scripts/latlong.html
|
4
|
+
describe GeoPoint do
|
5
|
+
describe 'ruby core Class extensions' do
|
6
|
+
describe 'Array extension' do
|
7
|
+
describe '#to_lat' do
|
8
|
+
it 'should return latitude as first element' do
|
9
|
+
@arr = [4, 27]
|
10
|
+
@arr.to_lat.should == 4
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'should return latitude as #to_lng of first element' do
|
14
|
+
@arr = ["4.1", 27]
|
15
|
+
@arr.to_lat.should == 4.1
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe '#to_lng' do
|
20
|
+
it 'should return latitude degree value for 360' do
|
21
|
+
@arr = [4, 27]
|
22
|
+
@arr.to_lng.should == 27
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'should return latitude as #to_lng of first element' do
|
26
|
+
@arr = [4, "27.2"]
|
27
|
+
@arr.to_lng.should == 27.2
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe '#to_lat_lng' do
|
32
|
+
it 'should return Array with lat, lng' do
|
33
|
+
@arr = ["3", {:lng => "2"}]
|
34
|
+
@arr.to_lat_lng.should == [3, 2]
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe '#geo_point' do
|
39
|
+
it 'should return a GeoPoint' do
|
40
|
+
@p = [3, 2].geo_point
|
41
|
+
@p.should be_a(GeoPoint)
|
42
|
+
@p.to_lat_lng.should == [3, 2]
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end # Array
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
describe GeoPoint do
|
2
|
+
describe 'ruby core Class extensions' do
|
3
|
+
describe 'Hash extension' do
|
4
|
+
describe '#to_lat' do
|
5
|
+
it 'should return latitude as #to_lat on the value for key :lat' do
|
6
|
+
@hash = {:lat => 4}
|
7
|
+
@hash.to_lat.should == 4
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'should return latitude as #to_lat on the value for key :latitude' do
|
11
|
+
@hash = {:latitude => "7"}
|
12
|
+
@hash.to_lat.should == 7
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe '#to_lng' do
|
17
|
+
it 'should return latitude as #to_lng on the value for key :lng' do
|
18
|
+
@hash = {:lng => 2}
|
19
|
+
@hash.to_lng.should == 2
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'should return latitude as #to_lng on the value for key :longitude' do
|
23
|
+
@hash = {:longitude => "3.1"}
|
24
|
+
@hash.to_lng.should == 3.1
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe '#to_lat_lng' do
|
29
|
+
it 'should return Array with lat, lng' do
|
30
|
+
@hash = {:lng => 2, :lat => "3"}
|
31
|
+
@hash.to_lat_lng.should == [3, 2]
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe '#geo_point' do
|
36
|
+
it 'should return a GeoPoint' do
|
37
|
+
@p = {:lng => 2, :lat => "3"}.geo_point
|
38
|
+
@p.should be_a(GeoPoint)
|
39
|
+
@p.to_lat_lng.should == [3, 2]
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end # Hash
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
# - www.movable-type.co.uk/scripts/latlong.html
|
4
|
+
describe GeoPoint do
|
5
|
+
describe 'ruby core Class extensions' do
|
6
|
+
describe NumericGeoExt do
|
7
|
+
describe '#to_rad' do
|
8
|
+
it 'should convert 0 degrees to 0 radians' do
|
9
|
+
0.to_rad.should == 0
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'should convert 180 degrees to PI radians' do
|
13
|
+
180.to_rad.should == Math::PI
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'should convert 360 degrees to 6.28 radians' do
|
17
|
+
360.to_rad.should == Math::PI*2
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe '#to_radians' do
|
22
|
+
it 'should alias to_rad' do
|
23
|
+
360.to_rad.should == 360.to_radians
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe '#to_deg' do
|
28
|
+
it 'should convert 0 radians to 0 degrees' do
|
29
|
+
0.to_deg.should == 0
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'should convert PI radians to 180 degrees' do
|
33
|
+
180.to_rad.to_deg.should be_within(0.01).of(180)
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'should convert 6.28 radians to 360 degrees' do
|
37
|
+
360.to_rad.to_deg.should be_within(0.01).of(360)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe '#to_degrees' do
|
42
|
+
it 'should alias to_deg' do
|
43
|
+
360.to_deg.should == 360.to_degrees
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
describe '#to_fixed' do
|
48
|
+
it 'should make precision 4' do
|
49
|
+
1.123456.to_fixed(2).should == '1.12'
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe '#to_precision' do
|
54
|
+
it 'should alis to_fixed' do
|
55
|
+
1.123456.to_precision(4).should == '1.1235'
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
describe '#normalize' do
|
60
|
+
it 'should turn 180 deg and normalize' do
|
61
|
+
361.normalize_deg(180).should == 181
|
62
|
+
end
|
63
|
+
it 'should normalize deg' do
|
64
|
+
361.normalize_deg.should == 1
|
65
|
+
end
|
66
|
+
|
67
|
+
it 'should alias with #normalize_degrees' do
|
68
|
+
362.normalize_degrees.should == 2
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end # NumericGeoExt
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
# - www.movable-type.co.uk/scripts/latlong.html
|
4
|
+
describe GeoPoint do
|
5
|
+
describe 'ruby core Class extensions' do
|
6
|
+
describe 'String extension' do
|
7
|
+
describe '#to_lat' do
|
8
|
+
it 'should not return latitude on empty String' do
|
9
|
+
@str = ""
|
10
|
+
lambda { @str.to_lat}.should raise_error
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'should return latitude' do
|
14
|
+
@str = "4"
|
15
|
+
@str.to_lat.should == 4
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'should convert to latitude' do
|
19
|
+
@str = "50 03 59N"
|
20
|
+
@str.to_lat.should be_within(0.4).of(50)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe '#to_lng' do
|
25
|
+
it 'should not return longitude on empty String' do
|
26
|
+
@str = ""
|
27
|
+
lambda { @str.to_lng}.should raise_error
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'should return latitude' do
|
31
|
+
@str = "4"
|
32
|
+
@str.to_lat.should == 4
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'should convert to latitude' do
|
36
|
+
@str = "50 03 59E"
|
37
|
+
@str.to_lat.should be_within(0.4).of(50)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe '#to_lat_lng' do
|
42
|
+
it 'should return Array with lat, lng' do
|
43
|
+
@str = "4, 3"
|
44
|
+
@str.to_lat_lng.should == [4, 3]
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'should raise error if only latitude' do
|
48
|
+
@str = "4"
|
49
|
+
lambda { @str.to_lat_lng}.should raise_error
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'should raise error if "," but only latitude' do
|
53
|
+
@str = "4,"
|
54
|
+
lambda { @str.to_lat_lng}.should raise_error
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'should raise error if "," in bad position' do
|
58
|
+
@str = ", 4 3"
|
59
|
+
lambda { @str.to_lat_lng}.should raise_error
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'should raise error if not using "," as seperator' do
|
63
|
+
@str = "4; 3"
|
64
|
+
lambda { @str.to_lat_lng}.should raise_error
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
describe '#geo_point' do
|
69
|
+
it 'should return a GeoPoint' do
|
70
|
+
@p = "3, 2".geo_point
|
71
|
+
@p.should be_a(GeoPoint)
|
72
|
+
@p.to_lat_lng.should == [3, 2]
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end # String
|
76
|
+
end
|
77
|
+
end
|
@@ -3,76 +3,15 @@ require 'spec_helper'
|
|
3
3
|
# - www.movable-type.co.uk/scripts/latlong.html
|
4
4
|
describe GeoPoint do
|
5
5
|
describe 'ruby core Class extensions' do
|
6
|
-
describe NumericGeoExt do
|
7
|
-
describe '#to_rad' do
|
8
|
-
it 'should convert 0 degrees to 0 radians' do
|
9
|
-
0.to_rad.should == 0
|
10
|
-
end
|
11
|
-
|
12
|
-
it 'should convert 180 degrees to PI radians' do
|
13
|
-
180.to_rad.should == Math::PI
|
14
|
-
end
|
15
|
-
|
16
|
-
it 'should convert 360 degrees to 6.28 radians' do
|
17
|
-
360.to_rad.should == Math::PI*2
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
describe '#to_radians' do
|
22
|
-
it 'should alias to_rad' do
|
23
|
-
360.to_rad.should == 360.to_radians
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
describe '#to_deg' do
|
28
|
-
it 'should convert 0 radians to 0 degrees' do
|
29
|
-
0.to_deg.should == 0
|
30
|
-
end
|
31
|
-
|
32
|
-
it 'should convert PI radians to 180 degrees' do
|
33
|
-
180.to_rad.to_deg.should be_within(0.01).of(180)
|
34
|
-
end
|
35
|
-
|
36
|
-
it 'should convert 6.28 radians to 360 degrees' do
|
37
|
-
360.to_rad.to_deg.should be_within(0.01).of(360)
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
describe '#to_degrees' do
|
42
|
-
it 'should alias to_deg' do
|
43
|
-
360.to_deg.should == 360.to_degrees
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
describe '#to_fixed' do
|
48
|
-
it 'should make precision 4' do
|
49
|
-
1.123456.to_fixed(2).should == '1.12'
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
describe '#to_precision' do
|
54
|
-
it 'should alis to_fixed' do
|
55
|
-
1.123456.to_precision(4).should == '1.1235'
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
describe '#normalize' do
|
60
|
-
it 'should turn 180 deg and normalize' do
|
61
|
-
361.normalize_deg(180).should == 181
|
62
|
-
end
|
63
|
-
it 'should normalize deg' do
|
64
|
-
361.normalize_deg.should == 1
|
65
|
-
end
|
66
|
-
|
67
|
-
it 'should alias with #normalize_degrees' do
|
68
|
-
362.normalize_degrees.should == 2
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end # NumericGeoExt
|
72
|
-
|
73
6
|
describe NumericLatLngExt do
|
74
7
|
describe 'Fixnum extension' do
|
75
8
|
describe '#to_lat' do
|
9
|
+
it 'should set origin at 0,0' do
|
10
|
+
origin = [0, 0].geo_point
|
11
|
+
origin.lat.should == 0
|
12
|
+
origin.lng.should == 0
|
13
|
+
end
|
14
|
+
|
76
15
|
it 'should return latitude degree value for 360' do
|
77
16
|
360.to_lat.should == 0
|
78
17
|
end
|
@@ -114,159 +53,6 @@ describe GeoPoint do
|
|
114
53
|
end
|
115
54
|
end
|
116
55
|
end
|
117
|
-
|
118
|
-
describe 'Array extension' do
|
119
|
-
describe '#to_lat' do
|
120
|
-
it 'should return latitude as first element' do
|
121
|
-
@arr = [4, 27]
|
122
|
-
@arr.to_lat.should == 4
|
123
|
-
end
|
124
|
-
|
125
|
-
it 'should return latitude as #to_lng of first element' do
|
126
|
-
@arr = ["4.1", 27]
|
127
|
-
@arr.to_lat.should == 4.1
|
128
|
-
end
|
129
|
-
end
|
130
|
-
|
131
|
-
describe '#to_lng' do
|
132
|
-
it 'should return latitude degree value for 360' do
|
133
|
-
@arr = [4, 27]
|
134
|
-
@arr.to_lng.should == 27
|
135
|
-
end
|
136
|
-
|
137
|
-
it 'should return latitude as #to_lng of first element' do
|
138
|
-
@arr = [4, "27.2"]
|
139
|
-
@arr.to_lng.should == 27.2
|
140
|
-
end
|
141
|
-
end
|
142
|
-
|
143
|
-
describe '#to_lat_lng' do
|
144
|
-
it 'should return Array with lat, lng' do
|
145
|
-
@arr = ["3", {:lng => "2"}]
|
146
|
-
@arr.to_lat_lng.should == [3, 2]
|
147
|
-
end
|
148
|
-
end
|
149
|
-
|
150
|
-
describe '#geo_point' do
|
151
|
-
it 'should return a GeoPoint' do
|
152
|
-
@p = [3, 2].geo_point
|
153
|
-
@p.should be_a(GeoPoint)
|
154
|
-
@p.to_lat_lng.should == [3, 2]
|
155
|
-
end
|
156
|
-
end
|
157
|
-
end # Array
|
158
|
-
|
159
|
-
describe 'Hash extension' do
|
160
|
-
describe '#to_lat' do
|
161
|
-
it 'should return latitude as #to_lat on the value for key :lat' do
|
162
|
-
@hash = {:lat => 4}
|
163
|
-
@hash.to_lat.should == 4
|
164
|
-
end
|
165
|
-
|
166
|
-
it 'should return latitude as #to_lat on the value for key :latitude' do
|
167
|
-
@hash = {:latitude => "7"}
|
168
|
-
@hash.to_lat.should == 7
|
169
|
-
end
|
170
|
-
end
|
171
|
-
|
172
|
-
describe '#to_lng' do
|
173
|
-
it 'should return latitude as #to_lng on the value for key :lng' do
|
174
|
-
@hash = {:lng => 2}
|
175
|
-
@hash.to_lng.should == 2
|
176
|
-
end
|
177
|
-
|
178
|
-
it 'should return latitude as #to_lng on the value for key :longitude' do
|
179
|
-
@hash = {:longitude => "3.1"}
|
180
|
-
@hash.to_lng.should == 3.1
|
181
|
-
end
|
182
|
-
end
|
183
|
-
|
184
|
-
describe '#to_lat_lng' do
|
185
|
-
it 'should return Array with lat, lng' do
|
186
|
-
@hash = {:lng => 2, :lat => "3"}
|
187
|
-
@hash.to_lat_lng.should == [3, 2]
|
188
|
-
end
|
189
|
-
end
|
190
|
-
|
191
|
-
describe '#geo_point' do
|
192
|
-
it 'should return a GeoPoint' do
|
193
|
-
@p = {:lng => 2, :lat => "3"}.geo_point
|
194
|
-
@p.should be_a(GeoPoint)
|
195
|
-
@p.to_lat_lng.should == [3, 2]
|
196
|
-
end
|
197
|
-
end
|
198
|
-
end # Hash
|
199
|
-
|
200
|
-
describe 'String extension' do
|
201
|
-
describe '#to_lat' do
|
202
|
-
it 'should not return latitude on empty String' do
|
203
|
-
@str = ""
|
204
|
-
lambda { @str.to_lat}.should raise_error
|
205
|
-
end
|
206
|
-
|
207
|
-
it 'should return latitude' do
|
208
|
-
@str = "4"
|
209
|
-
@str.to_lat.should == 4
|
210
|
-
end
|
211
|
-
|
212
|
-
it 'should convert to latitude' do
|
213
|
-
@str = "50 03 59N"
|
214
|
-
@str.to_lat.should be_within(0.4).of(50)
|
215
|
-
end
|
216
|
-
end
|
217
|
-
|
218
|
-
describe '#to_lng' do
|
219
|
-
it 'should not return longitude on empty String' do
|
220
|
-
@str = ""
|
221
|
-
lambda { @str.to_lng}.should raise_error
|
222
|
-
end
|
223
|
-
|
224
|
-
it 'should return latitude' do
|
225
|
-
@str = "4"
|
226
|
-
@str.to_lat.should == 4
|
227
|
-
end
|
228
|
-
|
229
|
-
it 'should convert to latitude' do
|
230
|
-
@str = "50 03 59E"
|
231
|
-
@str.to_lat.should be_within(0.4).of(50)
|
232
|
-
end
|
233
|
-
end
|
234
|
-
|
235
|
-
describe '#to_lat_lng' do
|
236
|
-
it 'should return Array with lat, lng' do
|
237
|
-
@str = "4, 3"
|
238
|
-
@str.to_lat_lng.should == [4, 3]
|
239
|
-
end
|
240
|
-
|
241
|
-
it 'should raise error if only latitude' do
|
242
|
-
@str = "4"
|
243
|
-
lambda { @str.to_lat_lng}.should raise_error
|
244
|
-
end
|
245
|
-
|
246
|
-
it 'should raise error if "," but only latitude' do
|
247
|
-
@str = "4,"
|
248
|
-
lambda { @str.to_lat_lng}.should raise_error
|
249
|
-
end
|
250
|
-
|
251
|
-
it 'should raise error if "," in bad position' do
|
252
|
-
@str = ", 4 3"
|
253
|
-
lambda { @str.to_lat_lng}.should raise_error
|
254
|
-
end
|
255
|
-
|
256
|
-
it 'should raise error if not using "," as seperator' do
|
257
|
-
@str = "4; 3"
|
258
|
-
lambda { @str.to_lat_lng}.should raise_error
|
259
|
-
end
|
260
|
-
end
|
261
|
-
|
262
|
-
describe '#geo_point' do
|
263
|
-
it 'should return a GeoPoint' do
|
264
|
-
@p = "3, 2".geo_point
|
265
|
-
@p.should be_a(GeoPoint)
|
266
|
-
@p.to_lat_lng.should == [3, 2]
|
267
|
-
end
|
268
|
-
end
|
269
|
-
end # String
|
270
56
|
end
|
271
57
|
end
|
272
58
|
end
|
@@ -32,7 +32,7 @@ describe GeoPoint do
|
|
32
32
|
p1 = GeoPoint.new "58 38 38N, 003 04 12W"
|
33
33
|
p1.should be_a(GeoPoint)
|
34
34
|
p1.lat.should be_within(0.5).of(58.38)
|
35
|
-
p1.lon.should be_within(0.5).of(
|
35
|
+
p1.lon.should be_within(0.5).of(-3)
|
36
36
|
p1.unit.should == :degrees
|
37
37
|
p1.radius.should == 6371
|
38
38
|
end
|
@@ -43,7 +43,7 @@ describe GeoPoint do
|
|
43
43
|
p1 = GeoPoint.new "(58 38 38N, 003 04 12W)"
|
44
44
|
p1.should be_a(GeoPoint)
|
45
45
|
p1.lat.should be_within(0.5).of(58.38)
|
46
|
-
p1.lon.should be_within(0.5).of(
|
46
|
+
p1.lon.should be_within(0.5).of(-3) # W is negative, then normalize
|
47
47
|
p1.unit.should == :degrees
|
48
48
|
p1.radius.should == 6371
|
49
49
|
end
|
@@ -138,7 +138,7 @@ describe GeoPoint do
|
|
138
138
|
p1 = GeoPoint.new "58 38 38N", "003 04 12W"
|
139
139
|
p1.should be_a(GeoPoint)
|
140
140
|
p1.lat.should be_within(0.5).of(58.38)
|
141
|
-
p1.lon.should be_within(0.5).of(
|
141
|
+
p1.lon.should be_within(0.5).of(-3)
|
142
142
|
p1.unit.should == :degrees
|
143
143
|
p1.radius.should == 6371
|
144
144
|
end
|
@@ -146,6 +146,31 @@ describe GeoPoint do
|
|
146
146
|
end
|
147
147
|
end # initializer
|
148
148
|
|
149
|
+
describe '#reverse_point' do
|
150
|
+
before :each do
|
151
|
+
@p = GeoPoint.new -2, 5
|
152
|
+
end
|
153
|
+
|
154
|
+
it 'should return reverse GeoPoint (2, -5)' do
|
155
|
+
@p2 = @p.reverse_point
|
156
|
+
@p2.should_not == @p
|
157
|
+
@p2.lat.should == 2
|
158
|
+
@p2.lng.should == -5
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
describe '#reverse_point!' do
|
163
|
+
before :each do
|
164
|
+
@p = GeoPoint.new -2, 5
|
165
|
+
end
|
166
|
+
|
167
|
+
it 'should return reverse GeoPoint (2, -5)' do
|
168
|
+
@p.reverse_point!
|
169
|
+
@p.lat.should == 2
|
170
|
+
@p.lng.should == -5
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
149
174
|
describe '#to_s' do
|
150
175
|
before :each do
|
151
176
|
@p1 = GeoPoint.new 50.1, 5
|
@@ -192,6 +217,17 @@ describe GeoPoint do
|
|
192
217
|
@p1.lat.should == 60
|
193
218
|
end
|
194
219
|
|
220
|
+
it 'should set new latitude -2' do
|
221
|
+
@p1.lat = -2
|
222
|
+
@p1.lat.should == -2
|
223
|
+
end
|
224
|
+
|
225
|
+
it 'should convert latitude -182 to -2' do
|
226
|
+
@p1.lat = -2
|
227
|
+
@p1.lat.should == -2
|
228
|
+
end
|
229
|
+
|
230
|
+
|
195
231
|
it 'should set new latitude within allowed range' do
|
196
232
|
@p1.lat = 520
|
197
233
|
@p1.lat.should be_between(0, 360)
|
data/spec/geo_calc/geo_spec.rb
CHANGED
@@ -91,7 +91,7 @@ describe GeoPoint do
|
|
91
91
|
it 'should convert 58.3 to a longitude String' do
|
92
92
|
brng = Geo.to_brng(-58.3)
|
93
93
|
brng.to_f.should be_between(0, 360)
|
94
|
-
expr = Regexp.escape "
|
94
|
+
expr = Regexp.escape "301".concat("\u00B0", "42", "\u2032", "00")
|
95
95
|
brng.should match expr
|
96
96
|
end
|
97
97
|
end
|
File without changes
|