2015-06-23 50 views
1

我在這裏帶着一個新問題。邊緣索引在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瀏覽節點,但是我在myData數組上的索引15569處得到了一個IndexOutOfBound。我認爲邊緣索引被包含在[0; N-1]其中N是邊緣的數量,是真的嗎?

這裏可能會發生什麼?順便說一句,我已經禁用圖收縮層次結構。

謝謝你每次回答這麼快!

回答

1

第一個奇怪的是nbEdges等於15565的邊緣 但count只等於14417.怎麼可能?

這是因爲其中不可達的子網被移除「壓實」的,但目前僅節點從邊緣被斷開只是並留在邊緣-'array的圖中移除」標記爲已刪除。所以iter.getCount只是一個上限,但AllEdgeIterator迭代時正確排除了這些未使用的邊,並具有正確的計數。但使用iter.getCount分配您的自定義數據數組是正確的事情。

關於第二個問題:這可能是因爲QueryGraph引入了帶有較大edgeId的新虛擬邊界作爲iter.getCount。根據確切的情況,有不同的解決方案,如排除或使用原來的邊緣等

+0

好吧,我明白了,你能解釋多一點虛擬邊緣?他們是什麼,爲什麼你需要這個?它們很重要還是我可以跳過它們?我怎麼知道原來的邊緣是什麼?謝謝 ! – user3890394

+1

它們在現有的交匯點和查詢點之間引入,以便算法不需要對這些點進行特殊處理。每個點的QueryResult(從locationIndex.findClosest返回)將包含指向原始邊的EdgeIteratorState。 – Karussell

+0

非常感謝你:) – user3890394