出现场景:已知车辆行驶规划线路为从A点到B点,假设车辆为G点
提出问题:
- 判断G点在A点的方位(前后关系)
- 计算G点到A点的距离
问题分析:
- A,B经纬度为地球上具体的点,不属于同一平面,两点间距离不能以直线距离做计算
- A,B两点经纬度已知,AB长度已知
- G点经纬度已知,但由于GPS定位等问题会存在误差,G点可能出现任意地方
- 方向已知,从A到B
- 特殊情况分析,G点恰好位于AB线上
解决思路:
- 三角函数中的余弦函数(cos)
- 特殊情形分析
- 由于G点坐标存在误差,计算GA的距离时,直接计算两点距离,会存在更大的误差
方案思路:
1.判断G点在A两点的方位(前后关系)
cos函数图形如下:
- 特殊情况分析,G点坐标与A点或B点上,恰好重合
- 作位于A点的AB垂直线L
- 连接GA,GB两点,构成GAB三角形
- 由余弦函数图形结合∠A可能得到如下结论:
- 所以可以大致得到G点在AB线段上,位于A点所在的大致方位
2.判断G点到A点的距离
若想彻底忽略定位误差带来的计算结果误差,是很难的事情,这里我转换一种思路来处理该问题,这种思路在一些特定场景下实用性还可以,包括我做过的一些相关的项目也是用的这种方法。
理想情况下,G点应该是在AB线上移动,G点到A点的距离直接等于两点之间的实际记录,但由于G点的误差问题,G点大概率不在AB线上,所以我并不打算直接计算GA的距离,而将G点转变成AB线上的某一个点,然后计算该点到A点距离,由于AB端是固定不变,G点定位存在误差,所以能够尽可能减小该误差带来的问题。
- 针对COS(∠A)等于0,-1,1三种情况,做特殊处理,直接计算GA距离。
- 针对COS(∠A)不等于以上三种情况,做G点到AB点的垂直线,与AB线相交于P点,计算PA的距离,将PA的距离当做GA的距离做计算
3.G,A,B三点经纬度坐标确定,先计算三边长度,然后通过数学方法计算PA距离。
JAVA相关方法实现:
//π值
private static final double PI = 3.141592653589793238462643383279502884197d;
//地球半径(米)
private static final double EARTH_RADIUS = 6378137;
/**
* 角度转弧度
* @param angle 角度
* @return 弧度
*/
private static double radianSwitch(double angle){
return (angle / 360) * 2 * PI;
}
/**
* 计算地球两点距离
* @param lng1 角度
* @return 弧度
*/
public static double distanceHaversine(double originLng, double originLat, double destinationLng, double destinationLat) {
double originRadLat = radianSwitch(originLat);
double destinationRadLat = radianSwitch(destinationLat);
double a = originRadLat - destinationRadLat;
double b = radianSwitch(originLng - destinationLng);
double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(originRadLat) * Math.cos(destinationRadLat) * Math.pow(Math.sin(b / 2), 2)));
s = s * EARTH_RADIUS;
s = Math.round(s * 10000) / 10000.0;
return s;
}
/**
* 计算三角形ABC中,∠A的cos值
* @param aLength ∠A对边的长度
* @param bLength ∠B对边的长度
* @param cLength ∠C对边的长度
* @return cos(∠A)
*/
private static double calculateCos(double aLength,double bLength,double cLength){
return (Math.pow(bLength,2) + Math.pow(cLength,2) - Math.pow(aLength,2))/(2 * bLength * cLength);
}
题目深究
- 平面三角函数始终不符合地球的实际情况,可以考虑使用球坐标系下三角函数公式
- 上述距离计算方式依旧存在一定的误差,可以追求更加精准地理空间距离计算方法
- 数据清洗问题,不是每一个GPS点都是有效的数据,应该做一定的校验,清洗掉较为离谱的数据
- 实际情况下,预估线路有N个点构成的不规则线路,深入考虑转弯,环形等特殊地理形态,参照点B的选择上,择优选择,比如缩短AB两点的距离