根据两点的经纬度求方位角和距离,等

最近自己做的一个小东西要用到经纬度方面的计算,查遍中文网页见到的要么基本上是一帮惜字如金装大爷的“砖家”,要么就是像贴膏药一样,啪,一大堆代码往上一贴,一点说明都没有,让人看不懂,有的看了半天看懂了,结果他用的公式要么有使用局限(但没有半点声明)要么根本就是个错的。所以现在将自己几天学习来的在这里总结一下,方便后来人少走弯路。

这里主要解决四个问题:

1、已知两点经纬度,求一点相对于另一点方位角;

2、已知两点经纬度,求两点间距离;

3、已知一点经纬度及与另一点距离和方位角,求另一点经纬度;

4、问题1与问题2的简化算法。

注:简化算法的运算量和对系统的运算精度要求都大大降低,但只在短距离内(高纬地区建议10km以下)可以保证精度,除简化算法之外的算法可适用于地球上任意两点。这里只是出于便于理解的目的来解释“原理”,具体到不同的编程环境还要自己做化简和注意单位。

在求算前我们先对符号及单位进行约定:

北纬为正,南纬为负;东经为正,西经为负

经纬度使用度,DDD.DDDDDD°,非度分或度分秒。

度数未加说明均采用角度制

R:地球平均半径

A,B,C表示球面上的三个点及球面上“弧线”在该点处所夹的角

O为球心

(注:因我考虑欠缺,没有注意字母C大小写较难分辨,所以此处提醒读者在后面的公式中注意C的大小写。)

一、方位角的求算

已知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千米。(转不过弯来的可以去看地球仪,看看就了然了~)

——————————————————卖关子环节结束,正文开启———————————————————

那么,有没有一种对地球任何区域任意两点都普适的求方位角的方法?

答案是肯定的。

现在我们开始计算

这里我们将已知数据代入,公式便写成:

第三步:求得正弦后,接下来我们要用一个不太常用的公式,球面正弦公式

将已知数据代入并稍微变形一下,公式写为:

用反正弦函数求角度,于是上式可直接写成

经过一系列计算,最后,就得到了最终结果。

似乎有人注意到了,以上的计算都是把地球看成标准的球体,而事实是地球是个椭圆,其实,地球的偏心率极低,各位可以将此法得到的计算结果与谷歌地球(WGS84坐标系统,我说的不是谷歌地图)上的结果进行对比,偏差是非常小的(我测的几个值,最大偏差0.5度)。

二、距离的求算

公式为

这里要注意,L的单位与R的单位一致,单位不同的不要忘记换算

PS:对于一些GPS接收机,其数据格式为NMEA-0183,经纬度数据为DDDMM.MMMM,需要将它转换为度,,公式为:

经纬度(度)=DDD+MM.MMMM/60

三、第二点经纬度的求算

最近在网上看到不少人在问第二点经纬度的求算,所以,这里也附加说一下求算方法。

都应该能想到一个最最最笨的方法,就是将前面两部分用的公式联立解方程。我想只有那些度娘知道里的专家会采用这种方法(因为这种方法费的唾沫最少)。

言归正传,解方程的方法可以,但是运算量极大,费时,对于一些系统不现实。

另一种方法,其实就是对方位角求算的再次运用。

已知Aj,Aw,L,R,Azimuth(这里的Azimuth依然定为B相对于A的方位角)。

首先求算c,

(注意此处L、R的单位要统一)之后求解a,将已知量代入,公式为:

求得a之后我们求解C,

写到这里应该都恍然大悟了吧,

Bw=90-a

Bj=Aj+C

生气是拿别人做错的事来惩罚自己

根据两点的经纬度求方位角和距离,等

相关文章:

你感兴趣的文章:

标签云: