summaryrefslogtreecommitdiffstats
path: root/iss_above.sh
diff options
context:
space:
mode:
Diffstat (limited to 'iss_above.sh')
-rwxr-xr-xiss_above.sh104
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 ))