graphhopper中的边索引是如何工作的?

graphhopper中的边索引是如何工作的?,graphhopper,Graphhopper,我带着一个新问题来到这里 我正在制作一个自定义算法,它需要图形边的预计算数据。我使用AllEdgesIterator的方式如下: AllEdgesIterator it = graph.getAllEdges(); int nbEdges = it.getCount(); int count = 0; int[] myData = new int[nbEdges]; while (it.next()) { count++; ... } 第一件奇怪的事情是,nbEdges等于

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

我正在制作一个自定义算法,它需要图形边的预计算数据。我使用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是边的数量,是真的吗

这里会发生什么?顺便说一下,我已经禁用了图形压缩层次结构

谢谢你每次都这么快回答

第一件奇怪的事情是nbEdges等于15565条边 但计数仅等于14417。怎么可能呢

这是因为“压缩”删除了不可访问的子网,但目前只有节点从图中删除,边只是断开连接并保留在边中,即标记为已删除的“数组”。因此,
iter.getCount
只是一个上限,但是
AllEdgeIterator
在迭代时正确地排除了这些未使用的边,并且具有正确的计数。但是使用
iter.getCount
分配自定义数据数组是正确的做法


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

好的,我明白了,您能再解释一下虚拟边吗?它们是什么?你为什么需要它们?它们是重要的还是我可以跳过它们?我怎么知道什么是原始边?谢谢它们是在现有连接点和查询点之间引入的,因此算法不需要对这些点进行特殊处理。每个点的QueryResult(从locationIndex.findClosest返回)将包含指向原始边的EdgeIteratorState。