本文将研究矢量地图以及A*算法等系统关键的技术支持。在实现的过程中,还引入了高德出行API、聚焦类爬虫、OpenStreetMap开源地图,二叉堆等技术。
通过解析OpenStreetMap提供的地图数据,获取不同类型的交通路网信息。然后将A*算法应用于路网数据中,并引入真实地理距离作为矢量地图的参数权重。最终找到两地之间的最短路径方案,成功的实现预期目标。
流程:
-
获取地图数据/路网数据化存储
-
不同路网数据获取(公共交通,机动车,自行车道,人行道....)
-
应用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),如此,循环。