很多人常常会有这样的疑问,知道两个点的经纬度,如:22:59:59.8888 113:59:59.8888 和
22:58:59.9999 113:59:59.9999, 怎么计算两者之间的距离。
这其实是测绘中的大地问题解算—大地问题反算,知道BL,求距离和方位角。
方法二比较简单,是网络上面找到的,出处已经不详,10米范围内和投影后的平面距离就差1cm。可用。
方法1是一个朋友写的,看起来比较专业。具体公式请参考武汉大学出版的《大地测量学》。
今天刚刚用到,所以和大家分享一下研究成果。
方法1:
/// <summary>
/// 大地主题反算—已知2点经纬度,求距离和方位角. 84椭球。help by Wjj.
/// </summary>
/// <param
name="latStart">起点纬度,单位:弧度</param>
/// <param
name="lonStart">起点经度,单位:弧度</param>
/// <param
name="latEnd">终点纬度,单位:弧度</param>
/// <param
name="lonEnd">终点经度,单位:弧度</param>
/// <param
name="dist">输出:大地线的距离,单位:m</param>
/// <param
name="angle">输出:大地线方位角,单位:弧度</param>
private void GeodesicLine(double latStart, double lonStart, double
latEnd, double lonEnd, ref double dist, ref double angle)
{
// 输入:170181690毫秒(47.272691666666667度),475273606, 170181698,
475273509,结果是2.05米
//WGS-84 ellipsphere
double e2 = 0.0066943799013;
double e = Math.Pow(e2 / (1 - e2), 0.5);
double a = 6378137.0;
double Bm = 0.5 * (latStart + latEnd);
double deltaL = lonEnd - lonStart;
double deltaB = latEnd - latStart;
double t = Math.Tan(Bm);
double p = e * Math.Cos(Bm);
double W = Math.Pow((1 - e2 * Math.Pow(Math.Sin(Bm), 2)),
0.5);
double Nm = a / W;
double Vm = Math.Pow(W * (1 + e * e), 0.5);
//
double r01 = Nm * Math.Cos(Bm);
double r21 = r01 * (1 - p * p - 9 * p * p * t * t) / 24;
double r03 = Nm * Math.Pow(Math.Cos(Bm), 3) * t * t / 24;
double S10 = Nm / (Vm * Vm);
double S12 = Nm * Math.Pow(Math.Cos(Bm), 2) * (-2 - 3 * t * t + 3 *
t * t * p * p) / 24;
double S30 = Nm * (p * p - t * t * p * p) / 8;
//
double T1 = r01 * deltaL + r21 * deltaB * deltaB * deltaL + r03 *
Math.Pow(deltaL, 3);
double T2 = S10 * deltaB + S12 * deltaB * deltaL * deltaL + S30 *
Math.Pow(deltaB, 3);
//
double t01 = t * Math.Cos(Bm);
double t21 = Math.Cos(Bm) * t * (3 + 2 * p * p - 2 * Math.Pow(p,
4)) / 24;
double t03 = Math.Pow(Math.Cos(Bm), 3) * t * (1 + p * p) /
12;