geodesic_wgs84 1.32.16 → 1.32.17

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
  SHA1:
3
- metadata.gz: 484164f90bf349f74e8cce75167b362e751eca85
4
- data.tar.gz: ec55ae2fe7c28b685d61e1ed0407718f2fad92b0
3
+ metadata.gz: d05f76ec707266ede381b02ed6734f911f2e8af6
4
+ data.tar.gz: 8a1eaba21553245498a8309dc606491839c55427
5
5
  SHA512:
6
- metadata.gz: 46b492042cc3dc9ffe58af012cba41953b121adc1ff66a029e0b07132a6b0c8875659e0a0d97b0737e1e0a331a76b3cdf8d6b550d71e6a87bf9e3653ec5e517d
7
- data.tar.gz: a31750e62e7f7eb299c3e4e8b32ce0a408b061f751a52020564290169ab7a33585cfc8de199a1acfaee02d0b8e5fb61b7959936c7c8372cd776cb999b82fc667
6
+ metadata.gz: 365788de78244ea88b7294536cd72f56de439d6bef89075bd80f67e4ebfcbbb1899466c334ae80b031ecb84cbb1113e87eb27b12bb7548dfa2f37ccc88c0751a
7
+ data.tar.gz: 19904afe323151bd542c10ac0a8ebb1b1ebf5c88270ba9a8bde8a86a8757b0019dfae851f088b0d36295d4c7c26017e8334d5ba2e0d058dc7fe5a9780ab596d9
@@ -228,6 +228,85 @@ wgs84_distance(int argc, VALUE *argv, VALUE klass)
228
228
  }
229
229
 
230
230
 
231
+ static VALUE
232
+ wgs84_course(double bearing)
233
+ {
234
+ char *ptr;
235
+
236
+ if (bearing < -157.5)
237
+ ptr = (char *) "S";
238
+ else if (bearing < -112.5)
239
+ ptr = (char *) "SW";
240
+ else if (bearing < -67.5)
241
+ ptr = (char *) "W";
242
+ else if (bearing < -22.5)
243
+ ptr = (char *) "NW";
244
+ else if (bearing < 22.5)
245
+ ptr = (char *) "N";
246
+ else if (bearing < 67.5)
247
+ ptr = (char *) "NO";
248
+ else if (bearing < 112.5)
249
+ ptr = (char *) "O";
250
+ else if (bearing < 157.5)
251
+ ptr = (char *) "SO";
252
+ else
253
+ ptr = (char *) "S";
254
+ return rb_str_new2(ptr);
255
+ }
256
+
257
+
258
+ static VALUE
259
+ wgs84_dist_course(int argc, VALUE *argv, VALUE klass)
260
+ {
261
+ int i;
262
+ double dbl[4], azi1, azi2, s12;
263
+ VALUE tmp1, tmp2;
264
+
265
+ if (argc == 4) {
266
+ for (i = 0; i < 4; i++)
267
+ dbl[i] = wgs84_get_value(argv[i]);
268
+ geod_inverse(&g, dbl[0], dbl[1], dbl[2], dbl[3], &s12, &azi1, &azi2);
269
+ return rb_ary_new3(3L, INT2NUM((int) round(s12)), INT2NUM((int) azi1), wgs84_course(azi1));
270
+ }
271
+
272
+ if (argc == 1 && TYPE(*argv) == T_ARRAY && RARRAY_LEN(*argv) == 4) {
273
+ for (i = 0; i < 4; i++)
274
+ dbl[i] = wgs84_get_value(rb_ary_entry(*argv, i));
275
+ geod_inverse(&g, dbl[0], dbl[1], dbl[2], dbl[3], &s12, &azi1, &azi2);
276
+ return rb_ary_new3(3L, INT2NUM((int) round(s12)), INT2NUM((int) azi1), wgs84_course(azi1));
277
+ }
278
+
279
+ if (argc == 2) {
280
+ tmp1 = rb_check_array_type(argv[0]);
281
+ tmp2 = rb_check_array_type(argv[1]);
282
+ if (!NIL_P(tmp1) && !NIL_P(tmp2)) {
283
+ dbl[0] = wgs84_get_value(rb_ary_entry(tmp1, 0));
284
+ dbl[1] = wgs84_get_value(rb_ary_entry(tmp1, 1));
285
+ dbl[2] = wgs84_get_value(rb_ary_entry(tmp2, 0));
286
+ dbl[3] = wgs84_get_value(rb_ary_entry(tmp2, 1));
287
+ geod_inverse(&g, dbl[0], dbl[1], dbl[2], dbl[3], &s12, &azi1, &azi2);
288
+ return rb_ary_new3(3L, INT2NUM((int) round(s12)), INT2NUM((int) azi1), wgs84_course(azi1));
289
+ }
290
+ }
291
+
292
+ if (argc == 1 && TYPE(*argv) == T_ARRAY && RARRAY_LEN(*argv) == 2) {
293
+ tmp1 = rb_check_array_type(rb_ary_entry(*argv, 0));
294
+ tmp2 = rb_check_array_type(rb_ary_entry(*argv, 1));
295
+ if (!NIL_P(tmp1) && !NIL_P(tmp2)) {
296
+ dbl[0] = wgs84_get_value(rb_ary_entry(tmp1, 0));
297
+ dbl[1] = wgs84_get_value(rb_ary_entry(tmp1, 1));
298
+ dbl[2] = wgs84_get_value(rb_ary_entry(tmp2, 0));
299
+ dbl[3] = wgs84_get_value(rb_ary_entry(tmp2, 1));
300
+ geod_inverse(&g, dbl[0], dbl[1], dbl[2], dbl[3], &s12, &azi1, &azi2);
301
+ return rb_ary_new3(3L, INT2NUM((int) round(s12)), INT2NUM((int) azi1), wgs84_course(azi1));
302
+ }
303
+ }
304
+
305
+ rb_raise(rb_eArgError, "wrong number of arguments");
306
+ return Qnil;
307
+ }
308
+
309
+
231
310
  static VALUE
