From 414937e22399ffd6e9310f70916d81742aa92271 Mon Sep 17 00:00:00 2001 From: Peter Date: Wed, 25 Feb 2015 09:03:18 +0100 Subject: [PATCH] made roundabout instructions working for CH too, #185 --- .../java/com/graphhopper/routing/Path.java | 24 +- .../com/graphhopper/routing/ch/Path4CH.java | 28 +- .../ch/PrepareContractionHierarchies.java | 4 +- .../graphhopper/routing/GraphHopperIT.java | 285 ++++++++++-------- 4 files changed, 183 insertions(+), 158 deletions(-) diff --git a/core/src/main/java/com/graphhopper/routing/Path.java b/core/src/main/java/com/graphhopper/routing/Path.java index d0e9f9aa24f..54f4284bf11 100644 --- a/core/src/main/java/com/graphhopper/routing/Path.java +++ b/core/src/main/java/com/graphhopper/routing/Path.java @@ -252,7 +252,7 @@ private void forEveryEdge( EdgeVisitor visitor ) int len = edgeIds.size(); for (int i = 0; i < len; i++) { - EdgeIteratorState edgeBase = graph.getBaseGraph().getEdgeProps(edgeIds.get(i), tmpNode); + EdgeIteratorState edgeBase = graph.getEdgeProps(edgeIds.get(i), tmpNode); if (edgeBase == null) throw new IllegalStateException("Edge " + edgeIds.get(i) + " was empty when requested with node " + tmpNode + ", array index:" + i + ", edges:" + edgeIds.size()); @@ -434,13 +434,13 @@ public void next( EdgeIteratorState edge, int index ) } else { if (isRoundabout) - // remark: names and annotations within roundabout are ignored + // remark: names and annotations within roundabout are ignored { if (!prevInRoundabout) //just entered roundabout { int sign = Instruction.USE_ROUNDABOUT; RoundaboutInstruction roundaboutInstruction = new RoundaboutInstruction(sign, name, - annotation, new PointList(10, nodeAccess.is3D())); + annotation, new PointList(10, nodeAccess.is3D())); if (prevName != null) { // previous orientation is last orientation before entering roundabout @@ -468,7 +468,10 @@ public void next( EdgeIteratorState edge, int index ) // This could lead to problems if there are non-complete roundabouts! EdgeIterator edgeIter = outEdgeExplorer.setBaseNode(adjNode); edgeIter.next(); - if (edgeIter.next()) {((RoundaboutInstruction) prevInstruction).increaseExitNumber();} + if (edgeIter.next()) + { + ((RoundaboutInstruction) prevInstruction).increaseExitNumber(); + } } else if (prevInRoundabout) //previously in roundabout but not anymore { @@ -487,9 +490,9 @@ public void next( EdgeIteratorState edge, int index ) double deltaOut = (orientation - recentOrientation); prevInstruction = ((RoundaboutInstruction) prevInstruction) - .setRadian(deltaInOut) - .setDirOfRotation(deltaOut) - .setExited(); + .setRadian(deltaInOut) + .setDirOfRotation(deltaOut) + .setExited(); prevName = name; prevAnnotation = annotation; @@ -532,7 +535,7 @@ public void next( EdgeIteratorState edge, int index ) sign = Instruction.TURN_SHARP_RIGHT; } - prevInstruction = new Instruction(sign, name, annotation, new PointList(10, nodeAccess.is3D()) ); + prevInstruction = new Instruction(sign, name, annotation, new PointList(10, nodeAccess.is3D())); ways.add(prevInstruction); prevName = name; prevAnnotation = annotation; @@ -545,12 +548,11 @@ public void next( EdgeIteratorState edge, int index ) { doublePrevLat = prevLat; doublePrevLong = prevLon; - } - else + } else { int beforeLast = wayGeo.getSize() - 2; doublePrevLat = wayGeo.getLatitude(beforeLast); - doublePrevLong = wayGeo.getLongitude(beforeLast); + doublePrevLong = wayGeo.getLongitude(beforeLast); } prevInRoundabout = isRoundabout; prevLat = adjLat; diff --git a/core/src/main/java/com/graphhopper/routing/ch/Path4CH.java b/core/src/main/java/com/graphhopper/routing/ch/Path4CH.java index 76c6a0de4b4..fe8163b0889 100644 --- a/core/src/main/java/com/graphhopper/routing/ch/Path4CH.java +++ b/core/src/main/java/com/graphhopper/routing/ch/Path4CH.java @@ -20,7 +20,6 @@ import com.graphhopper.routing.PathBidirRef; import com.graphhopper.routing.util.FlagEncoder; import com.graphhopper.storage.Graph; -import com.graphhopper.storage.LevelGraph; import com.graphhopper.util.EdgeSkipIterState; /** @@ -31,17 +30,20 @@ */ public class Path4CH extends PathBidirRef { - public Path4CH( Graph g, FlagEncoder encoder ) + private final Graph routingGraph; + + public Path4CH( Graph routingGraph, Graph baseGraph, FlagEncoder encoder ) { - super(g, encoder); + super(baseGraph, encoder); + this.routingGraph = routingGraph; } - + @Override protected final void processEdge( int tmpEdge, int endNode ) { // Shortcuts do only contain valid weight so first expand before adding // to distance and time - expandEdge((EdgeSkipIterState) graph.getEdgeProps(tmpEdge, endNode), false); + expandEdge((EdgeSkipIterState) routingGraph.getEdgeProps(tmpEdge, endNode), false); } private void expandEdge( EdgeSkipIterState mainEdgeState, boolean reverse ) @@ -71,32 +73,32 @@ private void expandEdge( EdgeSkipIterState mainEdgeState, boolean reverse ) // getEdgeProps could possibly return an empty edge if the shortcut is available for both directions if (reverseOrder) { - EdgeSkipIterState edgeState = (EdgeSkipIterState) graph.getEdgeProps(skippedEdge1, to); + EdgeSkipIterState edgeState = (EdgeSkipIterState) routingGraph.getEdgeProps(skippedEdge1, to); boolean empty = edgeState == null; if (empty) - edgeState = (EdgeSkipIterState) graph.getEdgeProps(skippedEdge2, to); + edgeState = (EdgeSkipIterState) routingGraph.getEdgeProps(skippedEdge2, to); expandEdge(edgeState, false); if (empty) - edgeState = (EdgeSkipIterState) graph.getEdgeProps(skippedEdge1, from); + edgeState = (EdgeSkipIterState) routingGraph.getEdgeProps(skippedEdge1, from); else - edgeState = (EdgeSkipIterState) graph.getEdgeProps(skippedEdge2, from); + edgeState = (EdgeSkipIterState) routingGraph.getEdgeProps(skippedEdge2, from); expandEdge(edgeState, true); } else { - EdgeSkipIterState iter = (EdgeSkipIterState) graph.getEdgeProps(skippedEdge1, from); + EdgeSkipIterState iter = (EdgeSkipIterState) routingGraph.getEdgeProps(skippedEdge1, from); boolean empty = iter == null; if (empty) - iter = (EdgeSkipIterState) graph.getEdgeProps(skippedEdge2, from); + iter = (EdgeSkipIterState) routingGraph.getEdgeProps(skippedEdge2, from); expandEdge(iter, true); if (empty) - iter = (EdgeSkipIterState) graph.getEdgeProps(skippedEdge1, to); + iter = (EdgeSkipIterState) routingGraph.getEdgeProps(skippedEdge1, to); else - iter = (EdgeSkipIterState) graph.getEdgeProps(skippedEdge2, to); + iter = (EdgeSkipIterState) routingGraph.getEdgeProps(skippedEdge2, to); expandEdge(iter, false); } diff --git a/core/src/main/java/com/graphhopper/routing/ch/PrepareContractionHierarchies.java b/core/src/main/java/com/graphhopper/routing/ch/PrepareContractionHierarchies.java index 088fbadfd54..d6732420f92 100644 --- a/core/src/main/java/com/graphhopper/routing/ch/PrepareContractionHierarchies.java +++ b/core/src/main/java/com/graphhopper/routing/ch/PrepareContractionHierarchies.java @@ -803,7 +803,7 @@ protected boolean finished() protected Path createAndInitPath() { - bestPath = new Path4CH(graph, flagEncoder); + bestPath = new Path4CH(graph, graph.getBaseGraph(), flagEncoder); return bestPath; } @@ -849,7 +849,7 @@ public boolean finished() @Override protected Path createAndInitPath() { - bestPath = new Path4CH(graph, flagEncoder); + bestPath = new Path4CH(graph, graph.getBaseGraph(), flagEncoder); return bestPath; } diff --git a/core/src/test/java/com/graphhopper/routing/GraphHopperIT.java b/core/src/test/java/com/graphhopper/routing/GraphHopperIT.java index 61e00f2f725..ae015cc3eef 100644 --- a/core/src/test/java/com/graphhopper/routing/GraphHopperIT.java +++ b/core/src/test/java/com/graphhopper/routing/GraphHopperIT.java @@ -28,46 +28,59 @@ import java.io.File; import java.util.List; import java.util.Map; -import org.junit.After; -import org.junit.Test; +import org.junit.*; import static org.junit.Assert.*; -import org.junit.Before; /** * @author Peter Karich */ public class GraphHopperIT { - String graphFile = "target/graph-GraphHopperIT"; - String osmFile = "files/monaco.osm.gz"; - String vehicle = "FOOT"; - String importVehicles = "FOOT"; - String weightCalcStr = "shortest"; + private static GraphHopper hopper; + private static final String graphFileFoot = "target/graphhopperIT-foot"; + private static final String osmFile = "files/monaco.osm.gz"; + private static final String importVehicles = "FOOT"; + private static final String vehicle = "FOOT"; + private static final String weightCalcStr = "shortest"; + + private final String tmpGraphFile = "target/graphhopperIT-tmp"; @Before public void setUp() { - // make sure we are using fresh graphhopper files with correct vehicle - Helper.removeDir(new File(graphFile)); + Helper.removeDir(new File(tmpGraphFile)); } @After public void tearDown() { - Helper.removeDir(new File(graphFile)); + Helper.removeDir(new File(tmpGraphFile)); } - @Test - public void testMonacoWithInstructions() throws Exception + @BeforeClass + public static void beforeClass() { - GraphHopper hopper = new GraphHopper(). + // make sure we are using fresh graphhopper files with correct vehicle + Helper.removeDir(new File(graphFileFoot)); + + hopper = new GraphHopper(). setStoreOnFlush(true). setOSMFile(osmFile). setCHEnable(false). - setGraphHopperLocation(graphFile). + setGraphHopperLocation(graphFileFoot). setEncodingManager(new EncodingManager(importVehicles)). importOrLoad(); + } + + @AfterClass + public static void afterClass() + { + Helper.removeDir(new File(graphFileFoot)); + } + @Test + public void testMonacoWithInstructions() throws Exception + { GHResponse rsp = hopper.route(new GHRequest(43.727687, 7.418737, 43.74958, 7.436566). setAlgorithm(AlgorithmOptions.ASTAR).setVehicle(vehicle).setWeighting(weightCalcStr)); @@ -106,125 +119,9 @@ public void testMonacoWithInstructions() throws Exception assertEquals(totalResponseMillis, lastEntryMillis); } - @Test - public void testSRTMWithInstructions() throws Exception - { - GraphHopper hopper = new GraphHopper(). - setStoreOnFlush(true). - setOSMFile(osmFile). - setCHEnable(false). - setGraphHopperLocation(graphFile). - setEncodingManager(new EncodingManager(importVehicles)); - - hopper.setElevationProvider(new SRTMProvider().setCacheDir(new File("./files/"))); - hopper.importOrLoad(); - - GHResponse rsp = hopper.route(new GHRequest(43.730729, 7.421288, 43.727697, 7.419199). - setAlgorithm(AlgorithmOptions.ASTAR).setVehicle(vehicle).setWeighting(weightCalcStr)); - - assertEquals(1626.8, rsp.getDistance(), .1); - assertEquals(60, rsp.getPoints().getSize()); - assertTrue(rsp.getPoints().is3D()); - - InstructionList il = rsp.getInstructions(); - assertEquals(10, il.size()); - assertTrue(il.get(0).getPoints().is3D()); - - String str = rsp.getPoints().toString(); - assertEquals("(43.73068455771767,7.421283689825812,62.0), (43.73067957305937,7.421382123709815,66.0), " - + "(43.73109792316924,7.421546222751131,45.0), (43.73129908884985,7.421589994913116,45.0), " - + "(43.731327028527716,7.421414533736137,45.0), (43.73125047381037,7.421366291225693,45.0), " - + "(43.73125457162979,7.421274090288746,52.0), " - + "(43.73128213877862,7.421115579183003,52.0), (43.731362232521825,7.421145381506057,52.0), " - + "(43.731371359483255,7.421123216028286,52.0), (43.731485725897976,7.42117332118392,52.0), " - + "(43.731575132867135,7.420868778695214,52.0), (43.73160605277731,7.420824820268709,52.0), " - + "(43.7316401391843,7.420850152243305,52.0), (43.731674039326776,7.421050014072285,52.0)", - str.substring(0, 662)); - - assertEquals("(43.727778875703635,7.418772930326453,11.0), (43.72768239068275,7.419007064826944,11.0), " - + "(43.727680946587874,7.4191987684222065,11.0)", - str.substring(str.length() - 133)); - - List list = rsp.getInstructions().createGPXList(); - assertEquals(60, list.size()); - final long lastEntryMillis = list.get(list.size() - 1).getMillis(); - assertEquals(new GPXEntry(43.73068455771767, 7.421283689825812, 62.0, 0), list.get(0)); - assertEquals(new GPXEntry(43.727680946587874, 7.4191987684222065, 11.0, lastEntryMillis), list.get(list.size() - 1)); - - assertEquals(62, il.createGPXList().get(0).getElevation(), 1e-2); - assertEquals(66, il.createGPXList().get(1).getElevation(), 1e-2); - assertEquals(52, il.createGPXList().get(10).getElevation(), 1e-2); - } - - @Test - public void testKremsCyclewayInstructionsWithWayTypeInfo() - { - String tmpOsmFile = "files/krems.osm.gz"; - String tmpGraphFile = "target/graph-krems"; - String tmpVehicle = "BIKE"; - String tmpImportVehicles = "CAR,BIKE"; - String tmpWeightCalcStr = "fastest"; - - try - { - // make sure we are using fresh graphhopper files with correct vehicle - Helper.removeDir(new File(tmpGraphFile)); - GraphHopper hopper = new GraphHopper(). - setStoreOnFlush(true). - setOSMFile(tmpOsmFile). - setCHEnable(false). - setGraphHopperLocation(tmpGraphFile). - setEncodingManager(new EncodingManager(tmpImportVehicles)). - importOrLoad(); - - GHResponse rsp = hopper.route(new GHRequest(48.410987, 15.599492, 48.383419, 15.659294). - setAlgorithm(AlgorithmOptions.ASTAR).setVehicle(tmpVehicle).setWeighting(tmpWeightCalcStr)); - - assertEquals(6932.24, rsp.getDistance(), .1); - assertEquals(110, rsp.getPoints().getSize()); - - InstructionList il = rsp.getInstructions(); - assertEquals(19, il.size()); - List> resultJson = il.createJson(); - - assertEquals("Continue onto Obere Landstraße", resultJson.get(0).get("text")); - assertEquals("get off the bike", resultJson.get(0).get("annotationText")); - assertEquals("Turn sharp left onto Kirchengasse", resultJson.get(1).get("text")); - assertEquals("get off the bike", resultJson.get(1).get("annotationText")); - - assertEquals("Turn sharp right onto Pfarrplatz", resultJson.get(2).get("text")); - assertEquals("Turn right onto Margarethenstraße", resultJson.get(3).get("text")); - assertEquals("Turn left onto Hoher Markt", resultJson.get(4).get("text")); - assertEquals("Turn slight right onto Wegscheid", resultJson.get(5).get("text")); - assertEquals("Turn slight left onto Untere Landstraße", resultJson.get(6).get("text")); - assertEquals("Turn right onto Ringstraße, L73", resultJson.get(7).get("text")); - assertEquals("Continue onto Eyblparkstraße", resultJson.get(8).get("text")); - assertEquals("Continue onto Austraße", resultJson.get(9).get("text")); - assertEquals("Turn slight left onto Rechte Kremszeile", resultJson.get(10).get("text")); - //.. - assertEquals("Turn right onto Treppelweg", resultJson.get(15).get("text")); - assertEquals("cycleway", resultJson.get(15).get("annotationText")); - - } catch (Exception ex) - { - throw new RuntimeException("cannot handle osm file " + tmpOsmFile, ex); - } finally - { - Helper.removeDir(new File(tmpGraphFile)); - } - } - @Test public void testMonacoVia() { - GraphHopper hopper = new GraphHopper(). - setStoreOnFlush(true). - setOSMFile(osmFile). - setCHEnable(false). - setGraphHopperLocation(graphFile). - setEncodingManager(new EncodingManager(importVehicles)). - importOrLoad(); - GHResponse rsp = hopper.route(new GHRequest(). addPoint(new GHPoint(43.727687, 7.418737)). addPoint(new GHPoint(43.74958, 7.436566)). @@ -277,7 +174,7 @@ public void testMonacoVia() assertEquals(1, rsp.getInstructions().size()); assertEquals("Finish!", rsp.getInstructions().createJson().get(0).get("text")); assertEquals(Instruction.FINISH, rsp.getInstructions().createJson().get(0).get("sign")); - + rsp = hopper.route(new GHRequest(). addPoint(new GHPoint(43.727687, 7.418737)). addPoint(new GHPoint(43.727687, 7.418737)). @@ -290,4 +187,128 @@ public void testMonacoVia() assertEquals(Instruction.REACHED_VIA, rsp.getInstructions().createJson().get(0).get("sign")); assertEquals(Instruction.FINISH, rsp.getInstructions().createJson().get(1).get("sign")); } + + @Test + public void testSRTMWithInstructions() throws Exception + { + GraphHopper tmpHopper = new GraphHopper(). + setStoreOnFlush(true). + setOSMFile(osmFile). + setCHEnable(false). + setGraphHopperLocation(tmpGraphFile). + setEncodingManager(new EncodingManager(importVehicles)); + + tmpHopper.setElevationProvider(new SRTMProvider().setCacheDir(new File("./files/"))); + tmpHopper.importOrLoad(); + + GHResponse rsp = tmpHopper.route(new GHRequest(43.730729, 7.421288, 43.727697, 7.419199). + setAlgorithm(AlgorithmOptions.ASTAR).setVehicle(vehicle).setWeighting(weightCalcStr)); + + assertEquals(1626.8, rsp.getDistance(), .1); + assertEquals(60, rsp.getPoints().getSize()); + assertTrue(rsp.getPoints().is3D()); + + InstructionList il = rsp.getInstructions(); + assertEquals(10, il.size()); + assertTrue(il.get(0).getPoints().is3D()); + + String str = rsp.getPoints().toString(); + assertEquals("(43.73068455771767,7.421283689825812,62.0), (43.73067957305937,7.421382123709815,66.0), " + + "(43.73109792316924,7.421546222751131,45.0), (43.73129908884985,7.421589994913116,45.0), " + + "(43.731327028527716,7.421414533736137,45.0), (43.73125047381037,7.421366291225693,45.0), " + + "(43.73125457162979,7.421274090288746,52.0), " + + "(43.73128213877862,7.421115579183003,52.0), (43.731362232521825,7.421145381506057,52.0), " + + "(43.731371359483255,7.421123216028286,52.0), (43.731485725897976,7.42117332118392,52.0), " + + "(43.731575132867135,7.420868778695214,52.0), (43.73160605277731,7.420824820268709,52.0), " + + "(43.7316401391843,7.420850152243305,52.0), (43.731674039326776,7.421050014072285,52.0)", + str.substring(0, 662)); + + assertEquals("(43.727778875703635,7.418772930326453,11.0), (43.72768239068275,7.419007064826944,11.0), " + + "(43.727680946587874,7.4191987684222065,11.0)", + str.substring(str.length() - 133)); + + List list = rsp.getInstructions().createGPXList(); + assertEquals(60, list.size()); + final long lastEntryMillis = list.get(list.size() - 1).getMillis(); + assertEquals(new GPXEntry(43.73068455771767, 7.421283689825812, 62.0, 0), list.get(0)); + assertEquals(new GPXEntry(43.727680946587874, 7.4191987684222065, 11.0, lastEntryMillis), list.get(list.size() - 1)); + + assertEquals(62, il.createGPXList().get(0).getElevation(), 1e-2); + assertEquals(66, il.createGPXList().get(1).getElevation(), 1e-2); + assertEquals(52, il.createGPXList().get(10).getElevation(), 1e-2); + } + + @Test + public void testKremsCyclewayInstructionsWithWayTypeInfo() + { + String tmpOsmFile = "files/krems.osm.gz"; + String tmpVehicle = "BIKE"; + String tmpImportVehicles = "CAR,BIKE"; + String tmpWeightCalcStr = "fastest"; + + GraphHopper tmpHopper = new GraphHopper(). + setStoreOnFlush(true). + setOSMFile(tmpOsmFile). + setCHEnable(false). + setGraphHopperLocation(tmpGraphFile). + setEncodingManager(new EncodingManager(tmpImportVehicles)). + importOrLoad(); + + GHResponse rsp = tmpHopper.route(new GHRequest(48.410987, 15.599492, 48.383419, 15.659294). + setAlgorithm(AlgorithmOptions.ASTAR).setVehicle(tmpVehicle).setWeighting(tmpWeightCalcStr)); + + assertEquals(6932.24, rsp.getDistance(), .1); + assertEquals(110, rsp.getPoints().getSize()); + + InstructionList il = rsp.getInstructions(); + assertEquals(19, il.size()); + List> resultJson = il.createJson(); + + assertEquals("Continue onto Obere Landstraße", resultJson.get(0).get("text")); + assertEquals("get off the bike", resultJson.get(0).get("annotationText")); + assertEquals("Turn sharp left onto Kirchengasse", resultJson.get(1).get("text")); + assertEquals("get off the bike", resultJson.get(1).get("annotationText")); + + assertEquals("Turn sharp right onto Pfarrplatz", resultJson.get(2).get("text")); + assertEquals("Turn right onto Margarethenstraße", resultJson.get(3).get("text")); + assertEquals("Turn left onto Hoher Markt", resultJson.get(4).get("text")); + assertEquals("Turn slight right onto Wegscheid", resultJson.get(5).get("text")); + assertEquals("Turn slight left onto Untere Landstraße", resultJson.get(6).get("text")); + assertEquals("Turn right onto Ringstraße, L73", resultJson.get(7).get("text")); + assertEquals("Continue onto Eyblparkstraße", resultJson.get(8).get("text")); + assertEquals("Continue onto Austraße", resultJson.get(9).get("text")); + assertEquals("Turn slight left onto Rechte Kremszeile", resultJson.get(10).get("text")); + //.. + assertEquals("Turn right onto Treppelweg", resultJson.get(15).get("text")); + assertEquals("cycleway", resultJson.get(15).get("annotationText")); + } + + @Test + public void testRoundaboutInstructionsWithCH() + { + String tmpOsmFile = "files/monaco.osm.gz"; + String tmpVehicle = "car"; + String tmpImportVehicles = "car"; + String tmpWeightCalcStr = "fastest"; + + GraphHopper tmpHopper = new GraphHopper(). + setStoreOnFlush(true). + setOSMFile(tmpOsmFile). + setGraphHopperLocation(tmpGraphFile). + setEncodingManager(new EncodingManager(tmpImportVehicles)). + importOrLoad(); + + GHResponse rsp = tmpHopper.route(new GHRequest(43.745084, 7.430513, 43.745247, 7.430347) + .setVehicle(tmpVehicle).setWeighting(tmpWeightCalcStr)); + assertEquals(2, ((RoundaboutInstruction) rsp.getInstructions().get(1)).getExitNumber()); + + rsp = tmpHopper.route(new GHRequest(43.745968, 7.42907, 43.745832, 7.428614) + .setVehicle(tmpVehicle).setWeighting(tmpWeightCalcStr)); + assertEquals(2, ((RoundaboutInstruction) rsp.getInstructions().get(1)).getExitNumber()); + + rsp = tmpHopper.route(new GHRequest(43.745948, 7.42914, 43.746173, 7.428834) + .setVehicle(tmpVehicle).setWeighting(tmpWeightCalcStr)); + + assertEquals(1, ((RoundaboutInstruction) rsp.getInstructions().get(1)).getExitNumber()); + } }