将带有房屋的地图转换为图形

时间:2014-08-19 23:14:39

标签: graph maps graph-theory dijkstra shortest-path

我很好奇地图软件(Google / Bing地图)如何将地图转换为后端的图形。

Image of a graph and a map 现在,如果我们在交叉点1和2之间添加房屋,那么图表将如何变化。地图软件如何跟踪房屋的位置?

它们是否为交叉点节点编制索引,并且还有较小的“子节点”(在这种情况下为1到2之间)?或者他们通过多层来做到这一点?因此,当用户输入家庭号码时,它查找家庭所在的位置(即家庭所在的顶点之间)。之后,他们只是在这两个节点之间应用最短路径算法,在开始和结束时,它们基本上使主节点转到其中一个主顶点。

有人可以详细解释一下这是如何运作的吗?最后,我想了解如何确定两条“家”(或“子节点”)的“地址”,确定最短路径。

2 个答案:

答案 0 :(得分:2)

我只能代表GraphHopper,而不是你提到的闭源服务;)

GraphHopper有节点(连接点)和边(这些连接点之间的连接),几乎就是草图的样子。这对于路由算法来说非常快,因为它避免了子节点的大量遍历开销。例如。在早期版本中,每次连接都不是直线时我们使用子节点(例如弯曲的街道),这个速度慢了8倍,所以我们避开那些“支柱”节点,只使用“塔”节点进行路由。

仍然需要处理两个问题:

  • 如何处理从边缘开始的查询,例如门牌号码1?这是通过为每个查询引入虚拟节点(可以包含多个位置)来解决的,您还需要额外的虚拟边缘并隐藏一些真实边缘。在GraphHopper中,我们围绕原始图形(称为QueryGraph)创建一个轻量级的包装图,它处理所有这些。然后它就像Dijkstra或A *这样的每个'RoutingAlgorithm'的行为与普通'Graph'完全相同。当你在一个边缘有多个查询位置时,它也会变得有点毛茸茸,例如:对于具有多个通过点的路线。但我希望你能得到主要的想法。另一个想法是为两个源和两个目标进行路由,但是实际距离不是0,而是通常对第一个节点进行初始化。但这让我觉得路由算法更加复杂。
  • 如前所述,交叉点之间的大多数连接都不是直的,您必须将此几何体存储在某处并使用它来绘制路线,但也要“将位置捕捉到最近的道路”,最后要做到实际路由。有关代码,请参阅LocationIndexTree。

关于有向图。 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 -> bacb -> bc

  • 当从右边行驶时,允许左转弯进入垂直道路,
    因为包含了边cb -> bd

通过这种表示,每个节点(有向道路段)都具有沿其跨度的所有地址作为属性,每个地址沿着有向道路段标记一定距离。