我很好奇地图软件(Google / Bing地图)如何将地图转换为后端的图形。
现在,如果我们在交叉点1和2之间添加房屋,那么图表将如何变化。地图软件如何跟踪房屋的位置?
它们是否为交叉点节点编制索引,并且还有较小的“子节点”(在这种情况下为1到2之间)?或者他们通过多层来做到这一点?因此,当用户输入家庭号码时,它查找家庭所在的位置(即家庭所在的顶点之间)。之后,他们只是在这两个节点之间应用最短路径算法,在开始和结束时,它们基本上使主节点转到其中一个主顶点。
有人可以详细解释一下这是如何运作的吗?最后,我想了解如何确定两条“家”(或“子节点”)的“地址”,确定最短路径。
答案 0 :(得分:2)
我只能代表GraphHopper,而不是你提到的闭源服务;)
GraphHopper有节点(连接点)和边(这些连接点之间的连接),几乎就是草图的样子。这对于路由算法来说非常快,因为它避免了子节点的大量遍历开销。例如。在早期版本中,每次连接都不是直线时我们使用子节点(例如弯曲的街道),这个速度慢了8倍,所以我们避开那些“支柱”节点,只使用“塔”节点进行路由。
仍然需要处理两个问题:
关于有向图。 GraphHopper通过无向边存储图形,只需处理它就可以分别存储每个边缘和每个车辆的访问属性。因此,我们避免存储两个有向边及其所有属性(名称/几何/ ...),并使用例可能“单向用于汽车和双向自行车”等。它还允许在反方向上移动边缘对某些算法很重要,例如双向Dijkstra。如果图形将用于对访问属性进行建模,则无法进行此操作。
关于“几乎就是你的草图的样子”:节点1,3,7和8不存在,因为它们是“支柱”节点。相反,他们只会“存在”边缘的几何形状。
答案 1 :(得分:0)
要表示道路网络的连通性,您希望定向道路段为图形节点,交叉点为有向边线的集合。如果你可以沿X行驶然后转向或继续在Y上,则从X到Y有一个有向边。
请考虑以下示例。
a====b====c
|
| <--one way street, down
|
d
此图片的示例连接图如下所示。
节点
ab
ba
bc
cb
bd
边
ab -> bc
ab -> bd
cb -> ba
cb -> bd
请注意,这会对以下信息进行编码:
交叉路口不允许掉头,
因为省略了边ab -> ba
和cb -> bc
。
当从右边行驶时,允许左转弯进入垂直道路,
因为包含了边cb -> bd
。
通过这种表示,每个节点(有向道路段)都具有沿其跨度的所有地址作为属性,每个地址沿着有向道路段标记一定距离。