由于地球是一个球体,计算两个经纬度之间的距离需要用到球面余弦公式。具体公式如下:
S=R·arccos[cosβ1cosβ2cos(α1-α2)+sinβ1sinβ2]
相应的计算代码为:
double getDistance(double lat1, double lng1,double lat2,double lng2)
{
double s = acos(cos(lat1)*cos(lat2)*cos(lng1-lng2)+sin(lat1)*sin(lat2));
s=s*EarthCenter; // EarthCenter=6378137
return s; // 返回值单位为m
}
注意:函数的参数都是用弧度表示的经纬度,经度转弧度只需要乘以 0.0174533即可
前面的球面余弦公式中有cos(lng1-lng2)项,当两点间距离很短时(比如相距几百米的两点),余弦函数会得出 0.99999...... 的结果,会导致较大的舍入误差。Haversine 方法进行了某种变换消除了 cos(lng1-lng2) 项,能够避免该问题。代码如下:
double getDistance(double lat1, double lng1,double lat2,double lng2)
{
double a=lat1-lat2;
double b=lng1-lng2;
double s=2*asin(sqrt(pow(sin(a/2),2)+cos(lat1)*cos(lat2)*pow(sin(b/2),2)));
s=s*EarthCenter;
return s;
}
评论
0 条评论
请登录写评论。