Как работает индексирование ребер в Graphhopper?
Я здесь с новым вопросом.
Я делаю собственный алгоритм, который требует предварительно вычисленных данных для краев графика. Я использую AllEdgesIterator следующим образом:
AllEdgesIterator it = graph.getAllEdges();
int nbEdges = it.getCount();
int count = 0;
int[] myData = new int[nbEdges];
while (it.next())
{
count++;
...
}
Первое, что странно, это то, что nbEdges равен 15565 ребрам, но число равно только 14417. Как это возможно?
Вторая странная вещь - когда я запускаю свой пользовательский A*: я просто просматриваю узлы, используя outEdgeExplorer, но получаю IndexOutOfBound с индексом 15569 в массиве myData. Я думал, что краевые индексы были включены в [0; N-1] где N - число ребер, так ли это на самом деле?
Что здесь может происходить? Кстати, я отключил иерархии сжатия графов.
Спасибо за быстрый ответ каждый раз!
1 ответ
Первое, что странно, это то, что nbEdges равен 15565 ребрам, но число равно только 14417. Как это возможно?
Это происходит из-за "уплотнения", когда удаляются недостижимые подсети, но в настоящее время из графа удаляются только узлы, ребра просто отсоединяются и остаются в массиве ребер, помеченном как удаленный. Так iter.getCount
это просто верхний предел, но AllEdgeIterator
исключает такие неиспользуемые ребра правильно при итерации и имеет правильный счет. Но используя iter.getCount
правильно распределить массив пользовательских данных.
Что касается второго вопроса: это, вероятно, потому что QueryGraph
вводит новые виртуальные ребра с большим ребром iter.getCount
, В зависимости от точного сценария существуют разные решения, такие как просто исключение или использование исходного ребра и т. Д