Skip to content

Commit ad3ce24

Browse files
committed
don't do interpolation twice, fixes graphhopper#1645
1 parent 0f7ed2b commit ad3ce24

File tree

2 files changed

+64
-2
lines changed

2 files changed

+64
-2
lines changed

core/src/main/java/com/graphhopper/GraphHopper.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -852,7 +852,7 @@ public void postProcessing() {
852852
ghStorage = newGraph;
853853
}
854854

855-
if (hasElevation()) {
855+
if (!hasInterpolated() && hasElevation()) {
856856
interpolateBridgesAndOrTunnels();
857857
}
858858

@@ -868,14 +868,21 @@ public void postProcessing() {
868868
loadOrPrepareLM();
869869
}
870870

871-
private void interpolateBridgesAndOrTunnels() {
871+
private static final String INTERPOLATION_KEY = "prepare.elevation_interpolation.done";
872+
873+
private boolean hasInterpolated() {
874+
return "true".equals(ghStorage.getProperties().get(INTERPOLATION_KEY));
875+
}
876+
877+
void interpolateBridgesAndOrTunnels() {
872878
if (ghStorage.getEncodingManager().hasEncodedValue(RoadEnvironment.KEY)) {
873879
EnumEncodedValue<RoadEnvironment> roadEnvEnc = ghStorage.getEncodingManager().getEnumEncodedValue(RoadEnvironment.KEY, RoadEnvironment.class);
874880
StopWatch sw = new StopWatch().start();
875881
new EdgeElevationInterpolator(ghStorage, roadEnvEnc, RoadEnvironment.TUNNEL).execute();
876882
float tunnel = sw.stop().getSeconds();
877883
sw = new StopWatch().start();
878884
new EdgeElevationInterpolator(ghStorage, roadEnvEnc, RoadEnvironment.BRIDGE).execute();
885+
ghStorage.getProperties().put(INTERPOLATION_KEY, true);
879886
logger.info("Bridge interpolation " + (int) sw.stop().getSeconds() + "s, " + "tunnel interpolation " + (int) tunnel + "s");
880887
}
881888
}

core/src/test/java/com/graphhopper/GraphHopperAPITest.java

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,21 @@
1818
package com.graphhopper;
1919

2020
import com.graphhopper.json.geo.JsonFeature;
21+
import com.graphhopper.routing.util.CarFlagEncoder;
2122
import com.graphhopper.routing.util.EncodingManager;
23+
import com.graphhopper.routing.util.parsers.OSMRoadEnvironmentParser;
2224
import com.graphhopper.storage.Graph;
2325
import com.graphhopper.storage.GraphBuilder;
2426
import com.graphhopper.storage.GraphHopperStorage;
2527
import com.graphhopper.storage.NodeAccess;
2628
import com.graphhopper.storage.change.ChangeGraphHelper;
2729
import com.graphhopper.storage.index.LocationIndex;
30+
import com.graphhopper.util.Helper;
2831
import com.graphhopper.util.PointList;
2932
import com.graphhopper.util.shapes.BBox;
3033
import org.junit.Test;
3134

35+
import java.io.File;
3236
import java.util.*;
3337
import java.util.concurrent.CountDownLatch;
3438
import java.util.concurrent.ExecutorService;
@@ -107,6 +111,57 @@ public void testDisconnected179() {
107111
instance.close();
108112
}
109113

114+
@Test
115+
public void testDoNotInterpolateTwice1645() {
116+
String loc = "./target/issue1645";
117+
Helper.removeDir(new File(loc));
118+
EncodingManager em = new EncodingManager.Builder(4).add(new OSMRoadEnvironmentParser()).add(new CarFlagEncoder()).build();
119+
GraphHopperStorage graph = new GraphBuilder(em).setLocation(loc).set3D(true).setStore(true).create();
120+
121+
// we need elevation
122+
NodeAccess na = graph.getNodeAccess();
123+
na.setNode(0, 42, 10, 10);
124+
na.setNode(1, 42.1, 10.1, 10);
125+
na.setNode(2, 42.1, 10.2, 1);
126+
na.setNode(3, 42, 10.4, 1);
127+
128+
graph.edge(0, 1, 10, true);
129+
graph.edge(2, 3, 10, true);
130+
131+
final AtomicInteger counter = new AtomicInteger(0);
132+
GraphHopper instance = new GraphHopper().setEncodingManager(em).setElevation(true).setGraphHopperLocation(loc).setCHEnabled(false)
133+
.loadGraph(graph);
134+
instance.flush();
135+
instance.close();
136+
assertEquals(0, counter.get());
137+
138+
instance = new GraphHopper() {
139+
@Override
140+
void interpolateBridgesAndOrTunnels() {
141+
counter.incrementAndGet();
142+
super.interpolateBridgesAndOrTunnels();
143+
}
144+
}.setEncodingManager(em).setElevation(true).setCHEnabled(false);
145+
instance.load(loc);
146+
instance.flush();
147+
instance.close();
148+
assertEquals(1, counter.get());
149+
150+
instance = new GraphHopper() {
151+
@Override
152+
void interpolateBridgesAndOrTunnels() {
153+
counter.incrementAndGet();
154+
super.interpolateBridgesAndOrTunnels();
155+
}
156+
}.setEncodingManager(em).setElevation(true).setCHEnabled(false);
157+
instance.load(loc);
158+
instance.flush();
159+
instance.close();
160+
assertEquals(1, counter.get());
161+
162+
Helper.removeDir(new File(loc));
163+
}
164+
110165
@Test
111166
public void testNoLoad() {
112167
GraphHopper instance = new GraphHopper().

0 commit comments

Comments
 (0)