地理空间位置关系判断与计算

出现场景:已知车辆行驶规划线路为从A点到B点,假设车辆为G点

提出问题:

  1. 判断G点在A点的方位(前后关系)
  2. 计算G点到A点的距离

问题分析:

  1. A,B经纬度为地球上具体的点,不属于同一平面,两点间距离不能以直线距离做计算
  2. A,B两点经纬度已知,AB长度已知
  3. G点经纬度已知,但由于GPS定位等问题会存在误差,G点可能出现任意地方
  4. 方向已知,从A到B
  5. 特殊情况分析,G点恰好位于AB线上

解决思路:

  1. 三角函数中的余弦函数(cos)
  2. 特殊情形分析
  3. 由于G点坐标存在误差,计算GA的距离时,直接计算两点距离,会存在更大的误差

方案思路:

1.判断G点在A两点的方位(前后关系)

cos函数图形如下:

  1. 特殊情况分析,G点坐标与A点或B点上,恰好重合
  2. 作位于A点的AB垂直线L
  3. 连接GA,GB两点,构成GAB三角形
  4. 由余弦函数图形结合∠A可能得到如下结论:
  5. 所以可以大致得到G点在AB线段上,位于A点所在的大致方位
2.判断G点到A点的距离

若想彻底忽略定位误差带来的计算结果误差,是很难的事情,这里我转换一种思路来处理该问题,这种思路在一些特定场景下实用性还可以,包括我做过的一些相关的项目也是用的这种方法。
理想情况下,G点应该是在AB线上移动,G点到A点的距离直接等于两点之间的实际记录,但由于G点的误差问题,G点大概率不在AB线上,所以我并不打算直接计算GA的距离,而将G点转变成AB线上的某一个点,然后计算该点到A点距离,由于AB端是固定不变,G点定位存在误差,所以能够尽可能减小该误差带来的问题。

  1. 针对COS(∠A)等于0,-1,1三种情况,做特殊处理,直接计算GA距离。
  2. 针对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);
}

题目深究

  1. 平面三角函数始终不符合地球的实际情况,可以考虑使用球坐标系下三角函数公式
  2. 上述距离计算方式依旧存在一定的误差,可以追求更加精准地理空间距离计算方法
  3. 数据清洗问题,不是每一个GPS点都是有效的数据,应该做一定的校验,清洗掉较为离谱的数据
  4. 实际情况下,预估线路有N个点构成的不规则线路,深入考虑转弯,环形等特殊地理形态,参照点B的选择上,择优选择,比如缩短AB两点的距离

参考资料

地理空间距离计算优化-美团技术团队

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值