以bash计算中点,初始方位角和距离

时间:2019-11-22 17:25:44

标签: linux bash awk

已解决:

我正在尝试编写一个脚本,该脚本在给定一对纬度坐标的情况下计算距离,方位角和中点。

我发现公式很容易,但是我得到了错误的答案。可能只是数学上的错误,但我已经看了好多次了,而且还缺少一些东西。 我正在遵循此网站的公式:http://www.movable-type.co.uk/scripts/latlong-nomodule.html

这就是我得到的,输出是dist,方位角,中点经度,中点长

script.bash 1 -80 -3 -79.2

453.58,158.22,68.1258,95.390

这是我应该得到的:

script.bash 1 -80 -3 -79.2

453.6 168.7 -1 -79.6

因此,距离看起来不错。但是其他人全没了。有什么想法吗?

这是我的代码:

#!/bin/bash

lat1=$1
lat2=$3
lon1=$2
lon2=$4

#some basic info

R=6371

lat1r=`echo "$lat1*3.14159/180" | bc -l`
lat2r=`echo "$lat2*3.14159/180" | bc -l`
lon1r=`echo "$lon1*3.14159/180" | bc -l`
lon2r=`echo "$lon2*3.14159/180" | bc -l`

dLat=`echo "$lat2r - $lat1r" | bc -l`
dLon=`echo "$lon2r - $lon1r" | bc -l`

#Distance calculations
a=`echo "-s ($dLat/2) * -s ($dLat/2) + -c ($lat1r) * -c ($lat2r) * -s ($dLon/2) * -s ($dLon/2)" | bc -l`
c1=`echo "sqrt($a) " | bc -l`
c2=`echo "sqrt(1 - $a)" | bc -l`
cat=`echo "$c1,$c2"| awk -F',' '{ print atan2($1,$2) }'`
c=`echo "2*$cat" | bc -l`
d=`echo "$R*$c" | bc -l`

#Bearing calculation 

y=`echo "-s ($dLon) * -c ($lat2r)" | bc -l`
x=`echo "-c ($lat1r) * -s ($lat2r) - -s ($lat1r) * -c ($lat2r) * -c ($dLon)" | bc -l`

brng=`echo "$y,$x"| awk -F',' '{ print atan2($1,$2) }'`
brn=`echo "$brng * 180 / 3.14159" | bc -l`
echo "$brng * 180 / 3.14159" 

#Mid point calculation

Bx=`echo "-c ($lat2r) * -c ($dLon)" | bc -l`
By=`echo "-c ($lat2r) * -s ($dLon)" | bc -l`
atc1=`echo " -s ($lat1r) + -s ($lat2r)" | bc -l`
atc2=`echo " sqrt( ( -c ($lat1r) + $Bx )^2 + $By^2 ) "  | bc -l`

latmidr=`echo "$atc1,$atc2"| awk -F',' '{ print atan2($1,$2) }'`
latmid=`echo "$latmidr * 180 / 3.14159" | bc -l`

atc3=$By
atc4=`echo " -c ($lat1r) + $Bx" | bc -l`

lonmidr=`echo "$atc3,$atc4"| awk -F',' '{ print atan2($1,$2) }'`
lonmid=`echo "$lonmidr * 180 / 3.14159" | bc -l`

echo $d,$brn,$latmidr,$lonmid

1 个答案:

答案 0 :(得分:2)

对于shell脚本来说这是完全不适当的工作,您应该将其作为单个awk(或类似的Perl,ruby,python)脚本来完成。顺便说一句,将变量命名为与命令(cat)相同,会混淆代码并使其更易于出错。

这是您应该的起点(检查数学/转换,因为我几乎可以肯定,当用-s和{{ 1}}到bc等。正如我所猜测的那样):

-c

$ cat tst.sh
#!/usr/bin/env bash

awk -v lat1="$1" -v lat2="$3" -v lon1="$2" -v lon2="$4" '
BEGIN {
    #some basic info

    pi = 3.14159
    R  = 6371

    lat1r = lat1 * pi / 180
    lat2r = lat2 * pi / 180
    lon1r = lon1 * pi / 180
    lon2r = lon2 * pi / 180

    dLat = lat2r - lat1r
    dLon = lon2r - lon1r

    #Distance calculations
    a   = sin(dLat/2) * sin(dLat/2) + cos(lat1r) * cos(lat2r) * sin(dLon/2) * sin(dLon/2)
    c1  = sqrt(a)
    c2  = sqrt(1 - a)
    cat = atan2(c1,c2)
    c   = 2 * cat
    d   = R * c

    #Bearing calculation
    x = cos(lat1r) * sin(lat2r) - sin(lat1r) * cos(lat2r) * cos(dLon)
    y = sin(dLon) * cos(lat2r)

    brng = atan2(y,x)
    brn  = brng * 180 / pi
    print brng * 180 / pi

    #Mid point calculation

    Bx = cos(lat2r) * cos(dLon)
    By = cos(lat2r) * sin(dLon)
    atc1 = sin(lat1r) + sin(lat2r)
    atc2 = sqrt( (cos(lat1r) + Bx )^2 + By^2 )

    latmidr = atan2(atc1,atc2)
    latmid  = latmidr * 180 / pi

    atc3 = By
    atc4 = cos(lat1r) + Bx

    lonmidr = lon1r + atan2(atc3,atc4)
    lonmid  = lonmidr * 180 / pi

    print d, brn, latmid, lonmid
}
'