From a6ba70a7861f8baca81294fbcfd13a4948874b81 Mon Sep 17 00:00:00 2001 From: afischerdev Date: Sun, 6 Oct 2024 11:50:13 +0200 Subject: [PATCH] expanded dynamic range --- .../main/java/btools/router/RoutingEngine.java | 15 ++++++++++----- .../main/java/btools/mapaccess/NodesCache.java | 4 ++-- .../btools/mapaccess/WaypointMatcherImpl.java | 7 ++++--- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/brouter-core/src/main/java/btools/router/RoutingEngine.java b/brouter-core/src/main/java/btools/router/RoutingEngine.java index eb53a2d..7c8261b 100644 --- a/brouter-core/src/main/java/btools/router/RoutingEngine.java +++ b/brouter-core/src/main/java/btools/router/RoutingEngine.java @@ -981,11 +981,16 @@ public class RoutingEngine extends Thread { logInfo("second check for way points"); resetCache(false); range = -range; - ok = nodesCache.matchWaypointsToNodes(unmatchedWaypoints, range, islandNodePairs); + List tmp = new ArrayList<>(); + for (MatchedWaypoint mwp : unmatchedWaypoints) { + if (mwp.crosspoint == null) tmp.add(mwp); + } + 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 (!ok) { + for (MatchedWaypoint mwp : unmatchedWaypoints) { + if (mwp.crosspoint == null) + throw new IllegalArgumentException(mwp.name + "-position not mapped in existing datafile"); } } if (useDynamicDistance) { @@ -994,7 +999,7 @@ public class RoutingEngine extends Thread { MatchedWaypoint wp = unmatchedWaypoints.get(i); if (wp.waypoint.calcDistance(wp.crosspoint) > routingContext.waypointCatchingRange) { MatchedWaypoint nmw = new MatchedWaypoint(); - if (i==0) { + 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; diff --git a/brouter-mapaccess/src/main/java/btools/mapaccess/NodesCache.java b/brouter-mapaccess/src/main/java/btools/mapaccess/NodesCache.java index a7c34a7..6600c6a 100644 --- a/brouter-mapaccess/src/main/java/btools/mapaccess/NodesCache.java +++ b/brouter-mapaccess/src/main/java/btools/mapaccess/NodesCache.java @@ -289,9 +289,9 @@ public final class NodesCache { int cellsize = 12500; preloadPosition(mwp.waypoint, cellsize, 1); // get a second chance - if (mwp.crosspoint == null) { + if (mwp.crosspoint == null || mwp.radius > Math.abs(maxDistance)) { cellsize = 1000000 / 32; - preloadPosition(mwp.waypoint, cellsize, maxDistance < 0 ? 5 : 2); + preloadPosition(mwp.waypoint, cellsize, maxDistance < 0 ? 15 : 2); } } diff --git a/brouter-mapaccess/src/main/java/btools/mapaccess/WaypointMatcherImpl.java b/brouter-mapaccess/src/main/java/btools/mapaccess/WaypointMatcherImpl.java index 2f09110..85247d4 100644 --- a/brouter-mapaccess/src/main/java/btools/mapaccess/WaypointMatcherImpl.java +++ b/brouter-mapaccess/src/main/java/btools/mapaccess/WaypointMatcherImpl.java @@ -47,7 +47,7 @@ public final class WaypointMatcherImpl implements WaypointMatcher { } for (MatchedWaypoint mwp : waypoints) { - mwp.radius = maxDistance; + mwp.radius = useDynamicRange ? mwp.radius != maxDistance ? mwp.radius : -1 : maxDistance; if (last != null && mwp.directionToNext == -1) { last.directionToNext = CheapAngleMeter.getDirection(last.waypoint.ilon, last.waypoint.ilat, mwp.waypoint.ilon, mwp.waypoint.ilat); } @@ -116,7 +116,7 @@ public final class WaypointMatcherImpl implements WaypointMatcher { double r22 = x2 * x2 + y2 * y2; double radius = Math.abs(r12 < r22 ? y1 * dx - x1 * dy : y2 * dx - x2 * dy) / d; - if (radius <= mwp.radius || (this.maxDistance == -1d && (i == 0 || i == maxWptIdx))) { + if (radius < mwp.radius || (this.maxDistance == -1d)) { double s1 = x1 * dx + y1 * dy; double s2 = x2 * dx + y2 * dy; @@ -127,8 +127,9 @@ public final class WaypointMatcherImpl implements WaypointMatcher { if (s2 > 0.) { radius = Math.sqrt(s1 < s2 ? r12 : r22); - if (radius > mwp.radius && this.maxDistance != -1) + if (radius > mwp.radius && mwp.radius != -1) { continue; + } } // new match for that waypoint mwp.radius = radius; // shortest distance to way