Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Enhance dynamic range logic #747

Merged
merged 5 commits into from
Jan 12, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 35 additions & 14 deletions brouter-core/src/main/java/btools/router/RoutingEngine.java
Original file line number Diff line number Diff line change
Expand Up @@ -551,16 +551,11 @@ private OsmTrack findTrack(OsmTrack[] refTracks, OsmTrack[] lastTracks) {
return tryFindTrack(refTracks, lastTracks);
} catch (RoutingIslandException rie) {
if (routingContext.useDynamicDistance) {
useNodePoints = true;
boolean useNodeOne = true;
if (extraWaypoints != null) useNodeOne = false;
extraWaypoints = new ArrayList<>();
for (MatchedWaypoint mwp : matchedWaypoints) {
if (mwp.name.contains("_add")) {
OsmNodeNamed wp = new OsmNodeNamed(useNodeOne ? mwp.node1 : mwp.node1);
wp.name = mwp.name;
wp.direct = mwp.direct;
extraWaypoints.add(wp);
long n1 = mwp.node1.getIdFromPos();
long n2 = mwp.node2.getIdFromPos();
islandNodePairs.addTempPair(n1, n2);
}
}
}
Expand Down Expand Up @@ -590,6 +585,7 @@ private OsmTrack tryFindTrack(OsmTrack[] refTracks, OsmTrack[] lastTracks) {
nUnmatched++;
}
}
extraWaypoints = null;
}
if (lastTracks.length < waypoints.size()-1) {
refTracks = new OsmTrack[waypoints.size()-1]; // used ways for alternatives
Expand Down Expand Up @@ -633,6 +629,10 @@ private OsmTrack tryFindTrack(OsmTrack[] refTracks, OsmTrack[] lastTracks) {
hasDirectRouting = true;
}

for (MatchedWaypoint mwp : matchedWaypoints) {
if (hasInfo()) logInfo("new wp=" + mwp.waypoint + " " + mwp.crosspoint + (mwp.direct ? " direct" : ""));
}

routingContext.checkMatchedWaypointAgainstNogos(matchedWaypoints);

// detect target islands: restricted search in inverse direction
Expand Down Expand Up @@ -1029,7 +1029,7 @@ private void matchWaypointsToNodes(List<MatchedWaypoint> unmatchedWaypoints) {
range = -MAX_DYNAMIC_RANGE;
List<MatchedWaypoint> tmp = new ArrayList<>();
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);
}
Expand All @@ -1039,7 +1039,8 @@ private void matchWaypointsToNodes(List<MatchedWaypoint> unmatchedWaypoints) {
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<>();
for (int i = 0; i < unmatchedWaypoints.size(); i++) {
MatchedWaypoint wp = unmatchedWaypoints.get(i);
Expand All @@ -1055,6 +1056,9 @@ private void matchWaypointsToNodes(List<MatchedWaypoint> unmatchedWaypoints) {
onn = new OsmNodeNamed(wp.crosspoint);
onn.name = wp.name + "_add";
wp.waypoint = onn;
waypoints.add(nmw);
wp.name = wp.name + "_add";
waypoints.add(wp);
} else {
OsmNodeNamed onn = new OsmNodeNamed(wp.crosspoint);
onn.name = wp.name + "_add";
Expand All @@ -1063,13 +1067,30 @@ private void matchWaypointsToNodes(List<MatchedWaypoint> unmatchedWaypoints) {
nmw.node1 = new OsmNode(wp.node1.ilon, wp.node1.ilat);
nmw.node2 = new OsmNode(wp.node2.ilon, wp.node2.ilat);
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);
}
if (wp.name != null) nmw.name = wp.name;
waypoints.add(nmw);
wp.name = wp.name + "_add";

} else {
waypoints.add(wp);
}
waypoints.add(wp);
}
unmatchedWaypoints.clear();
unmatchedWaypoints.addAll(waypoints);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,11 @@

public final class NodesCache {

final static int RETRY_RANGE = 250;

private int MAX_DYNAMIC_CATCHES = 20; // used with RoutingEngiine MAX_DYNAMIC_RANGE = 60000m


private File segmentDir;
private File secondarySegmentsDir = null;

Expand Down Expand Up @@ -292,7 +295,7 @@ public boolean matchWaypointsToNodes(List<MatchedWaypoint> unmatchedWaypoints, d
int cellsize = 12500;
preloadPosition(mwp.waypoint, cellsize, 1, false);
// get a second chance
if (mwp.crosspoint == null || mwp.radius > Math.abs(maxDistance)) {
if (mwp.crosspoint == null || mwp.radius > RETRY_RANGE) {
cellsize = 1000000 / 32;
preloadPosition(mwp.waypoint, cellsize, maxDistance < 0 ? MAX_DYNAMIC_CATCHES : 2, maxDistance < 0);
}
Expand Down
12 changes: 12 additions & 0 deletions docs/developers/profile_developers_guide.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
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

- `turncost`
Expand Down
20 changes: 11 additions & 9 deletions misc/profiles2/car-vario.brf
Original file line number Diff line number Diff line change
Expand Up @@ -55,15 +55,17 @@ assign caraccess
switch motor_vehicle=
switch vehicle=
switch access=
switch highway=motorway|motorway_link 1
switch highway=trunk|trunk_link 1
switch highway=primary|primary_link 1
switch highway=secondary|secondary_link 1
switch highway=tertiary|tertiary_link 1
switch highway=unclassified 1
switch route=ferry 1
switch isresidentialorliving 1
switch highway=service 1
switch highway=motorway|motorway_link 1
switch highway=trunk|trunk_link 1
switch highway=primary|primary_link 1
switch highway=secondary|secondary_link 1
switch highway=tertiary|tertiary_link 1
switch highway=unclassified 1
switch and highway=track use_dynamic_range 1
switch and highway=road use_dynamic_range 1
switch route=ferry 1
switch isresidentialorliving 1
switch highway=service 1
0
access=yes|permissive|designated|destination
vehicle=yes|designated|destination
Expand Down
Loading