blob: ac6560b3e9e7891a630a0d59995a10c5a622cff0 (
plain) (
blame)
1
2
3
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
#!/bin/bash
set -eu
API_URL='http://api.open-notify.org/iss-now.json'
GEOIP_URL="https://ipapi.co/json"
if [ "$#" -gt 0 ] ; then
OUTPUT="$1"
else
OUTPUT=""
fi
API_data=$(curl -s "$API_URL")
latitude="$(echo "$API_data"|jq -r '. | .iss_position.latitude')"
longitude="$(echo "$API_data"|jq -r '. | .iss_position.longitude')"
my_location=$(curl -s "$GEOIP_URL")
my_lat=$(echo "$my_location" | jq -r '. | .latitude')
my_long=$(echo "$my_location" | jq -r '. | .longitude')
# my_lat="50.0769160"
# my_long="14.4740344"
# . "mirkarte/geo.sh"
distance() {
# Original version of geo.sh script from https://edugit.org/-/snippets/27
# make GNU bc use POSIX mode and shut up
BC_ENV_ARGS=-qs
export BC_ENV_ARGS
# assignment of constants, variables and functions
# p: multiply with to convert from degrees to radians (π/180)
# r: earth radius in metres
# d: distance
# h: haversine intermediate
# i,j: (lat,lon) point 1
# x,y: (lat,lon) point 2
# k: delta lat
# l: delta lon
# m: sin(k/2) (square root of hav(k))
# n: sin(l/2) ( partial haversine )
# n(x): arcsin(x)
# r(x,n): round x to n decimal digits
# v(x): sign (Vorzeichen)
# w(x): min(1, sqrt(x)) (Wurzel)
bc -l <<-EOF
scale=64
define n(x) {
if (x == -1) return (-2 * a(1))
if (x == 1) return (2 * a(1))
return (a(x / sqrt(1 - x*x)))
}
define v(x) {
if (x < 0) return (-1)
if (x > 0) return (1)
return (0)
}
define r(x, n) {
auto o
o = scale
if (scale < (n + 1)) scale = (n + 1)
x += v(x) * 0.5 * A^-n
scale = n
x /= 1
scale = o
return (x)
}
define w(x) {
if (x >= 1) return (1)
return (sqrt(x))
}
/* WGS84 reference ellipsoid: große Halbachse (metres), Abplattung */
i = 6378137.000
x = 1/298.257223563
/* other axis */
j = i * (1 - x)
/* mean radius resulting */
r = (2 * i + j) / 3
/* coordinates */
p = (4 * a(1) / 180)
i = (p * $1)
j = (p * $2)
x = (p * $3)
y = (p * $4)
/* calculation */
k = (x - i)
l = (y - j)
m = s(k / 2)
n = s(l / 2)
h = ((m * m) + (c(i) * c(x) * n * n))
d = 2 * r * n(w(h))
r(d, 3)
EOF
}
# distance lat1 lon1 lat2 lon2 → metres (rounded to millimetres), error < ¼%
dist="$(distance "$latitude" "$longitude" "$my_lat" "$my_long")"
if [ -n "$OUTPUT" ] ; then
printf "%'d km\n" $(( "${dist%.*}" / 1000 )) >"$OUTPUT"
else
printf "%'d km\n" $(( "${dist%.*}" / 1000 ))
fi
|