您的位置:首页 > 其它

已知经纬度计算两点间距离

2012-06-27 09:39 369 查看
用低精度和高精度两种方法解答,两种方法的区别在于,低精度将地球看作球形,高精度将地球看作椭球。

#低精度公
float
geodist(L1, phi1,
L2, phi2)
{

Ri =
6371

d =
( Ri
*
acos(sin(phi1*(pi/180))*sin(phi2*(pi/180))
+
cos(phi1*(pi/180))*cos(phi2*(pi/180))*cos((L1
- L2)*(pi/180))))

res <-
round(d,
3)

return(res)
}

第二种高精度方案,高精度的方案的误差低于+_50m. 采用较为精密的公式,考虑到地球是一个椭球,a是地球的长轴,f是扁率,用如下公式计算

float Ctest1Dlg:: Caldistance(float lastlng,float lastlat,float curlng,float curlat)//返回的为米

{

double EarthRadiu = 6378.14;//地球半径

double temp = 1/298.257;

double F = (lastlat+curlat)/2;

double G = (lastlat - curlat)/2;

double ramda = (lastlng - curlng)/2;

double pi= 3.1415926;//pi

double S= (pow(sin(G*pi/180),2))*(pow(cos(ramda*pi/180),2)) + (pow(cos(F*pi/180),2))*(pow(sin(ramda*pi/180),2));

double C = (pow(cos(G*pi/180),2))*(pow(cos(ramda*pi/180),2)) + (pow(sin(F*pi/180),2))*(pow(sin(ramda*pi/180),2));

double omega = atan(sqrt(S/C));

double R= sqrt(S*C)/omega;

double D = 2*omega*EarthRadiu ;

double H1= (3*R-1)/(2*C);

double H2 = (3*R+1)/(2*S);

double res= 1000*D*(1 + temp*H1*(pow(sin(F*pi/180),2))*(pow(cos(G*pi/180),2)) - temp*H2*(pow(cos(F*pi/180),2))*(pow(sin(G*pi/180),2)));

return res;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: