geo_calc 0.6.1 → 0.7.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. data/Gemfile +3 -0
  2. data/README.textile +12 -0
  3. data/VERSION +1 -1
  4. data/geo_calc.gemspec +29 -6
  5. data/lib/geo_calc/calc/destination.rb +1 -1
  6. data/lib/geo_calc/calc/distance.rb +1 -1
  7. data/lib/geo_calc/calc/rhumb.rb +2 -2
  8. data/lib/geo_calc/calc.rb +20 -21
  9. data/lib/geo_calc/dms/converter.rb +106 -0
  10. data/lib/geo_calc/dms.rb +5 -0
  11. data/lib/geo_calc/extensions/array.rb +26 -0
  12. data/lib/geo_calc/extensions/hash.rb +23 -0
  13. data/lib/geo_calc/extensions/math.rb +6 -0
  14. data/lib/geo_calc/extensions/numeric.rb +24 -0
  15. data/lib/geo_calc/extensions/string.rb +44 -0
  16. data/lib/geo_calc/extensions/symbol.rb +9 -0
  17. data/lib/geo_calc/extensions.rb +4 -0
  18. data/lib/geo_calc/geo_point/class_methods.rb +15 -0
  19. data/lib/geo_calc/geo_point/core_extension.rb +11 -0
  20. data/lib/geo_calc/geo_point/shared.rb +29 -0
  21. data/lib/geo_calc/geo_point.rb +42 -40
  22. data/lib/geo_calc/pretty_print.rb +2 -2
  23. data/lib/geo_calc.rb +5 -0
  24. data/lib/geo_units/converter.rb +123 -0
  25. data/lib/geo_units/numeric_ext.rb +117 -0
  26. data/lib/geo_units.rb +21 -0
  27. data/spec/geo_calc/core_ext/numeric_geo_ext_spec.rb +48 -50
  28. data/spec/geo_calc/core_ext_spec.rb +49 -51
  29. data/spec/geo_calc/dms/converter_spec.rb +60 -0
  30. data/spec/geo_calc/geo_point/class_methods_spec.rb +31 -0
  31. data/spec/geo_calc/geo_point/initializer_spec.rb +148 -0
  32. data/spec/geo_calc/geo_point/lat_lon.rb +115 -0
  33. data/spec/geo_calc/geo_point_spec.rb +4 -274
  34. data/spec/geo_units/converter_spec.rb +57 -0
  35. metadata +56 -17
  36. data/lib/geo_calc/core_ext.rb +0 -318
  37. data/lib/geo_calc/geo.rb +0 -171
  38. data/spec/geo_calc/geo_spec.rb +0 -99
