#!/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