diff --git a/OsmAnd-java/src/net/osmand/router/RouteResultPreparation.java b/OsmAnd-java/src/net/osmand/router/RouteResultPreparation.java index b2fae7dd6d..c426c9378a 100644 --- a/OsmAnd-java/src/net/osmand/router/RouteResultPreparation.java +++ b/OsmAnd-java/src/net/osmand/router/RouteResultPreparation.java @@ -472,6 +472,7 @@ public class RouteResultPreparation { if (currentTurn == null || currentTurn.getLanes() == null) { // skip } else { + boolean changed = false; if (nextSegment != null) { String hw = currentSegment.getObject().getHighway(); double mergeDistance = 200; @@ -479,7 +480,40 @@ public class RouteResultPreparation { mergeDistance = 400; } if (dist < mergeDistance) { - mergeTurnLanes(leftside, currentSegment, nextSegment); + changed = mergeTurnLanes(leftside, currentSegment, nextSegment); + } + } + if (!changed) { + TurnType tt = currentSegment.getTurnType(); + boolean goForward = false; + if (tt.getValue() == TurnType.C && tt.getLanes() != null) { + for (int it = 0; it < tt.getLanes().length; it++) { + int turn = tt.getLanes()[it]; + if (TurnType.getPrimaryTurn(turn) == TurnType.C || + TurnType.getSecondaryTurn(turn) == TurnType.C || + TurnType.getTertiaryTurn(turn) == TurnType.C) { + goForward = true; + break; + } + } + } + if(goForward) { + for (int it = 0; it < tt.getLanes().length; it++) { + int turn = tt.getLanes()[it]; + if (TurnType.getPrimaryTurn(turn) != TurnType.C) { + if(TurnType.getSecondaryTurn(turn) == TurnType.C) { + int st = TurnType.getSecondaryTurn(turn); + TurnType.setSecondaryTurn(tt.getLanes(), it, TurnType.getPrimaryTurn(turn)); + TurnType.setPrimaryTurn(tt.getLanes(), it, st); + } else if(TurnType.getTertiaryTurn(turn) == TurnType.C) { + int st = TurnType.getTertiaryTurn(turn); + TurnType.setTertiaryTurn(tt.getLanes(), it, TurnType.getPrimaryTurn(turn)); + TurnType.setPrimaryTurn(tt.getLanes(), it, st); + } else { + tt.getLanes()[it] = turn & (~1); + } + } + } } } nextSegment = currentSegment; @@ -525,14 +559,14 @@ public class RouteResultPreparation { } } - private void mergeTurnLanes(boolean leftSide, RouteSegmentResult currentSegment, RouteSegmentResult nextSegment) { + private boolean mergeTurnLanes(boolean leftSide, RouteSegmentResult currentSegment, RouteSegmentResult nextSegment) { MergeTurnLaneTurn active = new MergeTurnLaneTurn(currentSegment); MergeTurnLaneTurn target = new MergeTurnLaneTurn(nextSegment); if (active.activeLen < 2) { - return; + return false; } if (target.activeStartIndex == -1) { - return; + return false; } boolean changed = false; if (target.isActiveTurnMostLeft()) { @@ -564,7 +598,7 @@ public class RouteResultPreparation { } } if (!changed) { - return; + return false; } // set the allowed lane bit @@ -584,6 +618,7 @@ public class RouteResultPreparation { // newTurnType.setSkipToSpeak(currentTurn.isSkipToSpeak()); // currentSegment.setTurnType(newTurnType); // } + return true; } private static final int MAX_SPEAK_PRIORITY = 5; diff --git a/OsmAnd-java/test/resources/test_turn_lanes.json b/OsmAnd-java/test/resources/test_turn_lanes.json index 26d7fe6362..e26d02d95a 100644 --- a/OsmAnd-java/test/resources/test_turn_lanes.json +++ b/OsmAnd-java/test/resources/test_turn_lanes.json @@ -54,7 +54,7 @@ "longitude": 35.46842032670975 }, "expectedResults": { - "26789": "+TU|+TL|+C,TL|C|C,TR" + "26789": "+TU|TL|C,TL|C|C,TR" } }, { @@ -87,6 +87,20 @@ "27091": "+TL|+TL|+TL|C|TR|TR" } }, + { + "testName": "3.2 Motorway link from Ringweg Zuid TL Amstelveenseweg", + "startPoint": { + "latitude": 45.6971206184178, + "longitude": 35.51630312204361 + }, + "endPoint": { + "latitude": 45.69661945125, + "longitude": 35.51219849021 + }, + "expectedResults": { + "27091": "TL|TL|TL|+C|TR|TR" + } + }, { "testName": "4.Tiefer TL Wilhelm-Kaisen-Brücke", "startPoint": { @@ -377,7 +391,7 @@ "longitude": 35.63232659539227 }, "expectedResults": { - "202493001": "+TL,C|TR" + "202493001": "+C,TL|TR" } }, {