ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

根据2个经纬度点,计算这2个经纬度点之间的距离(通过经度纬度得到距离)

2021-08-24 04:00:35  阅读:353  来源: 互联网

标签:AC lat1 AD 经纬度 CB cos 距离 经度 sin


转载: https://www.cnblogs.com/softfair/p/distance_of_two_latitude_and_longitude_points.html

球面上任意两点之间的距离计算公式可以参考维基百科上的下述文章。

值得一提的是,维基百科推荐使用Haversine公式,理由是Great-circle distance公式用到了大量余弦函数, 而两点间距离很短时(比如地球表面上相距几百米的两点),余弦函数会得出0.999...的结果, 会导致较大的舍入误差。而Haversine公式采用了正弦函数,即使距离很小,也能保持足够的有效数字。 以前采用三角函数表计算时的确会有这个问题,但经过实际验证,采用计算机来计算时,两个公式的区别不大。 稳妥起见,这里还是采用Haversine公式。

其中

  • R为地球半径,可取平均值 6371km;
  • φ1, φ2 表示两点的纬度;
  • Δλ 表示两点经度的差值。

代码

TODO

公式推导

VERSINE(F) = 1-cos(F)

Haversine名字来历是Ha-VERSINE,即Half-Versine ,表示sin的一半的意思。

hav(A) = (1-cos(A))/2 = sin(A/2)* sin(A/2)

推倒过程:

如下一个半径为1的圆,O是圆心,A、B是弦(chord)。角度AOB=theta。则角度AOC=theta/2。OC是垂直于AB的垂线(perpendicular)。AC长度是sin(theta/2),AB长度是2*sin(theta/2)。

如下地球图所示,假设半径R为1,O是球心,A (lat1,lon1) 和 B (lat2,lon2) 是我们感兴趣的2个点。2跟经度线 lon1,lon2相交于北极(north pole)N。EF所在的线是赤道(equator)。ACBD是平面上的等腰梯形的四个顶点(vertice)。AC和DB的弦(直线)在图上没有画出。CD的位置是:C (lat2,lon1) and D (lat1,lon2)。角度AOC是A点与C点的纬度差 dlat。角度EOF是经度E点和经度F点的差dlon。

弦AC的长度,参照图1的方式,那么是AC=2*sin(dlat/2),弦BD也是一样的长度。

E、F 2个点是赤道上的2个点,它们的纬度是0。EF的距离是EF=2*sin(dlon/2)

A、D2个点所在的纬度是lat1。AD所在纬度的圆平面的半径是cos(lat1)。从A作一条垂线(perpendicular)到OE为AG,AO是球半径,则OG=cos(lat1),即A、D所在纬度圆圈的半径(AO`)。

这时候,AD的弦长AD= 2sin(dlon/2)cos(lat1),类似的可以推出CB的长度= CB=2sin(dlon/2)cos(lat2)

下面看一下如何求AB的长度,回到平面等腰梯形,如下图:

AH是到CB的垂线(perpendicular),CH= (CB-AD)/2。

根据勾股定理(Pythagorean theorem): 【^2表示2的平方】

AH^2 = AC^2 - CH^2

 = AC^2 - (CB-AD)^2/4

HB 的长度是HB=AD+CH = AD+(CB-AD)/2 = (CB+AD)/2,根据勾股定理得到:

AB^2 = AH^2 + HB^2

   = AC^2 - (CB-AD)^2/4 + (CB+AD)^2/4
   = AC^2 + CB*AD

根据前面球面上的求经纬距离的方式,我们已经得到 AC、AD和CB的长度,代入公式得到:

AB^2 = 4(sin^2(dlat/2) + 4cos(lat1)cos(lat2)sin^2(dlon/2))

假设中间值h 是AB长度一半的平方,如下

h = (AB/2)^2

= (sin^2(dlat/2)) + cos(lat1) * cos(lat2) * sin^2(dlon/2)

(请参看代码里的h)

最后一步,是求得代表AB长度的角度AOB。参照图1的方式,我们可以知道

设AC=,根据勾股定理(Pythagorean theorem)得到:

x_i^2

OC= = sqrt(OA^2 - AC^2)

标签:AC,lat1,AD,经纬度,CB,cos,距离,经度,sin
来源: https://www.cnblogs.com/leon2014dresden/p/15178505.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有