GPS两点移动距离计算方法

2018-02-01 22:55:29  阅读 6489 次 评论 0 条

因为项目需要,计算地球上,从A点向B点移动一段距离后,中间这个点的GPS坐标。

百度很久,找到了很多计算两点距离的代码,没有移动后的计算方法。

只有自己画图,根据各种三角公式终于计算出正确的坐标,很烧脑的过程。。。。

图就不贴了,直接上代码,代码是用java写的,其它语言换成相应的三角函数即可

/**
 * 计算两点距离
 * @param lat1
 * @param lng1
 * @param lat2
 * @param lng2
 * @return
 */
public static double getDistance1(double lat1, double lng1, double lat2, double lng2){
    double wA = rad(lat1);
    double wB = rad(lat2);
    double cod = rad(lng1) - rad(lng2);
    double s = Math.acos(Math.cos(wA) * Math.cos(wB) * Math.cos(cod) + Math.sin(wA)*Math.sin(wB));
    s = s * EARTH_RADIUS;
    return s;
}

/**
 * 从一点向另一点移动指定距离
 * @param latFrom   起点纬度
 * @param lngFrom   起点经度
 * @param latTo     终点纬度
 * @param lngTo     终点经度
 * @param d         移动距离,单位千米
 * @return  返回移动后点的坐标,结果为 double[2],内容依次是纬度、经度
 */
public static double[] move(double latFrom, double lngFrom, double latTo, double lngTo, double d){
    double r = EARTH_RADIUS;
    double wA = rad(latFrom);
    double jA = rad(lngFrom);
    double wB = rad(latTo);
    double jB = rad(lngTo);
    //求纬度
    double ab = sqrt(2*r*r*(1-cos(wA)* cos(wB) * cos(jB - jA) - sin(wA)*sin(wB)));
    double v_bao = acos(ab / 2 / r);
    double v_moa = d / r;
    double v_amo = rad(180 - deg(v_moa) - deg(v_bao));
    double am = r * sin(v_moa)/sin(v_amo);
    double om = r * sin(v_bao) / sin(v_amo);
    double v_bae = asin(r*(sin(wB) - sin(wA))/ab);
    double mn =  sin(v_bae) * am;
    double mp = mn + r*sin(wA);
    double v_mop = asin(mp / om);
    double wT = deg(v_mop);
    //求经度
    double an = cos(v_bae) * am;
    double cp = an;
    double op = cos(v_mop) * om;
    double oc = r * cos(wA);
    double v_poc = acos((pow(op,2) + pow(oc,2) - pow(cp,2))/ (2*op*oc));
    double jT = jA + v_poc * ((lngTo - lngFrom) / Math.abs(lngTo - lngFrom));
    jT = deg(jT);
    double[] wj = new double[2];
    wj[0] = wT;
    wj[1] = jT;
    return  wj;
}


数学知识基本忘的差不多了,感谢箜_Kong博客提供的公式,我才一步步推导出来。

参考文献:http://blog.csdn.net/liminlu0314/article/details/8553926

推导不易,转载请保留出处,谢谢合作。


本文地址:http://bloguan.com/?id=364
版权声明:本文为原创文章,版权归 博观网 所有,欢迎分享本文,转载请保留出处!

发表评论


表情

还没有留言,还不快点抢沙发?