在实际开发过程中我遇到以下问题:
已知A、B、C经纬度,求点A到直线BC距离的问题,在这里分享下我的解决方案。
地球坐标系上的三角形.png
首先我们求出 AB、AC、BC 的距离 c,b,a。
以下为根据经纬度计算距离的代码
private final static double EARTH_RADIUS = 6378137.0;
/**
* 计算两点距离
*
* @param lat_a
* @param lng_a
*
* @param lat_b
* @param lng_b
* @return
*/
public static double getDistance(double lat_a, double lng_a, double lat_b, double lng_b) {
double radLat1 = (lat_a * Math.PI / 180.0);
double radLat2 = (lat_b * Math.PI / 180.0);
double a = radLat1 - radLat2;
double b = (lng_a - lng_b) * Math.PI / 180.0;
double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2)
+ Math.cos(radLat1) * Math.cos(radLat2)
* Math.pow(Math.sin(b / 2), 2)));
s = s * EARTH_RADIUS;
s = Math.round(s * 10000d) / 10000d;
return s;
}
第二步我们求出半周长 p =( a + b + c ) / 2。
第三步我们根据海伦-秦九昭算法求面积S=√p(p - a)(p - b)(p - c)。
最后A到直线BC距离 = 2 * S / a.
以下为java代码。
//求外接圆半周长p
double p = (a + b + c) / 2;
//根据海伦-秦九昭算法求面积S
double S = Math.sqrt(Math.abs(p * (p - a) * (p - b) * (p -c)));
double distance = S == 0 ? 0d : (2 * S / c);
网友评论