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 +4 -4
- data/ext/geodesic_wgs84/geodesic_wgs84.c +80 -0
- data/lib/geodesic_wgs84/version.rb +1 -1
- data/spec/geodesic_wgs84_spec.rb +8 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d05f76ec707266ede381b02ed6734f911f2e8af6
|
4
|
+
data.tar.gz: 8a1eaba21553245498a8309dc606491839c55427
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
}
|
data/spec/geodesic_wgs84_spec.rb
CHANGED
@@ -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.
|
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.
|
83
|
+
rubygems_version: 2.4.4
|
84
84
|
signing_key:
|
85
85
|
specification_version: 4
|
86
86
|
summary: Calculate distances on Earth using WGS84
|