232
311
  wgs84_average(VALUE klass, VALUE array, VALUE target)
233
312
  {
@@ -312,6 +391,7 @@ Init_geodesic_wgs84(void)
312
391
  rb_define_method(cWGS84, "as_bigdec", wgs84_as_bigdec, 1);
313
392
  rb_define_method(cWGS84, "lat_lon", wgs84_lat_lon, -1);
314
393
  rb_define_method(cWGS84, "distance", wgs84_distance, -1);
394
+ rb_define_method(cWGS84, "dist_course", wgs84_dist_course, -1);
315
395
  rb_define_method(cWGS84, "average", wgs84_average, 2);
316
396
  rb_define_method(cWGS84, "center", wgs84_center, 2);
317
397
  }
@@ -1,3 +1,3 @@
1
1
  module GeodesicWgs84
2
- VERSION = "1.32.16"
2
+ VERSION = "1.32.17"
3
3
  end
@@ -124,5 +124,13 @@ class TestGeodesicWgs84 < MiniTest::Test
124
124
  def test_lat_lon_wetzlar
125
125
  assert_equal [50.553778, 8.492278], @wgs84.lat_lon("50 33 13.6", "8 29 32.2")
126
126
  end
127
+
128
+ def test_dist_limburg_marburg
129
+ assert_equal [68058, -134], @wgs84.distance(50.833833, 8.769333, 50.405778, 8.082222)
130
+ end
131
+
132
+ def test_dist_course_limburg_marburg
133
+ assert_equal [68058, -134, "SW"], @wgs84.dist_course(50.833833, 8.769333, 50.405778, 8.082222)
134
+ end
127
135
  end
128
136
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: geodesic_wgs84
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.32.16
4
+ version: 1.32.17
5
5
  platform: ruby
6
6
  authors:
7
7
  - Volker Wiegand
@@ -80,7 +80,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
80
80
  version: '0'
81
81
  requirements: []
82
82
  rubyforge_project:
83
- rubygems_version: 2.4.2
83
+ rubygems_version: 2.4.4
84
84
  signing_key:
85
85
  specification_version: 4
86
86
  summary: Calculate distances on Earth using WGS84