From 41cc9fcd3f407f18d4317a3e61e1d2a774c84011 Mon Sep 17 00:00:00 2001 From: Victor Shcherb Date: Thu, 11 Jun 2020 00:44:51 +0200 Subject: [PATCH 1/2] Fix #5097 --- .../net/osmand/router/BinaryRoutePlanner.java | 53 ++++++++++--------- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/OsmAnd-java/src/main/java/net/osmand/router/BinaryRoutePlanner.java b/OsmAnd-java/src/main/java/net/osmand/router/BinaryRoutePlanner.java index de2da50d79..78966e4b5d 100644 --- a/OsmAnd-java/src/main/java/net/osmand/router/BinaryRoutePlanner.java +++ b/OsmAnd-java/src/main/java/net/osmand/router/BinaryRoutePlanner.java @@ -138,7 +138,7 @@ public class BinaryRoutePlanner { checkIfGraphIsEmpty(ctx, ctx.getPlanRoadDirection() >= 0, graphDirectSegments, start, visitedDirectSegments, "Route is not found from selected start point."); if (ctx.planRouteIn2Directions()) { - forwardSearch = (nonHeuristicSegmentsComparator.compare(graphDirectSegments.peek(), graphReverseSegments.peek()) < 0); + forwardSearch = nonHeuristicSegmentsComparator.compare(graphDirectSegments.peek(), graphReverseSegments.peek()) <= 0; // if (graphDirectSegments.size() * 2 > graphReverseSegments.size()) { // forwardSearch = false; // } else if (graphDirectSegments.size() < 2 * graphReverseSegments.size()) { @@ -798,40 +798,41 @@ public class BinaryRoutePlanner { " distToEnd=" + distanceToEnd + " segmentPoint=" + segmentPoint + " -- ", next, true); } - if (!visitedSegments.containsKey(calculateRoutePointId(next, next.isPositive()))) { - if (next.getParentRoute() == null - || ctx.roadPriorityComparator(next.distanceFromStart, next.distanceToEnd, - distFromStart, distanceToEnd) > 0) { - next.distanceFromStart = distFromStart; - next.distanceToEnd = distanceToEnd; - if (TRACE_ROUTING) { - printRoad(" "+segmentPoint+">>" , next, null); - } - // put additional information to recover whole route after - next.setParentRoute(segment); - next.setParentSegmentEnd(segmentPoint); - graphSegments.add(next); - } - } else { + RouteSegment visIt = visitedSegments.get(calculateRoutePointId(next, next.isPositive())); + boolean toAdd = true; + if (visIt != null) { // the segment was already visited! We need to follow better route if it exists - // that is very exceptional situation and almost exception, it can happen + // that is very exceptional situation and almost exception, it can happen // 1. when we underestimate distnceToEnd - wrong h() - // 2. because we process not small segments but the whole road, it could be that + // 2. because we process not small segments but the whole road, it could be that // deviation from the road is faster than following the whole road itself! + if (TRACE_ROUTING) { + printRoad(">?", visitedSegments.get(calculateRoutePointId(next, next.isPositive())), + next.isPositive()); + } if (distFromStart < next.distanceFromStart) { if (ctx.config.heuristicCoefficient <= 1) { System.err.println("! Alert distance from start " + distFromStart + " < " + next.distanceFromStart + " id=" + next.road.id); } - // A: we can't change parent route just here, because we need to update visitedSegments - // presumably we can do visitedSegments.put(calculateRoutePointId(next), next); -// next.distanceFromStart = distFromStart; -// next.setParentRoute(segment); -// next.setParentSegmentEnd(segmentPoint); - if (ctx.visitor != null) { - // ctx.visitor.visitSegment(next, false); - } } + if (distFromStart < visIt.distanceFromStart && next.getParentRoute() == null) { + toAdd = true; + } else { + toAdd = false; + } + } + if (toAdd && (next.getParentRoute() == null || ctx.roadPriorityComparator(next.distanceFromStart, + next.distanceToEnd, distFromStart, distanceToEnd) > 0)) { + next.distanceFromStart = distFromStart; + next.distanceToEnd = distanceToEnd; + if (TRACE_ROUTING) { + printRoad(" " + segmentPoint + ">>", next, null); + } + // put additional information to recover whole route after + next.setParentRoute(segment); + next.setParentSegmentEnd(segmentPoint); + graphSegments.add(next); } } } From d3ef4fb292b00eb59563d8419a64d21f39e6337e Mon Sep 17 00:00:00 2001 From: Victor Shcherb Date: Thu, 11 Jun 2020 01:29:59 +0200 Subject: [PATCH 2/2] Fix #5175 --- .../main/java/net/osmand/router/RoutePlannerFrontEnd.java | 3 ++- .../java/net/osmand/router/RouteResultPreparation.java | 1 - .../main/java/net/osmand/router/RouteSegmentResult.java | 8 +++++++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/OsmAnd-java/src/main/java/net/osmand/router/RoutePlannerFrontEnd.java b/OsmAnd-java/src/main/java/net/osmand/router/RoutePlannerFrontEnd.java index 9ebdb906ad..3df6b65125 100644 --- a/OsmAnd-java/src/main/java/net/osmand/router/RoutePlannerFrontEnd.java +++ b/OsmAnd-java/src/main/java/net/osmand/router/RoutePlannerFrontEnd.java @@ -301,7 +301,8 @@ public class RoutePlannerFrontEnd { int py = MapUtils.get31TileNumberY(point.getLatitude()); int pind = st ? routeSegmentResult.getStartPointIndex() : routeSegmentResult.getEndPointIndex(); - RouteDataObject r = routeSegmentResult.getObject(); + RouteDataObject r = new RouteDataObject(routeSegmentResult.getObject()); + routeSegmentResult.setObject(r); QuadPoint before = null; QuadPoint after = null; if (pind > 0) { diff --git a/OsmAnd-java/src/main/java/net/osmand/router/RouteResultPreparation.java b/OsmAnd-java/src/main/java/net/osmand/router/RouteResultPreparation.java index 0634602f3b..14363c39af 100644 --- a/OsmAnd-java/src/main/java/net/osmand/router/RouteResultPreparation.java +++ b/OsmAnd-java/src/main/java/net/osmand/router/RouteResultPreparation.java @@ -394,7 +394,6 @@ public class RouteResultPreparation { } // reverse it just to attach good direction roads Collections.reverse(result); - segment = finalSegment.reverseWaySearch ? finalSegment.opposite.getParentRoute() : finalSegment; int parentSegmentEnd = finalSegment.reverseWaySearch ? finalSegment.opposite.getParentSegmentEnd() : finalSegment.opposite.getSegmentStart(); parentRoutingTime = -1; diff --git a/OsmAnd-java/src/main/java/net/osmand/router/RouteSegmentResult.java b/OsmAnd-java/src/main/java/net/osmand/router/RouteSegmentResult.java index 36d5d0260b..40257c474b 100644 --- a/OsmAnd-java/src/main/java/net/osmand/router/RouteSegmentResult.java +++ b/OsmAnd-java/src/main/java/net/osmand/router/RouteSegmentResult.java @@ -23,7 +23,7 @@ import gnu.trove.map.hash.TIntObjectHashMap; public class RouteSegmentResult implements StringExternalizable { // this should be bigger (50-80m) but tests need to be fixed first private static final float DIST_BEARING_DETECT = 5; - private final RouteDataObject object; + private RouteDataObject object; private int startPointIndex; private int endPointIndex; private List[] attachedRoutes; @@ -535,10 +535,16 @@ public class RouteSegmentResult implements StringExternalizable public void setDescription(String description) { this.description = description; } + + public void setObject(RouteDataObject r) { + this.object = r; + } @Override public String toString() { return object.toString() + ": " + startPointIndex + "-" + endPointIndex; } + + } \ No newline at end of file