真实地图最短路径规划(A*算法)

本文将研究矢量地图以及A*算法等系统关键的技术支持。在实现的过程中,还引入了高德出行API、聚焦类爬虫、OpenStreetMap开源地图,二叉堆等技术。

通过解析OpenStreetMap提供的地图数据,获取不同类型的交通路网信息。然后将A*算法应用于路网数据中,并引入真实地理距离作为矢量地图的参数权重。最终找到两地之间的最短路径方案,成功的实现预期目标。

流程:

  1. 获取地图数据/路网数据化存储

  2. 不同路网数据获取(公共交通,机动车,自行车道,人行道....)

  3. 应用A*算法于地图中

地图路径规划的本质是遍历地图中的所有节点,然后找到最短路径的过程[8]。算法中的图是由大量节点和连接节点之间的线组成的。这里说的节点指的是现实生活中的每一个分叉路口,只要出现需要选择方向的时候,在地图上呈现的就是一个节点(vertices)[14]。而连接节点的线则是指现实生活中的道路,例如上海的南京西路,它在地图上的数据身份是一个边(edge)。每一条边都带有相对应的权重,即现实世界中的物理距离。图拥有两种类型,即有向图和无向图。有向图指的是带有方向的边,即a指向b的边和b指向a的边是两种不同的边。这两条边,在无向图中则是同一条边。

根据周小镜的描述,最短路径算法的基础是将图中的节点遍历[8]。由于实际路网的复杂性,节点的遍历有可能会出现从某一顶点选择一条边搜索后,该边又与带有该顶点的另一条边相交[8]。从而导致该顶点的重复遍历。因此在遍历地图的过程中,需要对已访问过的节点进行标记,以防重复遍历的出现[8]。

A*算法的关键在于启发函数,即F(n)=G(n)+H(n)。F(n)指代起始节点到目标节点的总代价。G(n)表示当前节点n到起始节点的当前代价。H(n)则表示当前节点n到目标节点的预估代价。依据这个函数,从而使得每一个被搜索的节点n都有一个总代价F(n)。然后选择其中最小的总代价节点作为下一步节点。接着继续计算新加入的节点的F(n),如此,循环。

1.获取地图数据/路网数据化存储

将实际路网信息变成节点和边的数据结构形式并存储。以上海市交通路网为例。首先,通过OpenStreetMap(OSM)提供的Overpass API Query Form获取XML格式的上海市交通路网的信息。

在该XML文件中,可以发现,地理数据的数据结构是带有拓扑性质的数据。地理信息系统的点,线,面以及它们之间的关系通过XML中node,way和relation进行分别描述。各自标签下的tag用于记录其标签的属性信息。

<node>标签记录路网节点信息,它包含经度和纬度,是<way>标签的组成部分。

<way>标签记录路的信息,是一个包含大量<nd>的集合。其属性包含街道,高速公路等信息。 

<relation>标签将<way>和<node>结合在一起用于描述地理事物,例如公交路线和自行车道。

接着,使用ElementTree(元素树)方式对XML文件进行解析。该方式类似一种轻量级的DOM。相对于拥有大量函数的Simple API for XML(SAX)方法和需要将XML数据映射到内存中的树的Document Object Model(DOM)方法。ElementTree可以以更容易被理解的代码形式和更快的速度解析XML。通过ElementTree方法遍历获得搜索所有的<node>和<way>标签并定位。然后,导入Networkx库。下图展示的就是以实例化对象Map中的路网信息所绘制的SVG格式的上海市交通道路路网。 

2.不同路网数据获取

OpenStreetMap提供的XML文件中包含了许多不同类型的道路信息,例如公共交通道路,机动车道路,自行车道路或人行道道路等等。

