Как работает индексирование ребер в 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, В зависимости от точного сценария существуют разные решения, такие как просто исключение или использование исходного ребра и т. Д

Другие вопросы по тегам