最近自己做的一个小东西要用到经纬度方面的计算,查遍中文网页见到的要么基本上是一帮惜字如金装大爷的“砖家”,要么就是像贴膏药一样,啪,一大堆代码往上一贴,一点说明都没有,让人看不懂,有的看了半天看懂了,结果他用的公式要么有使用局限(但没有半点声明)要么根本就是个错的。所以现在将自己几天学习来的在这里总结一下,方便后来人少走弯路。
这里主要解决四个问题:
1、已知两点经纬度,求一点相对于另一点方位角;
2、已知两点经纬度,求两点间距离;
3、已知一点经纬度及与另一点距离和方位角,求另一点经纬度;
4、问题1与问题2的简化算法。
注:简化算法的运算量和对系统的运算精度要求都大大降低,但只在短距离内(高纬地区建议10km以下)可以保证精度,除简化算法之外的算法可适用于地球上任意两点)。
一、方位角的求算
已知A、B两点经纬度,如何求出B相对于A的方位角?
——————————————————卖关子环节,可选择性跳过———————————————————
说到这里,人们或许会首先想因为地球是个球体,如果AB两点足够近(如相距1Km)可以当做平面三角形已知两临边求夹角,把两点的经度、纬度各自做差,差值作为两边的长度,再用反正切函数一算就得到了角度,似乎很有道理,但是如果将计算结果与实际测量值做比较,就会发现比较大的误差,而这种误差在某些地区甚至能用普通的量角器测量出来,其实这已经不叫误差,而叫错误了。这种近似利用平面几何知识解决问题的算法只适合于低纬度地区(例如南北纬10度),如果在高纬度使用这种方法,偏差会比较大,并且这种偏差会随着纬度的升高而大幅变大。例如,在北纬10度,AB两点经纬差0.001时,近似算法与真实值之间的偏差为0.44度。当纬度改为北纬40度其他不变,这时的偏差就达到了7.55度。
为什么会这样呢?其实原因就在于经线、纬线划定不同。如果把地球简化成一个球体,每条经线的长度都等于球体周长的一半,每条经线均在两极相交。但是,纬线之间互不相交,纬线所围成的圆均为“同轴”圆,所以每条纬线的长度会因纬度的不同而不同,也就是,纬度不同,1经度差所对应的球面距离是不一样的,例如,在赤道处,1纬度的跨度约为111.3千米,1经度的跨度也是约为111.3千米;在北纬40附近,1纬度的跨度没有变,但1经度的跨度却变为85.3千米。(转不过弯来的可以去看地球仪,看看就了然了~
)
——————————————————卖关子环节结束,正文开启———————————————————
那么,有没有一种对地球任何区域任意两点都普适的求方位角的方法?
答案是肯定的。
在求算前我们先对符号及单位进行