本段将基于OpenStreetMap提供的数据结构解析出公共交通路线数据。公共交通道路信息主要被存储与<relation>标签中,作为<relation>的子标签。图14中展示的是公共交通路网中某一个<relation>标签的数据结构。根据OSM的官方网站中提供的XML中<relation>标签的数据结构,图15展示的是其<tag>子标签的各类属性和值,图16展示的是其<member>子标签的各类属性和值。<member>标签中的“type”属性node和way分别表示节点和道路,“ref”表示对应的ID号,“role”表示对应的类型是站点或站台。<tag>标签中的“k”表示属性,“v”表示值。当k=“route”是,v中的值可以代表道路类型,即公交车,地铁,人行道,有轨电车,火车等等。通过定位不同的<tag>标签还可以解析获取线路的方向,站点名称等多样化的信息。

图14: 

图15: OpenStreetMap官网上<relation>中<tag>属性值内容解析

图16: OpenStreetMap官网上<relation>中<member>属性值内容解析

解析公共交通路网数据的步骤如下。首先,需要确定当前标签记录的是道路信息,即<tag k=”type” v=”route”>。接着,确定道路的类型,公交,地铁,无轨电车和电车,即<tag k=”route” v=”bus/trolleybus/subway/tram”>。然后,收集<tag>标签中属性为“name”的值,以得到该条公共线路的起始站和终点站的站点信息。其次,遍历该<relation>标签下的<member>子标签中记录着way和node的ID信息并保存。最后,根据存储的ID信息获取对应的way和node的经度和纬度并存储。图17展示的是公共交通路网数据提取步骤的流程图。

TIP: 由于openstreetmap是一款国外的开源地图数据。因此国内路网数据上会存在一些缺失的现象,导致线路信息不完整。 例如,上海的公共交通线路数据,在openstreetmap中仅有少数线路。下图所示:

3.应用A*算法(A*算法应用于真实上海交通路网)

真实的交通路网地图区别于游戏中的栅格地图不同之处在于,真实的交通路网中的子节点扩展方式是找寻该父节点的最近直系节点,而不是节点的上下左右方位上的四个节点。它们之间的距离也不是固定为1,而是需要通过两节点的经度和纬度进行计算。

在寻找的过程中将使用韩忠民提供的两点的经纬度计算距离的近似公式[16]。假设有A, B两地,它们的纬度和经度分别是(lat1, lon1)和(lat2, lon2)。公式中S表示两地之间的距离(千米),a表示AB两地纬度之差(lat1-lat2),b表示AB两地经度之差(lon1-lon2),6378.137表示地球的半径(千米)。使用该公式计算出的距离精度和谷歌地图的距离精度误差在正负0.2米之内[16]。

然后,遍历地图中所有节点的经度和纬度。将其与起始地和目的地的经度和纬度进行距离计算,找出一定范围内的所有节点,并使用起始列表和目的列表分别保存被找到的节点的ID。接着,将起始列表中的所有节点于目的列表中的所有节点进行组合。两节点组合结果将作为Map对象中的起始节点和目的节点代入A*算法中。Map对象中的节点(node)间的地理距离也将使用韩忠民的距离近似函数进行计算,然后作为Map对象中边(edge)的权重。将节点组合代入A*算法中进行最优路径的寻找,如果不存在路径则会抛出异常。但如果两个节点列表中的所有节点组合的经度和纬度都不能通过A*算法找到它们之间的最优路径,则会扩大附近节点的搜索范围,每次增加10米。直到两个节点列表中出现可以找到最优路径的节点组合,搜索范围不再扩大,程序进入下一步运算。随后,将所有没有抛出异常的节点组合存放在字典中,并找到其中路径方案距离最小的节点组合。输出其节点组合中A*算法返回的字典回溯中的节点ID。将这些节点按照输出顺序进行连接,即可得到两节点之间的最短路径。

结束

最终测试:(图中显示的是整理过的路径规划数据,但后续还需再整理)

相比较高德地图app:

