边缘索引如何在 graphhopper 中工作?

How edge indexing works in graphhopper?

我带着一个新问题来到这里。

我正在制作一个自定义算法,需要为图形边缘预先计算数据。我这样使用 AllEdgesIterator :

AllEdgesIterator it = graph.getAllEdges();
int nbEdges = it.getCount();
int count = 0;

int[] myData = new int[nbEdges];

while (it.next())
{
    count++;
    ...
}

第一个奇怪的事情是nbEdges等于15565条边但是count只等于14417。这怎么可能?

第二个奇怪的事情是当我 运行 我的自定义 A* 时:我只是使用 outEdgeExplorer 浏览节点,但我在 myData 数组的索引 15569 处得到了一个 IndexOutOfBound。我认为边缘索引包含在 [0 ; N-1] 其中N是边数,真的是这样吗?

这里会发生什么?顺便说一句,我禁用了图形收缩层次结构。

感谢您每次都这么快的回答!

The first weird thing is that nbEdges is equal to 15565 edges but count is only equal to 14417. How is it possible ?

这是因为 'compaction' 删除了无法到达的子网,但目前只有节点从图中删除,边缘只是断开连接并留在边缘 - 'array' 标记为已删除。所以 iter.getCount 只是一个上限,但是 AllEdgeIterator 在迭代时正确地排除了这些未使用的边缘并且具有正确的计数。但是使用 iter.getCount 分配您的自定义数据数组是正确的做法。

关于第二个问题:这可能是因为 QueryGraph 引入了新的虚拟边缘,其 edgeId 更大,如 iter.getCount。根据具体情况,有不同的解决方案,例如仅排除或使用原始边缘等