Merge pull request #747 from afischerdev/dynamic-range

Enhance dynamic range logic
This commit is contained in:
afischerdev 2025-01-12 18:08:13 +01:00 committed by GitHub
commit e521eac5c8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 62 additions and 24 deletions

View File

@ -551,16 +551,11 @@ public class RoutingEngine extends Thread {
return tryFindTrack(refTracks, lastTracks); return tryFindTrack(refTracks, lastTracks);
} catch (RoutingIslandException rie) { } catch (RoutingIslandException rie) {
if (routingContext.useDynamicDistance) { if (routingContext.useDynamicDistance) {
useNodePoints = true;
boolean useNodeOne = true;
if (extraWaypoints != null) useNodeOne = false;
extraWaypoints = new ArrayList<>();
for (MatchedWaypoint mwp : matchedWaypoints) { for (MatchedWaypoint mwp : matchedWaypoints) {
if (mwp.name.contains("_add")) { if (mwp.name.contains("_add")) {
OsmNodeNamed wp = new OsmNodeNamed(useNodeOne ? mwp.node1 : mwp.node1); long n1 = mwp.node1.getIdFromPos();
wp.name = mwp.name; long n2 = mwp.node2.getIdFromPos();
wp.direct = mwp.direct; islandNodePairs.addTempPair(n1, n2);
extraWaypoints.add(wp);
} }
} }
} }
@ -590,6 +585,7 @@ public class RoutingEngine extends Thread {
nUnmatched++; nUnmatched++;
} }
} }
extraWaypoints = null;
} }
if (lastTracks.length < waypoints.size()-1) { if (lastTracks.length < waypoints.size()-1) {
refTracks = new OsmTrack[waypoints.size()-1]; // used ways for alternatives refTracks = new OsmTrack[waypoints.size()-1]; // used ways for alternatives
@ -633,6 +629,10 @@ public class RoutingEngine extends Thread {
hasDirectRouting = true; hasDirectRouting = true;
} }
for (MatchedWaypoint mwp : matchedWaypoints) {
if (hasInfo()) logInfo("new wp=" + mwp.waypoint + " " + mwp.crosspoint + (mwp.direct ? " direct" : ""));
}
routingContext.checkMatchedWaypointAgainstNogos(matchedWaypoints); routingContext.checkMatchedWaypointAgainstNogos(matchedWaypoints);
// detect target islands: restricted search in inverse direction // detect target islands: restricted search in inverse direction
@ -1029,7 +1029,7 @@ public class RoutingEngine extends Thread {
range = -MAX_DYNAMIC_RANGE; range = -MAX_DYNAMIC_RANGE;
List<MatchedWaypoint> tmp = new ArrayList<>(); List<MatchedWaypoint> tmp = new ArrayList<>();
for (MatchedWaypoint mwp : unmatchedWaypoints) { for (MatchedWaypoint mwp : unmatchedWaypoints) {
if (mwp.crosspoint == null) tmp.add(mwp); if (mwp.crosspoint == null || mwp.radius >= routingContext.waypointCatchingRange) tmp.add(mwp);
} }
ok = nodesCache.matchWaypointsToNodes(tmp, range, islandNodePairs); ok = nodesCache.matchWaypointsToNodes(tmp, range, islandNodePairs);
} }
@ -1039,7 +1039,8 @@ public class RoutingEngine extends Thread {
throw new IllegalArgumentException(mwp.name + "-position not mapped in existing datafile"); throw new IllegalArgumentException(mwp.name + "-position not mapped in existing datafile");
} }
} }
if (useDynamicDistance) { // add beeline points when not already done
if (useDynamicDistance && !useNodePoints) {
List<MatchedWaypoint> waypoints = new ArrayList<>(); List<MatchedWaypoint> waypoints = new ArrayList<>();
for (int i = 0; i < unmatchedWaypoints.size(); i++) { for (int i = 0; i < unmatchedWaypoints.size(); i++) {
MatchedWaypoint wp = unmatchedWaypoints.get(i); MatchedWaypoint wp = unmatchedWaypoints.get(i);
@ -1055,6 +1056,9 @@ public class RoutingEngine extends Thread {
onn = new OsmNodeNamed(wp.crosspoint); onn = new OsmNodeNamed(wp.crosspoint);
onn.name = wp.name + "_add"; onn.name = wp.name + "_add";
wp.waypoint = onn; wp.waypoint = onn;
waypoints.add(nmw);
wp.name = wp.name + "_add";
waypoints.add(wp);
} else { } else {
OsmNodeNamed onn = new OsmNodeNamed(wp.crosspoint); OsmNodeNamed onn = new OsmNodeNamed(wp.crosspoint);
onn.name = wp.name + "_add"; onn.name = wp.name + "_add";
@ -1063,13 +1067,30 @@ public class RoutingEngine extends Thread {
nmw.node1 = new OsmNode(wp.node1.ilon, wp.node1.ilat); nmw.node1 = new OsmNode(wp.node1.ilon, wp.node1.ilat);
nmw.node2 = new OsmNode(wp.node2.ilon, wp.node2.ilat); nmw.node2 = new OsmNode(wp.node2.ilon, wp.node2.ilat);
nmw.direct = true; nmw.direct = true;
if (wp.name != null) nmw.name = wp.name;
waypoints.add(nmw);
wp.name = wp.name + "_add";
waypoints.add(wp);
if (wp.name.startsWith("via")) {
wp.direct = true;
MatchedWaypoint emw = new MatchedWaypoint();
OsmNodeNamed onn2 = new OsmNodeNamed(wp.crosspoint);
onn2.name = wp.name + "_2";
emw.name = onn2.name;
emw.waypoint = onn2;
emw.crosspoint = new OsmNode(nmw.crosspoint.ilon, nmw.crosspoint.ilat);
emw.node1 = new OsmNode(nmw.node1.ilon, nmw.node1.ilat);
emw.node2 = new OsmNode(nmw.node2.ilon, nmw.node2.ilat);
emw.direct = false;
waypoints.add(emw);
}
wp.crosspoint = new OsmNode(wp.waypoint.ilon, wp.waypoint.ilat); wp.crosspoint = new OsmNode(wp.waypoint.ilon, wp.waypoint.ilat);
} }
if (wp.name != null) nmw.name = wp.name;
waypoints.add(nmw); } else {
wp.name = wp.name + "_add"; waypoints.add(wp);
} }
waypoints.add(wp);
} }
unmatchedWaypoints.clear(); unmatchedWaypoints.clear();
unmatchedWaypoints.addAll(waypoints); unmatchedWaypoints.addAll(waypoints);

