我在比利时有2750个市中心。我需要知道每两个城市中心之间的距离。但这导致了57MB的矩阵,只是为了记住这些距离(甚至不记得路线),所以规模非常大。
相反,我正在考虑使用高速公路交叉口作为枢纽。基本上,每个城市都知道自己在附近的城市和枢纽(=高速公路交叉口)。所有集线器都知道彼此之间的距离。
因此,从一个城市A到另一个不邻近的城市B的距离可以通过cityA -> hubX -> hubY -> cityB
的距离来计算。因为大多数城市附近通常有3个枢纽,我可能需要查看所有9个组合,并选择最短的。但无论如何,它应该能更好地扩展记忆。
现在的问题是:我可以将高速公路交叉口描述为一个点吗想想看:一条高速公路由2条道路组成(双向一条),因此一个高速公路交叉口中心有4条道路(甚至不包括支路)。
一些想法:
- 您可以通过MapDB或GraphHopper的简单DataAccess实现使其独立于RAM
- 你可以使用浮动,应该只有~30MB,甚至更短,只使用公里数
- 您可以在不存储的情况下尝试按需路由,因为计算路由只需要几毫秒。禁用指令和计算点会使其速度提高一倍。你甚至可以禁用计算距离,只使用path.weight-这将给你另一个很好的加速,但需要更低级别的GraphHopper使用,只有当你知道自己在做什么时才推荐使用
现在回答你的问题。GraphHopper使用由节点(连接点)和边(连接连接点的街道)组成的图形模型。环形交叉路口仍然由多个节点组成。但一般来说,应该可以使用"离开"节点作为"集线器id"。
我看到了两种计算这些节点的方法:
- 要么运行合同层次结构,选择最高的1000个节点并将其定义为枢纽——这与"中转节点路由"文件中所描述的类似
- 或者计算从一个城市到所有其他城市的路线(或仅8个地理方向),并找到两条路线的最后一个公共节点来识别
对于这两种方法,您必须更深入地挖掘GraphHopper,并且可能需要较低级别的API。