@@ -0,0 +1,148 @@
1
+ require 'spec_helper'
2
+
3
+ # - www.movable-type.co.uk/scripts/latlong.html
4
+ describe GeoPoint do
5
+ describe '#initializer' do
6
+ describe '1 argument' do
7
+ describe 'single String' do
8
+ describe '50.1, 5.0 ' do
9
+ it 'should create a GeoPoint' do
10
+ p1 = GeoPoint.new "50.1, 5.0"
11
+ p1.should be_a(GeoPoint)
12
+ p1.lat.should == 50.1
13
+ p1.lon.should == 5.0
14
+ p1.unit.should == :degrees
15
+ p1.earth_radius_km.should == 6371
16
+ end
17
+ end
18
+
19
+ describe '(50.1, 5.0)' do
20
+ it 'should create a GeoPoint' do
21
+ p1 = GeoPoint.new "(50.1, 5.2)"
22
+ p1.should be_a(GeoPoint)
23
+ p1.lat.should == 50.1
24
+ p1.lon.should == 5.2
25
+ p1.unit.should == :degrees
26
+ p1.earth_radius_km.should == 6371
27
+ end
28
+ end
29
+
30
+ describe '58 38 38N, 003 04 12W' do
31
+ it 'should create a GeoPoint' do
32
+ p1 = GeoPoint.new "58 38 38N, 003 04 12W"
33
+ p1.should be_a(GeoPoint)
34
+ p1.lat.should be_within(0.5).of(58.38)
35
+ p1.lon.should be_within(0.5).of(-3)
36
+ p1.unit.should == :degrees
37
+ p1.earth_radius_km.should == 6371
38
+ end
39
+ end
40
+
41
+ describe '(58 38 38N, 003 04 12W)' do
42
+ it 'should create a GeoPoint' do
43
+ p1 = GeoPoint.new "(58 38 38N, 003 04 12W)"
44
+ p1.should be_a(GeoPoint)
45
+ p1.lat.should be_within(0.5).of(58.38)
46
+ p1.lon.should be_within(0.5).of(-3) # W is negative, then normalize
47
+ p1.unit.should == :degrees
48
+ p1.earth_radius_km.should == 6371
49
+ end
50
+ end
51
+ end
52
+
53
+ describe 'single Array' do
54
+ describe '2 Fixed numbers: 50,5 ' do
55
+ it 'should create a GeoPoint' do
56
+ p1 = GeoPoint.new [50, 5]
57
+ p1.should be_a(GeoPoint)
58
+ p1.lat.should == 50
59
+ p1.lon.should == 5
60
+ p1.unit.should == :degrees
61
+ p1.earth_radius_km.should == 6371
62
+ end
63
+ end
64
+
65
+ describe '2 Float numbers: 50.1, 5.0 ' do
66
+ it 'should create a GeoPoint' do
67
+ p1 = GeoPoint.new [50.1, 5.0]
68
+ p1.should be_a(GeoPoint)
69
+ p1.lat.should == 50.1
70
+ p1.lon.should == 5.0
71
+ p1.unit.should == :degrees
72
+ p1.earth_radius_km.should == 6371
73
+ end
74
+ end
75
+
76
+ describe 'single Hash' do
77
+ describe 'with: {:lat => 50.1, :lng => 5.1}' do
78
+ it 'should create a GeoPoint' do
79
+ p1 = GeoPoint.new :lat => 50.1, :lng => 5.1
80
+ p1.should be_a(GeoPoint)
81
+ p1.lat.should == 50.1
82
+ p1.lon.should == 5.1
83
+ p1.unit.should == :degrees
84
+ p1.earth_radius_km.should == 6371
85
+ end
86
+ end
87
+
88
+ describe 'with: {:lat => 50.1, :long => 5.1}' do
89
+ it 'should create a GeoPoint' do
90
+ p1 = GeoPoint.new :lat => 50.1, :long => 5.1
91
+ p1.should be_a(GeoPoint)
92
+ p1.lat.should == 50.1
93
+ p1.lon.should == 5.1
94
+ p1.unit.should == :degrees
95
+ p1.earth_radius_km.should == 6371
96
+ end
97
+ end
98
+
99
+ describe 'with: {:latitude => 50.1, :longitude => 5.1}' do
100
+ it 'should create a GeoPoint' do
101
+ p1 = GeoPoint.new :latitude => 50.1, :longitude => 5.1
102
+ p1.should be_a(GeoPoint)
103
+ p1.lat.should == 50.1
104
+ p1.lon.should == 5.1
105
+ p1.unit.should == :degrees
106
+ p1.earth_radius_km.should == 6371
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end
112
+
113
+ describe 'with 2 arguments' do
114
+ describe '2 Fixed numbers (Fixnum)' do
115
+ it 'should create a GeoPoint' do
116
+ p1 = GeoPoint.new 50, 5
117
+ p1.should be_a(GeoPoint)
118
+ p1.lat.should == 50
119
+ p1.lon.should == 5
120
+ p1.unit.should == :degrees
121
+ p1.earth_radius_km.should == 6371
122
+ end
123
+ end
124
+
125
+ describe '2 Float numbers' do
126
+ it 'should create a GeoPoint' do
127
+ p1 = GeoPoint.new 50.1, 5.0
128
+ p1.should be_a(GeoPoint)
129
+ p1.lat.should == 50.1
130
+ p1.lon.should == 5.0
131
+ p1.unit.should == :degrees
132
+ p1.earth_radius_km.should == 6371
133
+ end
134
+ end
135
+
136
+ describe '2 Strings: "58 38 38N", "003 04 12W"' do
137
+ it 'should create a GeoPoint' do
138
+ p1 = GeoPoint.new "58 38 38N", "003 04 12W"
139
+ p1.should be_a(GeoPoint)
140
+ p1.lat.should be_within(0.5).of(58.38)
141
+ p1.lon.should be_within(0.5).of(-3)
142
+ p1.unit.should == :degrees
143
+ p1.earth_radius_km.should == 6371
144
+ end
145
+ end
146
+ end
147
+ end # initializer
148
+ end
@@ -0,0 +1,115 @@
1
+ require 'spec_helper'
2
+
3
+ # - www.movable-type.co.uk/scripts/latlong.html
4
+ describe GeoPoint do
5
+ describe '#lat' do
6
+ before :each do
7
+ @p1 = GeoPoint.new 50, 5
8
+ end
9
+
10
+ it 'should return latitude' do
11
+ @p1.lat.should == 50
12
+ end
13
+
14
+ describe '#latitude (alias)' do
15
+ it 'should return latitude' do
16
+ @p1.latitude.should == 50
17
+ end
18
+ end
19
+
20
+ describe '#to_lat (alias)' do
21
+ it 'should return latitude' do
22
+ @p1.to_lat.should == 50
23
+ end
24
+ end
25
+ end
26
+
27
+ describe '#lat=' do
28
+ before :each do
29
+ @p1 = GeoPoint.new 50, 5
30
+ end
31
+
32
+ it 'should set new latitude' do
33
+ @p1.lat = 60
34
+ @p1.lat.should == 60
35
+ end
36
+
37
+ it 'should set new latitude -2' do
38
+ @p1.lat = -2
39
+ @p1.lat.should == -2
40
+ end
41
+
42
+ it 'should convert latitude -182 to -2' do
43
+ @p1.lat = -2
44
+ @p1.lat.should == -2
45
+ end
46
+
47
+
48
+ it 'should set new latitude within allowed range' do
49
+ @p1.lat = 520
50
+ @p1.lat.should be_between(0, 360)
51
+ end
52
+
53
+ describe '#latitude (alias)' do
54
+ it 'should set latitude' do
55
+ @p1.lat = 72
56
+ @p1.latitude.should == 72
57
+ end
58
+ end
59
+ end
60
+
61
+ describe '#lon' do
62
+ before :each do
63
+ @p1 = GeoPoint.new 5, 50
64
+ end
65
+
66
+ it 'should return longitude' do
67
+ @p1.lon.should == 50
68
+ end
69
+
70
+ it 'should return longitude (via lng)' do
71
+ @p1.lng.should == 50
72
+ end
73
+
74
+ describe '#longitude (alias)' do
75
+ it 'should return longitude' do
76
+ @p1.longitude.should == 50
77
+ end
78
+ end
79
+
80
+ describe '#to_lng (alias)' do
81
+ it 'should return latitude' do
82
+ @p1.to_lng.should == 50
83
+ end
84
+ end
85
+ end
86
+
87
+ describe '#lon=' do
88
+ before :each do
89
+ @p1 = GeoPoint.new 5, 50
90
+ end
91
+
92
+ it 'should set new longitude' do
93
+ @p1.lat.should == 5
94
+ @p1.lon = 60
95
+ @p1.lon.should == 60
96
+ end
97
+
98
+ it 'should return longitude (via lng)' do
99
+ @p1.lng = 70
100
+ @p1.lng.should == 70
101
+ end
102
+
103
+ it 'should set new latitude within allowed range' do
104
+ @p1.lon = 520
105
+ @p1.longitude.should be_between(-180, 180)
106
+ end
107
+
108
+ describe '#latitude (alias)' do
109
+ it 'should set latitude' do
110
+ @p1.longitude = 72
111
+ @p1.longitude.should == 72
112
+ end
113
+ end
114
+ end
115
+ end
@@ -1,151 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  # - www.movable-type.co.uk/scripts/latlong.html
4
- describe GeoPoint do
5
- describe '#initializer' do
6
- describe '1 argument' do
7
- describe 'single String' do
8
- describe '50.1, 5.0 ' do
9
- it 'should create a GeoPoint' do
10
- p1 = GeoPoint.new "50.1, 5.0"
11
- p1.should be_a(GeoPoint)
12
- p1.lat.should == 50.1
13
- p1.lon.should == 5.0
14
- p1.unit.should == :degrees
15
- p1.radius.should == 6371
16
- end
17
- end
18
-
19
- describe '(50.1, 5.0)' do
20
- it 'should create a GeoPoint' do
21
- p1 = GeoPoint.new "(50.1, 5.2)"
22
- p1.should be_a(GeoPoint)
23
- p1.lat.should == 50.1
24
- p1.lon.should == 5.2
25
- p1.unit.should == :degrees
26
- p1.radius.should == 6371
27
- end
28
- end
29
-
30
- describe '58 38 38N, 003 04 12W' do
31
- it 'should create a GeoPoint' do
32
- p1 = GeoPoint.new "58 38 38N, 003 04 12W"
33
- p1.should be_a(GeoPoint)
34
- p1.lat.should be_within(0.5).of(58.38)
35
- p1.lon.should be_within(0.5).of(-3)
36
- p1.unit.should == :degrees
37
- p1.radius.should == 6371
38
- end
39
- end
40
-
41
- describe '(58 38 38N, 003 04 12W)' do
42
- it 'should create a GeoPoint' do
43
- p1 = GeoPoint.new "(58 38 38N, 003 04 12W)"
44
- p1.should be_a(GeoPoint)
45
- p1.lat.should be_within(0.5).of(58.38)
46
- p1.lon.should be_within(0.5).of(-3) # W is negative, then normalize
47
- p1.unit.should == :degrees
48
- p1.radius.should == 6371
49
- end
50
- end
51
- end
52
-
53
- describe 'single Array' do
54
- describe '2 Fixed numbers: 50,5 ' do
55
- it 'should create a GeoPoint' do
56
- p1 = GeoPoint.new [50, 5]
57
- p1.should be_a(GeoPoint)
58
- p1.lat.should == 50
59
- p1.lon.should == 5
60
- p1.unit.should == :degrees
61
- p1.radius.should == 6371
62
- end
63
- end
64
-
65
- describe '2 Float numbers: 50.1, 5.0 ' do
66
- it 'should create a GeoPoint' do
67
- p1 = GeoPoint.new [50.1, 5.0]
68
- p1.should be_a(GeoPoint)
69
- p1.lat.should == 50.1
70
- p1.lon.should == 5.0
71
- p1.unit.should == :degrees
72
- p1.radius.should == 6371
73
- end
74
- end
75
-
76
- describe 'single Hash' do
77
- describe 'with: {:lat => 50.1, :lng => 5.1}' do
78
- it 'should create a GeoPoint' do
79
- p1 = GeoPoint.new :lat => 50.1, :lng => 5.1
80
- p1.should be_a(GeoPoint)
81
- p1.lat.should == 50.1
82
- p1.lon.should == 5.1
83
- p1.unit.should == :degrees
84
- p1.radius.should == 6371
85
- end
86
- end
87
-
88
- describe 'with: {:lat => 50.1, :long => 5.1}' do
89
- it 'should create a GeoPoint' do
90
- p1 = GeoPoint.new :lat => 50.1, :long => 5.1
91
- p1.should be_a(GeoPoint)
92
- p1.lat.should == 50.1
93
- p1.lon.should == 5.1
94
- p1.unit.should == :degrees
95
- p1.radius.should == 6371
96
- end
97
- end
98
-
99
- describe 'with: {:latitude => 50.1, :longitude => 5.1}' do
100
- it 'should create a GeoPoint' do
101
- p1 = GeoPoint.new :latitude => 50.1, :longitude => 5.1
102
- p1.should be_a(GeoPoint)
103
- p1.lat.should == 50.1
104
- p1.lon.should == 5.1
105
- p1.unit.should == :degrees
106
- p1.radius.should == 6371
107
- end
108
- end
109
- end
110
- end
111
- end
112
-
113
- describe 'with 2 arguments' do
114
- describe '2 Fixed numbers (Fixnum)' do
115
- it 'should create a GeoPoint' do
116
- p1 = GeoPoint.new 50, 5
117
- p1.should be_a(GeoPoint)
118
- p1.lat.should == 50
119
- p1.lon.should == 5
120
- p1.unit.should == :degrees
121
- p1.radius.should == 6371
122
- end
123
- end
124
-
125
- describe '2 Float numbers' do
126
- it 'should create a GeoPoint' do
127
- p1 = GeoPoint.new 50.1, 5.0
128
- p1.should be_a(GeoPoint)
129
- p1.lat.should == 50.1
130
- p1.lon.should == 5.0
131
- p1.unit.should == :degrees
132
- p1.radius.should == 6371
133
- end
134
- end
135
-
136
- describe '2 Strings: "58 38 38N", "003 04 12W"' do
137
- it 'should create a GeoPoint' do
138
- p1 = GeoPoint.new "58 38 38N", "003 04 12W"
139
- p1.should be_a(GeoPoint)
140
- p1.lat.should be_within(0.5).of(58.38)
141
- p1.lon.should be_within(0.5).of(-3)
142
- p1.unit.should == :degrees
143
- p1.radius.should == 6371
144
- end
145
- end
146
- end
147
- end # initializer
148
-
4
+ describe GeoPoint do
149
5
  describe '#reverse_point' do
