根据地球上任意两点的经纬度计算两点间的距离

转载 2012年03月27日 17:58:23

地球是一个近乎标准的椭球体,它的赤道半径为6378.140千米,极半径为 6356.755千米,平均半径6371.004千米。如果我们假设地球是一个完美的球体,那么它的半径就是地球的平均半径,记为R。如果以0度经线为基 准,那么根据地球表面任意两点的经纬度就可以计算出这两点间的地表距离(这里忽略地球表面地形对计算带来的误差,仅仅是理论上的估算值)。设第一点A的经 纬度为(LonA, LatA),第二点B的经纬度为(LonB, LatB),按照0度经线的基准,东经取经度的正值(Longitude),西经取经度负值(-Longitude),北纬取90-纬度值(90- Latitude),南纬取90+纬度值(90+Latitude),则经过上述处理过后的两点被计为(MLonA, MLatA)和(MLonB, MLatB)。那么根据三角推导,可以得到计算两点距离的如下公式:

C = sin(MLatA)*sin(MLatB)*cos(MLonA-MLonB) + cos(MLatA)*cos(MLatB)

Distance = R*Arccos(C)*Pi/180

这里,R和Distance单位是相同,如果是采用6371.004千米作为半径,那么Distance就是千米为单位,如果要使用其他单位,比如mile,还需要做单位换算,1千米=0.621371192mile

如果仅对经度作正负的处理,而不对纬度作90-Latitude(假设都是北半球,南半球只有澳洲具有应用意义)的处理,那么公式将是:

C = sin(LatA)*sin(LatB) + cos(LatA)*cos(LatB)*cos(MLonA-MLonB)

Distance = R*Arccos(C)*Pi/180

以上通过简单的三角变换就可以推出。

如果三角函数的输入和输出都采用弧度值,那么公式还可以写作:

C = sin(LatA*Pi/180)*sin(LatB*Pi/180) + cos(LatA*Pi/180)*cos(LatB*Pi/180)*cos((MLonA-MLonB)*Pi/180)

Distance = R*Arccos(C)*Pi/180

也就是:

C = sin(LatA/57.2958)*sin(LatB/57.2958) + cos(LatA/57.2958)*cos(LatB/57.2958)*cos((MLonA-MLonB)/57.2958)

Distance = R*Arccos(C) = 6371.004*Arccos(C) kilometer = 0.621371192*6371.004*Arccos(C) mile = 3958.758349716768*Arccos(C) mile

在实际应用当中,一般是通过一个个体的邮政编码来查找该邮政编码对应的地区中心的经纬度,然 后再根据这些经纬度来计算彼此的距离,从而估算出某些群体之间的大致距离范围(比如酒店旅客的分布范围-各个旅客的邮政编码对应的经纬度和酒店的经纬度所 计算的距离范围-等等),所以,通过邮政编码查询经纬度这样一个数据库是一个很有用的资源。
附:C#代码:

private const double EARTH_RADIUS = 6378.137;//地球半径
private static double rad(double d)
{
   return d * Math.PI / 180.0;
}

public static double GetDistance(double lat1, double lng1, double lat2, double lng2)
{
   double radLat1 = rad(lat1);
   double radLat2 = rad(lat2);
   double a = radLat1 - radLat2;
   double b = rad(lng1) - rad(lng2);

   double s = 2 * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin(a/2),2) +
    Math.Cos(radLat1)*Math.Cos(radLat2)*Math.Pow(Math.Sin(b/2),2)));
   s = s * EARTH_RADIUS;
   s = Math.Round(s * 10000) / 10000;
   return s;
}

相关文章推荐

JS实现的根据经纬度计算地球上两点之间的距离

最近用到了根据经纬度计算地球表面两点间距离的公式,然后就用JS实现了一下。 计算地球表面两点间的距离大概有两种办法。 第一种是默认地球是一个光滑的球面,然后计算任意两点间的距离,这个距离叫...

求通过经纬度计算地球表面任意两点间距离的公式

求通过经纬度计算地球表面任意两点间距离的公式 /// /// //经纬度类 /// vp:hsg /// create date:2011-05-04 //...

通过经纬度计算地球两点间的距离

设两点A、B的经、纬度分别为(jA,wA)(jB,wB),则半径为R的球面上两点间的最短距离(大圆弧)为: 弧AB=R*arccos[sin(wA)sin(wB)+cos(wA)cos(wB...
  • meeweed
  • meeweed
  • 2011年08月15日 09:50
  • 1332

如何通过经纬度粗略计算地球两点之间的距离?直接上代码

我们通过两点之间的经纬度,可以知道两点之间大致的夹角是多少度(相对地心来说)。这个可以通过勾股定理大致求得,当然这样求出来的角度不是很准,但足够用了。 可以通过下列式子计算两点之间的夹角。x1,y1为...

弗洛伊德(Floyd)算法求任意两点间的最短距离

最近要搞最短路径方面的工作,把2年前搞过的北京地铁换乘算法拿出来看看,顺带整理下写出来,和大家分享下,算是抛砖引玉吧 Floyd-Warshall算法(Floyd-Warshall algorit...
  • ha000
  • ha000
  • 2016年08月30日 14:06
  • 732

Dijkstra [迪杰斯特拉]算法思路(求单点到其他每个点的各个最短路径)Floyd算法:任意两点间最短距离

先给出一个无向图 用Dijkstra算法(迪杰斯特拉算法)找出以A为起点的单源最短路径步骤如下 应用Dijkstra算法计算从源顶点1到其它顶点间最短路径的过程列在下表中。 Di...
  • lingzhm
  • lingzhm
  • 2015年03月30日 19:50
  • 3821

Java二叉树排序及任意两点个节点间的最大距离

网上看到的基本都是c或c++实现的,参照同样的算法写了个java版的。 参考文章地址:http://blog.csdn.net/cxh342968816/article/details/665647...

HDU 5723 Abandoned country (并查集 + DFS+求解树上任意两点间的距离的平均值)

Abandoned country Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:根据地球上任意两点的经纬度计算两点间的距离
举报原因:
原因补充:

(最多只允许输入30个字)