已知球面经纬度求方位角和反方位角(awk一行代码实现)

已知球面经纬度求方位角和距离


一个常见的错误

假如你在广州,先朝东北走2000km,然后朝西南走2000km,你不会回到起点,而是到达深圳或者东莞。
这是因为地球是一个球面,方位角和反方位角加起来并不是360度。所以要朝着南偏西约49度的方向走2000km才能回到原点。


原理

球面上两点和北极点组成球面三角形,黎曼几何告诉我们,这个三角形内角和大于180度。而且起点到终点的方位角和终点到起点的方位角只和也不是180度。
已知球面的起点(lon1,lat1)和终点(lon2,lat2),求他们的方位角azi的公式是:
cos(azi)=sin(lon1-lon2)cos(lat2)/(cos(lat1)sin(lat2)-sin(lat1)cos(lat2)cos(lon1-lon2))


awk一行代码实现求起点到终点的方位角

#以下代码输入经纬度单位是度,输出方位角的单位也是度
echo $lon1 $lat1 $lon2 $lat2 | awk '{
  b1=$2*0.017453; 
  b2=$4*0.017453; 
  da=($3-$1)*0.017453; 
  y=sin(da)*cos(b2); 
  x=cos(b1)*sin(b2)-sin(b1)*cos(b2)*cos(da); 
  az=(atan2(y,x)/0.017453+360)%360; 
  print "Azimuth from (",$1,$2,") to (",$3,$4,") is",az," deg."}' | cat

求反方位角时,把起点重点的位置互换即可。

posted @ 2023-03-18 17:03  Philbert  阅读(92)  评论(0编辑  收藏  举报