150
6
  before :each do
151
7
  @p = GeoPoint.new -2, 5
@@ -185,118 +41,6 @@ describe GeoPoint do
185
41
  end
186
42
  end
187
43
 
188
- describe '#lat' do
189
- before :each do
190
- @p1 = GeoPoint.new 50, 5
191
- end
192
-
193
- it 'should return latitude' do
194
- @p1.lat.should == 50
195
- end
196
-
197
- describe '#latitude (alias)' do
198
- it 'should return latitude' do
199
- @p1.latitude.should == 50
200
- end
201
- end
202
-
203
- describe '#to_lat (alias)' do
204
- it 'should return latitude' do
205
- @p1.to_lat.should == 50
206
- end
207
- end
208
- end
209
-
210
- describe '#lat=' do
211
- before :each do
212
- @p1 = GeoPoint.new 50, 5
213
- end
214
-
215
- it 'should set new latitude' do
216
- @p1.lat = 60
217
- @p1.lat.should == 60
218
- end
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
-
231
- it 'should set new latitude within allowed range' do
232
- @p1.lat = 520
233
- @p1.lat.should be_between(0, 360)
234
- end
235
-
236
- describe '#latitude (alias)' do
237
- it 'should set latitude' do
238
- @p1.lat = 72
239
- @p1.latitude.should == 72
240
- end
241
- end
242
- end
243
-
244
- describe '#lon' do
245
- before :each do
246
- @p1 = GeoPoint.new 5, 50
247
- end
248
-
249
- it 'should return longitude' do
250
- @p1.lon.should == 50
251
- end
252
-
253
- it 'should return longitude (via lng)' do
254
- @p1.lng.should == 50
255
- end
256
-
257
- describe '#longitude (alias)' do
258
- it 'should return longitude' do
259
- @p1.longitude.should == 50
260
- end
261
- end
262
-
263
- describe '#to_lng (alias)' do
264
- it 'should return latitude' do
265
- @p1.to_lng.should == 50
266
- end
267
- end
268
- end
269
-
270
- describe '#lon=' do
271
- before :each do
272
- @p1 = GeoPoint.new 5, 50
273
- end
274
-
275
- it 'should set new longitude' do
276
- @p1.lat.should == 5
277
- @p1.lon = 60
278
- @p1.lon.should == 60
279
- end
280
-
281
- it 'should return longitude (via lng)' do
282
- @p1.lng = 70
283
- @p1.lng.should == 70
284
- end
285
-
286
- it 'should set new latitude within allowed range' do
287
- @p1.lon = 520
288
- @p1.longitude.should be_between(-180, 180)
289
- end
290
-
291
- describe '#latitude (alias)' do
292
- it 'should set latitude' do
293
- @p1.longitude = 72
294
- @p1.longitude.should == 72
295
- end
296
- end
297
- end
298
-
299
-
300
44
  describe '#[]' do