View File

@ -18,8 +18,11 @@ import btools.expressions.BExpressionContextWay;
public final class NodesCache { public final class NodesCache {
final static int RETRY_RANGE = 250;
private int MAX_DYNAMIC_CATCHES = 20; // used with RoutingEngiine MAX_DYNAMIC_RANGE = 60000m private int MAX_DYNAMIC_CATCHES = 20; // used with RoutingEngiine MAX_DYNAMIC_RANGE = 60000m
private File segmentDir; private File segmentDir;
private File secondarySegmentsDir = null; private File secondarySegmentsDir = null;
@ -292,7 +295,7 @@ public final class NodesCache {
int cellsize = 12500; int cellsize = 12500;
preloadPosition(mwp.waypoint, cellsize, 1, false); preloadPosition(mwp.waypoint, cellsize, 1, false);
// get a second chance // get a second chance
if (mwp.crosspoint == null || mwp.radius > Math.abs(maxDistance)) { if (mwp.crosspoint == null || mwp.radius > RETRY_RANGE) {
cellsize = 1000000 / 32; cellsize = 1000000 / 32;
preloadPosition(mwp.waypoint, cellsize, maxDistance < 0 ? MAX_DYNAMIC_CATCHES : 2, maxDistance < 0); preloadPosition(mwp.waypoint, cellsize, maxDistance < 0 ? MAX_DYNAMIC_CATCHES : 2, maxDistance < 0);
} }

View File

@ -116,6 +116,18 @@ Some variable names are pre-defined and accessed by the routing engine:
table exported as CSV. Setting it to true/1, Brouter-web Data page will table exported as CSV. Setting it to true/1, Brouter-web Data page will
list all tags present in the RD5 file. list all tags present in the RD5 file.
- `use_dynamic_range` default=false
To find the start / end points for a route, BRouter normally uses the
variable `waypointCatchingRange` with a default value of 250 m. In some
situations, adding a few meters here is not enough to find a point.
With this new variable, it goes deeper and could reach a radius of about 50 km.
From this point, the more distant road connection is established as the beeline
and included in the calculation.
This is helpful in areas with less road coverage like in the Arabic world or
similar areas.
- for the way section these are - for the way section these are
- `turncost` - `turncost`

View File

@ -55,15 +55,17 @@ assign caraccess
switch motor_vehicle= switch motor_vehicle=
switch vehicle= switch vehicle=
switch access= switch access=
switch highway=motorway|motorway_link 1 switch highway=motorway|motorway_link 1
switch highway=trunk|trunk_link 1 switch highway=trunk|trunk_link 1
switch highway=primary|primary_link 1 switch highway=primary|primary_link 1
switch highway=secondary|secondary_link 1 switch highway=secondary|secondary_link 1
switch highway=tertiary|tertiary_link 1 switch highway=tertiary|tertiary_link 1
switch highway=unclassified 1 switch highway=unclassified 1
switch route=ferry 1 switch and highway=track use_dynamic_range 1
switch isresidentialorliving 1 switch and highway=road use_dynamic_range 1
switch highway=service 1 switch route=ferry 1
switch isresidentialorliving 1
switch highway=service 1
0 0
access=yes|permissive|designated|destination access=yes|permissive|designated|destination
vehicle=yes|designated|destination vehicle=yes|designated|destination