因为项目需要,计算地球上,从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
推导不易,转载请保留出处,谢谢合作。
发表评论