301
45
  before :each do
302
46
  @p1 = GeoPoint.new 50, 5
@@ -323,28 +67,14 @@ describe GeoPoint do
323
67
  end
324
68
  end
325
69
 
326
- describe '#to_arr' do
70
+ describe '#to_a' do
327
71
  before :each do
328
72
  @p1 = GeoPoint.new 50, 5
329
73
  end
330
74
 
331
75
  it 'should return GeoPoint as an array depending on state of reverse_arr' do
332
- @p1.to_arr.should == [50, 5]
333
- end
334
-
335
- describe '#reverse_arr!' do
336
- it 'should reverse the array returned by #to_arr to [lng, lat]' do
337
- @p1.reverse_arr!
338
- @p1.to_arr.should == [5, 50]
339
- end
340
- end
341
-
342
- describe '#reverse_arr!' do
343
- it 'should turn effect of #to_arr back to normal [lat, lng]' do
344
- @p1.normal_arr!
345
- @p1.to_arr.should == [50, 5]
346
- end
347
- end
76
+ @p1.to_a.should == [50, 5]
77
+ end
348
78
  end
349
79
 
350
80
  describe '#to_lat_lng' do
@@ -0,0 +1,57 @@
1
+ require 'spec_helper'
2
+
3
+ class Converter
4
+ include GeoUnits::Converter
5
+ end
6
+
7
+ def converter
8
+ Converter.new
9
+ end
10
+
11
+ # - www.movable-type.co.uk/scripts/latlong.html
12
+ describe GeoUnits::Converter do
13
+ # deg, format, dp
14
+ describe '#to_lat' do
15
+ it 'should convert 58.3 to a latitude String in North direction' do
16
+ str_lat = converter.to_lat(58.3)
17
+ str_lat.should be_a(String)
18
+ expr = Regexp.escape "58".concat("\u00B0", "18", "\u2032", "00", "\u2033", "N")
19
+ str_lat.should match expr
20
+ end
21
+
22
+ it 'should convert -58.3 to a latitude String in South direction' do
23
+ str_lat = converter.to_lat(-58.3)
24
+ str_lat.should be_a(String)
25
+ expr = Regexp.escape "58".concat("\u00B0", "18", "\u2032", "00", "\u2033", "S")
26
+ str_lat.should match expr
27
+ end
28
+ end
29
+
30
+ # deg, format, dp
31
+ describe '#to_lon' do
32
+ it 'should convert 58.3 to a longitude String' do
33
+ str_lat = converter.to_lon(58.3)
34
+ str_lat.should be_a(String)
35
+ expr = Regexp.escape "58".concat("\u00B0", "18", "\u2032", "00", "\u2033", "E")
36
+ str_lat.should match expr
37
+ end
38
+
39
+ it 'should convert 58.3 to a longitude String' do
40
+ str_lat = converter.to_lon(-58.3)
41
+ str_lat.should be_a(String)
42
+ expr = Regexp.escape "58".concat("\u00B0", "18", "\u2032", "00", "\u2033", "W")
43
+ str_lat.should match expr
44
+ end
45
+ end
46
+
47
+ # Convert numeric degrees to deg/min/sec as a bearing (0º..360º)
48
+ # deg, format, dp
49
+ describe '#to_brng' do
50
+ it 'should convert 58.3 to a longitude String' do
51
+ brng = converter.to_brng(-58.3)
52
+ brng.to_f.should be_between(0, 360)
53
+ expr = Regexp.escape "301".concat("\u00B0", "42", "\u2032", "00")
54
+ brng.should match expr
55
+ end
56
+ end
57
+ end