该项目的缺点:(亲自测试过的)

  • openstreetmap的数据不完整性。
  • 高德api存在的数据不确定性。
  • openstreetmap中的数据还需要进一步整理(当然了,按照上述方式10米10米的增加,可以解决部分路径规划问题。但这并不是真正的解决方案,具体请翻阅【陈舒燕. 基于OpenStreetMap的出行可达性分析与实现[D].上海师范大学,2010.】,上面有数据整理的方法。
  • 道路两节点之间取的是直线距离,未考虑道路弯曲的情况。

参考文献:

8. 周小镜. 基于改进A*算法的游戏地图寻径的研究[D].西南大学,2011.

14. 严寒冰,刘迎春.基于GIS的城市道路网最短路径算法探讨[J].计算机学报,2000(02):210-215.

16. 韩忠民.知经纬度计算两点精确距离[J].科技传播,2011(11):196+174.

  • 14
    点赞
  • 108
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
### 回答1: 基于A*算法真实路径最优路径规划系统是一种能够在真实地图上进行路径规划的系统。该系统利用A*算法地图进行搜索,找到起点到终点的最短路径。与传统的路径规划系统不同的是,该系统考虑了真实道路的拓扑结构和交通状况,能够更准确地预测行车时间和路况。同时,该系统还可以根据用户的需求进行多种路径规划,如最短路径、最快路径、最经济路径等。该系统在实际应用中具有广泛的应用前景,可以为人们提供更加便捷、高效的出行体验。 ### 回答2: 基于A*算法的最优路径规划系统是一种应用广泛的路径规划算法,其优点在于能够在高效率的时间内寻找到最优解,其可靠性和鲁棒性较好,被广泛应用于物流、自动导航、机器人路径规划等领域。 A*算法是一种启发式搜索算法,其核心思想是综合考虑当前的估价和实际代价,通过扩展已知的最短路径和候选路径来生成新的路径,从而在保持最佳路径目标前提下最优化解的速度。 对于真实路径的最优路径规划系统,首先要在地图上生成数据结构,将区域划分为节点和边。节点代表了地图上的某个点,边代表了两个相邻节点之间的距离和自由流时间。对于给定的起点和终点,通过地图中的a*算法找到从起点到终点最短的路径。 然而,真实路径的最优路径规划系统并非只考虑从A到B的最短路径问题,还需要考虑诸如交通拥堵、施工现场、公共交通等约束因素,这样就需要在A*算法基础上加入一些优化策略。 例如,可以引入较为简单的路况信息,对车速进行限制,避免在拥堵的路段上产生交通拥堵,对于首先到达施工现场的车辆,需要被优先分配绿灯,以减少交通拥挤问题。此外,还可以通过实时地获取信息,对系统进行调整,让系统能够自适应地应对路网中的各种状况。 总之,基于A*算法真实路径最优路径规划系统是一种高效、可靠的路径规划方案,在实际生活中具有很高的应用价值,尤其对于节约时间和减少交通拥堵问题有着非常积极的推动作用。 ### 回答3: A*算法是一种启发式搜索算法,主要用于解决最短路径问题。对于路径规划系统,A*算法可以帮助我们找到最优路径,从而实现更加高效和准确的目的地导航。 在基于A*算法的最优路径规划系统中,最重要的是确定合适的启发函数。启发函数可以通过估算每个节点到目标节点的距离来帮助筛选掉不必要的节点,从而缩小搜索范围,提高搜索效率。常见的启发函数有曼哈顿距离、欧几里得距离、切比雪夫距离等,而选择哪种启发函数需要根据具体情况来确定。 在实现过程中,首先需要将地图转换成一个二维矩阵,并将每个点作为节点,将其邻居节点与估价函数一起存储在一个优先队列中,再根据A*算法的原理,通过不断搜索直至找到目标节点来确定最短路径,并将路径保存在一个数组中,再输出即可。 值得注意的是,有些情况下,目标节点并不是唯一的,这时我们可以通过在启发函数中考虑到所有可能的目标节点来避免出现错误路径。此外,在路径规划系统中也需要考虑到一些阻碍物,比如建筑物、道路封锁等,这时需要将这些因素加入到启发函数里面,使得路径规划更加准确。 总之,基于A*算法实现最优路径规划系统既能够提高导航的效率,又能够保证路径搜索的准确性,因此在实际应用中有很大的优势和发展前景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值