已解决:
我正在尝试编写一个脚本,该脚本在给定一对纬度坐标的情况下计算距离,方位角和中点。
我发现公式很容易,但是我得到了错误的答案。可能只是数学上的错误,但我已经看了好多次了,而且还缺少一些东西。 我正在遵循此网站的公式: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
答案 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
}
'