diff options
Diffstat (limited to 'iss_above.sh')
-rwxr-xr-x | iss_above.sh | 104 |
1 files changed, 76 insertions, 28 deletions
diff --git a/iss_above.sh b/iss_above.sh index c5857ab..c67d350 100755 --- a/iss_above.sh +++ b/iss_above.sh @@ -1,5 +1,5 @@ #!/bin/bash -set -eux +set -eu API_URL='http://api.open-notify.org/iss-now.json' @@ -11,32 +11,80 @@ longitude="$(echo $API_data|jq -r '. | .iss_position.longitude')" my_lat="50.0769160" my_long="14.4740344" -. "mirkarte/geo.sh" +# . "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 < ¼% -echo "$(distance $latitude $longitude $my_lat $my_long)" - -## -## processResult: function() { -## this.task_queue--; -## -## if (this.task_queue === 0) { -## // print('our location: ' + this.current_location.toSource()); -## // print('iss coordinates: ' + this.iss_coords.toSource()); -## -## let dist = this.get_distance(this.current_location.Latitude, -## this.current_location.Longitude, -## this.iss_coords.iss_position.latitude, -## this.iss_coords.iss_position.longitude) -## -## print('ISS is ' + dist + ' km away.'); -## -## Mainloop.quit(); -## } -## } -##}); -## -##let client = new ISS_Above(); -##client.run(); -## -##Mainloop.run(); +dist="$(distance $latitude $longitude $my_lat $my_long)" +printf "%'d km\n" $(( "${dist%.*}" / 1000 )) |