首页 > 技术文章 > arcgis for js : 路径规划与定位的一种解决方案。

northwest332 2021-08-31 16:55 原文

这里只简单描述一下实现的核心步骤,代码就不上了。

原始需求:

一辆车从起点行驶至终点,获取车辆的实时位置数据,连同其行驶轨迹一起在地图上可视化,并计算剩余的距离和时间。

如上图。

原始方案:

原始方案是在一切情况理想的条件下诞生的。

1)地图加载完成后,根据【起点】与【终点】,在地图上规划出一条路径。

2)当有车辆的实时位置数据传过来,获取车辆的经纬度坐标和方向,在地图上进行定位和可视化。

3)历史路径(车辆已行驶的路径),通过存储所有接收到的车辆位置数据,来画出一条灰色的轨迹线。

4)剩余路径,每次车辆位置变化时,都根据【当前位置】与【终点】,重新在地图上规划出一条路径,重新计算剩余距离和时间。

ps.如果程序启动时,车辆已行驶到中途,可根据【起点】与【当前位置】进行路径规划,来获取历史路径。

实际应用中存在的问题:

1.车辆定位数据的经纬度甚至是方向,在某些时间、某些区域内偏差非常大;

2.路径规划的偏差非常大,相邻的两个位置点,规划出的路径大相径庭;

3.车辆的起点固定,但终点不固定,终点是由多个距离甚远的点组成的集合。

ps. 前两个误差导致,计算剩余距离精确到米、计算剩余时间精确到秒,是一件非常困难的事情。

实际需求:

由于定位的条件不太合适,所以放弃一定的实时性,模糊车辆的实时定位。

1)地图加载完成后,根据【起点】与【终点】,在地图上规划出一条路径,作为唯一路径,从此不再规划路径,该路径实际上是一个路径点集合。

希望这张图没有唤醒你的蛇类恐惧症。

路径点在直行时较为稀疏,在转弯时非常密。

2)适用于接收车辆位置数据时,车辆并不在起点的情形:

接收到车辆数据时,通过当前点,找到唯一路径中离它最近的点,作为车辆当前位置。

此时,由于各因素的误差影响,车辆的实际位置,并不在规划好的路径上。

所以,可以在当前位置画一个圆,半径为10米(或者任何你认为合理的范围),求这个圆与轨迹相交的点集合。

arcgis for js的求交集的方法:
esri/geometry/geometryEngine:intersect(geometry, intersector)

如果不相交,该方法的返回值为空;
如果相交,该方法会返回一个点数组。

注意:真正相交的只有两个点,实际上返回可能不止这两个相交的点,更类似于是一个交集,交集中不一定包含路径点。

怎么去选择一个点作为车辆在轨迹上的当前位置呢,这个我没处理,直接选了最后一个点,有误差,但鉴于圆的半径仅10米,我觉得这个误差可以接受。

如果画的圆没有和轨迹线相交,那就递归,下次有位置数据传进来的时候,再找,找到为止。

以上,车辆初始位置(不一定是起点,是车辆第一次在地图上定位的位置)就获取到了。

现在我们需要找到历史路径和剩余路径。

原理很简单,就是:
【当前位置点】--【终点】的点数组,视作剩余路径;
【起点】--【当前位置点】的点数组,视作历史路径。

这两段距离找起来也并不是很麻烦。

找到离【当前位置点】最近的轨迹点:
esri/geometry/geometryEngine:nearestCoordinate(geometry, inputPoint)

第一个参数是规划好的路径,第二个参数是【当前位置点】。

该方法会返回 【最近点】在路径上的索引index,以及【最近点】在【当前位置点】的左边还是右边。

如果【最近点】在【当前位置点】的左边,则历史路径应该将0-index所有点、当前点放进去,未来路径将当前点,index+1到最后一个点放进去。
如果【最近点】在【当前位置点】的右边,则历史路径应该将0-(index-1)所有点、当前点放进去,未来路径将当前点,index到最后一个点放进去.

3)车辆的位置移动:

由于实时位置数据不可靠,所以放弃通过实时位置数据定位。

这里通过实时速度(可靠)来定位。

当收到车辆数据时,在当前位置点画一个圆,圆的半径是速度。

求这个圆与未来路径的交集-交集是一个点数组。

假如当前点为point,这个点数组为[a,b,c,d,e,f,g]:

那么依次求point-a、point-b,point-a-b,point-a-b-c......的距离,距离与半径(或者速度)最接近的,就选择其为下一步的落脚点。

假如落脚点是c,那么把a,b,c都放进历史路径。

找到c点以后,就像之前那样,找离c最近的路径点,找到未来路径,历史路径已经在上一步找到了。

计算距离和时间。

为什么要遍历计算距离,搞得这么复杂呢 = =

是为了解决实际应用中的一个倒霉的问题:单行道!!!

一条路,中间隔开,两边是单行道,彼此之间间隔距离很窄,同时车辆方向数据又不对,就很容易出现跳到另一条单行道的情况。

哎终于写完了,累死我了。

推荐阅读