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


鄂公网安备 42018502001427号
发表评论