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

来源:互联网 发布:php常用魔术方法 编辑:程序博客网 时间:2024/05/05 08:12
用低精度和高精度两种方法解答,两种方法的区别在于,低精度将地球看作球形,高精度将地球看作椭球。

#低精度公

floatgeodist(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;

}