Skip to content

Commit 1afc588

Browse files
committed
relabel base graph nodes
1 parent 69c97cf commit 1afc588

File tree

2 files changed

+44
-0
lines changed

2 files changed

+44
-0
lines changed

core/src/main/java/com/graphhopper/storage/BaseGraph.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import java.util.Map;
3131
import java.util.function.Consumer;
3232
import java.util.function.IntConsumer;
33+
import java.util.function.IntUnaryOperator;
3334

3435
import static com.graphhopper.util.Helper.nf;
3536
import static com.graphhopper.util.Parameters.Details.STREET_NAME;
@@ -373,6 +374,12 @@ public void forEdgeAndCopiesOfEdge(EdgeExplorer explorer, int node, int edge, In
373374
}
374375
}
375376

377+
public void relabelNodes(IntUnaryOperator getNewNodeForOldNode) {
378+
if (isFrozen())
379+
throw new IllegalStateException("Cannot relabel nodes if graph is already frozen");
380+
store.relabelNodes(getNewNodeForOldNode);
381+
}
382+
376383
@Override
377384
public EdgeIteratorState getEdgeIteratorState(int edgeId, int adjNode) {
378385
EdgeIteratorStateImpl edge = new EdgeIteratorStateImpl(this);

core/src/main/java/com/graphhopper/storage/BaseGraphNodesAndEdges.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,14 @@
1818

1919
package com.graphhopper.storage;
2020

21+
import com.carrotsearch.hppc.DoubleArrayList;
22+
import com.carrotsearch.hppc.IntArrayList;
2123
import com.graphhopper.routing.ev.EdgeIntAccess;
2224
import com.graphhopper.util.*;
2325
import com.graphhopper.util.shapes.BBox;
2426

2527
import java.util.Locale;
28+
import java.util.function.IntUnaryOperator;
2629

2730
import static com.graphhopper.util.EdgeIterator.NO_EDGE;
2831
import static com.graphhopper.util.Helper.nf;
@@ -218,6 +221,40 @@ public int edge(int nodeA, int nodeB) {
218221
return edge;
219222
}
220223

224+
public void relabelNodes(IntUnaryOperator getNewNodeForOldNode) {
225+
for (int edge = 0; edge < getEdges(); edge++) {
226+
long pointer = toEdgePointer(edge);
227+
setNodeA(pointer, getNewNodeForOldNode.applyAsInt(getNodeA(pointer)));
228+
setNodeB(pointer, getNewNodeForOldNode.applyAsInt(getNodeB(pointer)));
229+
}
230+
IntArrayList edgeRefs = new IntArrayList();
231+
DoubleArrayList lats = new DoubleArrayList();
232+
DoubleArrayList lons = new DoubleArrayList();
233+
DoubleArrayList eles = new DoubleArrayList();
234+
IntArrayList tcs = new IntArrayList();
235+
for (int node = 0; node < getNodes(); node++) {
236+
long pointer = toNodePointer(node);
237+
edgeRefs.add(getEdgeRef(pointer));
238+
lats.add(getLat(pointer));
239+
lons.add(getLon(pointer));
240+
if (withElevation())
241+
eles.add(getEle(pointer));
242+
if (withTurnCosts())
243+
tcs.add(getTurnCostRef(pointer));
244+
}
245+
for (int oldNode = 0; oldNode < getNodes(); oldNode++) {
246+
int newNode = getNewNodeForOldNode.applyAsInt(oldNode);
247+
long pointer = toNodePointer(newNode);
248+
setEdgeRef(pointer, edgeRefs.get(oldNode));
249+
setLat(pointer, lats.get(oldNode));
250+
setLon(pointer, lons.get(oldNode));
251+
if (withElevation())
252+
setEle(pointer, eles.get(oldNode));
253+
if (withTurnCosts())
254+
setTurnCostRef(pointer, tcs.get(oldNode));
255+
}
256+
}
257+
221258
public void ensureNodeCapacity(int node) {
222259
if (node < nodeCount)
223260
return;

0 commit comments

Comments
 (0)