From 9fc21b0fc8730c81c2cd598b814d4c1586a09fc4 Mon Sep 17 00:00:00 2001 From: afischerdev Date: Thu, 12 Sep 2024 11:53:10 +0200 Subject: [PATCH] added a dynamic range check --- .../java/btools/router/RoutingContext.java | 3 ++ .../java/btools/router/RoutingEngine.java | 54 ++++++++++++++++++- 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/brouter-core/src/main/java/btools/router/RoutingContext.java b/brouter-core/src/main/java/btools/router/RoutingContext.java index 86f1415..bd1c236 100644 --- a/brouter-core/src/main/java/btools/router/RoutingContext.java +++ b/brouter-core/src/main/java/btools/router/RoutingContext.java @@ -76,6 +76,7 @@ public final class RoutingContext { public double waypointCatchingRange; public boolean correctMisplacedViaPoints; public double correctMisplacedViaPointsDistance; + public boolean useDynamicDistance; private void setModel(String className) { if (className == null) { @@ -168,6 +169,8 @@ public final class RoutingContext { // Constant power of the biker (in W) bikerPower = expctxGlobal.getVariableValue("bikerPower", 100.f); + useDynamicDistance = expctxGlobal.getVariableValue("use_dynamic_range", 0f) == 1f; + boolean test = expctxGlobal.getVariableValue("check_start_way", 1f) == 1f; if (!test) expctxGlobal.freeNoWays(); diff --git a/brouter-core/src/main/java/btools/router/RoutingEngine.java b/brouter-core/src/main/java/btools/router/RoutingEngine.java index 09113a8..f612219 100644 --- a/brouter-core/src/main/java/btools/router/RoutingEngine.java +++ b/brouter-core/src/main/java/btools/router/RoutingEngine.java @@ -587,7 +587,13 @@ public class RoutingEngine extends Thread { mwp.direct = waypoints.get(i).direct; matchedWaypoints.add(mwp); } + int startSize = matchedWaypoints.size(); matchWaypointsToNodes(matchedWaypoints); + if (startSize < matchedWaypoints.size()) { + refTracks = new OsmTrack[matchedWaypoints.size()]; // used ways for alternatives + lastTracks = new OsmTrack[matchedWaypoints.size()]; + hasDirectRouting = true; + } routingContext.checkMatchedWaypointAgainstNogos(matchedWaypoints); @@ -968,7 +974,53 @@ public class RoutingEngine extends Thread { // geometric position matching finding the nearest routable way-section private void matchWaypointsToNodes(List unmatchedWaypoints) { resetCache(false); - nodesCache.matchWaypointsToNodes(unmatchedWaypoints, routingContext.waypointCatchingRange, islandNodePairs); + boolean useDynamicDistance = routingContext.useDynamicDistance; + double range = routingContext.waypointCatchingRange; + boolean ok = nodesCache.matchWaypointsToNodes(unmatchedWaypoints, range, islandNodePairs); + if (!ok && useDynamicDistance) { + logInfo("second check for way points"); + resetCache(false); + range = -range; + List tmp = new ArrayList<>(); + // only first or last checked + if (unmatchedWaypoints.get(0).crosspoint == null) tmp.add(unmatchedWaypoints.get(0)); + if (unmatchedWaypoints.get(unmatchedWaypoints.size()-1).crosspoint == null) tmp.add(unmatchedWaypoints.get(unmatchedWaypoints.size()-1)); + + ok = nodesCache.matchWaypointsToNodes(tmp, range, islandNodePairs); + } + if (!ok) { + for (MatchedWaypoint mwp :unmatchedWaypoints) { + if (mwp.crosspoint == null) throw new IllegalArgumentException(mwp.name + "-position not mapped in existing datafile"); + } + } + if (useDynamicDistance) { + List waypoints = new ArrayList<>(); + for (int i = 0; i < unmatchedWaypoints.size(); i++) { + MatchedWaypoint wp = unmatchedWaypoints.get(i); + if (wp.waypoint.calcDistance(wp.crosspoint) > routingContext.waypointCatchingRange) { + MatchedWaypoint nmw = new MatchedWaypoint(); + if (i==0) { + nmw.waypoint = new OsmNode(wp.waypoint.ilon, wp.waypoint.ilat); + nmw.crosspoint = new OsmNode(wp.waypoint.ilon, wp.waypoint.ilat); + nmw.direct = true; + wp.waypoint = new OsmNode(wp.crosspoint.ilon, wp.crosspoint.ilat); + } else { + nmw.waypoint = new OsmNode(wp.crosspoint.ilon, wp.crosspoint.ilat); + nmw.crosspoint = new OsmNode(wp.crosspoint.ilon, wp.crosspoint.ilat); + nmw.node1 = new OsmNode(wp.node1.ilon, wp.node1.ilat); + nmw.node2 = new OsmNode(wp.node2.ilon, wp.node2.ilat); + nmw.direct = true; + wp.crosspoint = new OsmNode(wp.waypoint.ilon, wp.waypoint.ilat); + } + nmw.name = wp.name; + waypoints.add(nmw); + wp.name = wp.name + "_add"; + } + waypoints.add(wp); + } + unmatchedWaypoints.clear(); + unmatchedWaypoints.addAll(waypoints); + } } private OsmTrack searchTrack(MatchedWaypoint startWp, MatchedWaypoint endWp, OsmTrack nearbyTrack, OsmTrack refTrack) {