计算地球上两经纬度点 A B 间距离
2014-10-08 09:50
225 查看
在 GIS 应用中,计算两点之间距离的公式非常重要,这里仅列出几种计算方法。假设地球是一个标准球体,半径为 R, 并且假设东经为正,西经为负,北纬为正,南纬为负,则 A(x,y) 的坐标可表示为( R*cosy*cosx,R*cosy*sinx,R*siny ) B(a,b) 可表示为(R*cosb*cosa,R*cosb*sina,R*sinb)于是, AB 对于球心所张的角的余弦大小为
cosb*cosy*(cosa*cosx+sina*sinx)+sinb*siny=cosb*cosy*cos(a-x)+sinb*siny
因此 AB 两点的球面距离为
R*{arccos[cosb*cosy*cos(a-x)+sinb*siny]}
注意几点:1. x,y,a,b 都是角度,最后结果中给出的 arccos 因为弧度形式;2. 所谓的 “ 东经为正,西经为负,北纬为正,南纬为负 ” 是为了计算的方便。 比如某点为西经 145°,南纬 36° ,那么计算时可用 (-145°,-36°) ;3. AB 对球心所张角的球法实际上是求 <OA> 和 <OB> 两向量的夹角 K 。用公式 <OA>*<OB>=|OA|*|OB|*cosK 可以得到;4. 还有对相同点进行处理等。 参考资料 1 给出了计算通过两个点的经纬度计算距离;原理为:地球赤道上环绕地球一周走一圈共 40075.04 公里 , 而 @ 一圈分成 360 ° , 而每 1 ° ( 度 ) 有 60,每一度一秒在赤道上的长度计算如下: 40075.04km /360 ° =111.31955km 111.31955km /60=1.8553258km=1855.3m 而每一分又有 60 秒 , 每一秒就代表 1855.3m /60=30.92m 任意两点距离计算公式为 d = 111.12cos{1/[sin Φ Asin Φ B 十 cos Φ Acos Φ Bcos( λ B —λ A)]} 其中 A 点经度,纬度分别为λ A 和Φ A , B 点的经度、纬度分别为λ B 和Φ B , d 为距离。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;} 参考资料 2 给出计算经纬度距离的 matlab 版本(代码太长,读者可自己链接,这是参考了http://www.ga.gov.au/geodesy/calcs/ 的方法); 参考资料 3 给出了从 Google Map 得到启示的 C# 版本;下面就是 用 C# 根据经纬度求两点间距离的函数代码public static double DistanceOfTwoPoints( double lng1, double lat1, double lng2, double lat2, GaussSphere gs)
{
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 * (gs == GaussSphere.WGS84 ? 6378137.0 : (gs == GaussSphere.Xian80 ? 6378140.0 : 6378245.0 ));
s = Math.Round(s * 10000 ) / 10000 ;
return s;
}
private static double Rad( double d)
{
return d * Math.PI / 180.0 ;
}
GaussSphere 为自定义枚举类型
/**/ /// <summary>
/// 高斯投影中所选用的参考椭球
/// </summary>
public enum GaussSphere
{
Beijing54,
Xian80,
WGS84,
}
参考资料 5 给出了计算两点经纬度距离的众多方法,给出了计算公式(包括源码)和改进的方法。所有这些公司都是基于地球是球体的假设,这个假设对众多的目的应用已经足够了(实际上地球是一个类似椭球体,用一个球体计算模型最大的误差在 0.3% ,详见该网页中的笔记部分)。 参考资料1. 1. 某 Blog http://blog.csdn.net/yichangxin/archive/2009/02/16/3897553.aspx2. 2. 经纬度计算距离的 matlab 版本 http://crust.cn/?p=1973. 3. 用 C# 根据经纬度求两点间距离的函数代码 http://www.cnblogs.com/xionglee/articles/1493276.html4. 4. 权威计算方法 http://www.ga.gov.au/geodesy/calcs/5. 5. 计算脚本网页 http://www.movable-type.co.uk/scripts/latlong.htm z转载自:http://blog.csdn.net/wsh6759/article/details/5495482
cosb*cosy*(cosa*cosx+sina*sinx)+sinb*siny=cosb*cosy*cos(a-x)+sinb*siny
因此 AB 两点的球面距离为
R*{arccos[cosb*cosy*cos(a-x)+sinb*siny]}
注意几点:1. x,y,a,b 都是角度,最后结果中给出的 arccos 因为弧度形式;2. 所谓的 “ 东经为正,西经为负,北纬为正,南纬为负 ” 是为了计算的方便。 比如某点为西经 145°,南纬 36° ,那么计算时可用 (-145°,-36°) ;3. AB 对球心所张角的球法实际上是求 <OA> 和 <OB> 两向量的夹角 K 。用公式 <OA>*<OB>=|OA|*|OB|*cosK 可以得到;4. 还有对相同点进行处理等。 参考资料 1 给出了计算通过两个点的经纬度计算距离;原理为:地球赤道上环绕地球一周走一圈共 40075.04 公里 , 而 @ 一圈分成 360 ° , 而每 1 ° ( 度 ) 有 60,每一度一秒在赤道上的长度计算如下: 40075.04km /360 ° =111.31955km 111.31955km /60=1.8553258km=1855.3m 而每一分又有 60 秒 , 每一秒就代表 1855.3m /60=30.92m 任意两点距离计算公式为 d = 111.12cos{1/[sin Φ Asin Φ B 十 cos Φ Acos Φ Bcos( λ B —λ A)]} 其中 A 点经度,纬度分别为λ A 和Φ A , B 点的经度、纬度分别为λ B 和Φ B , d 为距离。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;} 参考资料 2 给出计算经纬度距离的 matlab 版本(代码太长,读者可自己链接,这是参考了http://www.ga.gov.au/geodesy/calcs/ 的方法); 参考资料 3 给出了从 Google Map 得到启示的 C# 版本;下面就是 用 C# 根据经纬度求两点间距离的函数代码public static double DistanceOfTwoPoints( double lng1, double lat1, double lng2, double lat2, GaussSphere gs)
{
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 * (gs == GaussSphere.WGS84 ? 6378137.0 : (gs == GaussSphere.Xian80 ? 6378140.0 : 6378245.0 ));
s = Math.Round(s * 10000 ) / 10000 ;
return s;
}
private static double Rad( double d)
{
return d * Math.PI / 180.0 ;
}
GaussSphere 为自定义枚举类型
/**/ /// <summary>
/// 高斯投影中所选用的参考椭球
/// </summary>
public enum GaussSphere
{
Beijing54,
Xian80,
WGS84,
}
参考资料 5 给出了计算两点经纬度距离的众多方法,给出了计算公式(包括源码)和改进的方法。所有这些公司都是基于地球是球体的假设,这个假设对众多的目的应用已经足够了(实际上地球是一个类似椭球体,用一个球体计算模型最大的误差在 0.3% ,详见该网页中的笔记部分)。 参考资料1. 1. 某 Blog http://blog.csdn.net/yichangxin/archive/2009/02/16/3897553.aspx2. 2. 经纬度计算距离的 matlab 版本 http://crust.cn/?p=1973. 3. 用 C# 根据经纬度求两点间距离的函数代码 http://www.cnblogs.com/xionglee/articles/1493276.html4. 4. 权威计算方法 http://www.ga.gov.au/geodesy/calcs/5. 5. 计算脚本网页 http://www.movable-type.co.uk/scripts/latlong.htm z转载自:http://blog.csdn.net/wsh6759/article/details/5495482
相关文章推荐
- JAVA 计算地球上任意两点(经纬度)距离
- php根据地球上任意两点的经纬度计算两点间的距离 原理
- 利用JS实现的根据经纬度计算地球上两点之间的距离
- JAVA计算地球上任意两点(经纬度)距离
- 计算地球上两经纬度点A B间距离
- mysql函数根据经纬度,计算地球上两点之间的距离
- JAVA 计算地球上任意两点(经纬度)距离
- 根据地球上任意两点的经纬度计算两点间的距离
- 根据经纬度计算地球上两点之间的距离的Sql Server函数
- JS实现的根据经纬度计算地球上两点之间的距离
- 地球经纬度计算两点距离
- 根据两点经纬度计算地球表面两点间的距离
- 求通过经纬度计算地球表面任意两点间距离的公式
- JAVA 根据经纬度计算地球上任意两点距离GPS
- 根据经纬度计算地球表面两点间的距离
- 根据经纬度计算地球上两点之间的距离js实现代码
- Delphi 根据经纬度计算地球上两点之间的距离
- 根据两点经纬度计算地球表面两点间的距离
- JAVA 计算地球上任意两点(经纬度)距离
- JavaScript 实现的根据经纬度计算地球上两点之间的距离