Implement increasing road priority algorithm (so in the middle routing does not attempt to work with low priorities roads
This commit is contained in:
parent
8c47374245
commit
01d7a74f2c
5 changed files with 48 additions and 5 deletions
|
@ -84,6 +84,7 @@ public class BicycleRouter extends VehicleRouter {
|
|||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
public boolean isOneWay(int highwayAttributes) {
|
||||
return MapRenderingTypes.isOneWayWay(highwayAttributes) || MapRenderingTypes.isRoundabout(highwayAttributes);
|
||||
|
|
|
@ -203,11 +203,13 @@ public class BinaryRoutePlanner {
|
|||
|
||||
// Extract & analyze segment with min(f(x)) from queue while final segment is not found
|
||||
boolean inverse = false;
|
||||
double roadDirectPriority = 0;
|
||||
double roadOppositePriority = 0;
|
||||
|
||||
PriorityQueue<RouteSegment> graphSegments = inverse ? graphReverseSegments : graphDirectSegments;
|
||||
while(!graphSegments.isEmpty()){
|
||||
RouteSegment segment = graphSegments.poll();
|
||||
|
||||
|
||||
ctx.visitedSegments ++;
|
||||
// for debug purposes
|
||||
if (ctx.visitor != null) {
|
||||
|
@ -234,7 +236,8 @@ public class BinaryRoutePlanner {
|
|||
break;
|
||||
}
|
||||
inverse = nonHeuristicSegmentsComparator.compare(graphDirectSegments.peek(), graphReverseSegments.peek()) > 0;
|
||||
// inverse = !inverse;
|
||||
// different strategy : use onedirectional graph
|
||||
// inverse = true;
|
||||
graphSegments = inverse ? graphReverseSegments : graphDirectSegments;
|
||||
}
|
||||
|
||||
|
@ -388,9 +391,18 @@ public class BinaryRoutePlanner {
|
|||
oppSegment.segmentEnd = next.segmentStart;
|
||||
return oppSegment;
|
||||
}
|
||||
boolean processRoad = true;
|
||||
if (ctx.useStrategyOfIncreasingRoadPriorities) {
|
||||
double roadPriority = ctx.router.getRoadPriority(segment.road);
|
||||
double nextRoadPriority = ctx.router.getRoadPriority(segment.road);
|
||||
if (nextRoadPriority < roadPriority) {
|
||||
processRoad = false;
|
||||
}
|
||||
}
|
||||
|
||||
/* next.road.getId() >> 3 (1) != road.getId() >> 3 (1) - used that line for debug with osm map */
|
||||
// road.id could be equal on roundabout, but we should accept them
|
||||
if (!visitedSegments.contains(nts)) {
|
||||
if (!visitedSegments.contains(nts) && processRoad) {
|
||||
int type = -1;
|
||||
for (int i = 0; i < road.getRestrictionCount(); i++) {
|
||||
if (road.getRestriction(i) == next.road.getId()) {
|
||||
|
@ -621,6 +633,7 @@ public class BinaryRoutePlanner {
|
|||
public static class RoutingContext {
|
||||
// parameters of routing
|
||||
public int heuristicCoefficient = DEFAULT_HEURISTIC_COEFFICIENT;
|
||||
public boolean useStrategyOfIncreasingRoadPriorities = true;
|
||||
public VehicleRouter router = new CarRouter();
|
||||
|
||||
//
|
||||
|
|
|
@ -95,6 +95,25 @@ public class CarRouter extends VehicleRouter {
|
|||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getRoadPriority(BinaryMapDataObject road) {
|
||||
TagValuePair pair = road.getTagValue(0);
|
||||
boolean highway = "highway".equals(pair.tag);
|
||||
double priority = highway && autoPriorityValues.containsKey(pair.value) ? autoPriorityValues.get(pair.value) : 0.5d;
|
||||
if("motorway_link".equals(pair.value) || "trunk".equals(pair.value) ||
|
||||
"trunk_link".equals(pair.value) || "motorway".equals(pair.value)) {
|
||||
return 1.3d;
|
||||
} else if(priority >= 1){
|
||||
return 1;
|
||||
} else if(priority >= 0.7){
|
||||
return 0.7;
|
||||
} else if(priority >= 0.5){
|
||||
return 0.5;
|
||||
} else {
|
||||
return 0.3;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* return speed in m/s
|
||||
|
@ -103,7 +122,7 @@ public class CarRouter extends VehicleRouter {
|
|||
TagValuePair pair = road.getTagValue(0);
|
||||
double speed = MapRenderingTypes.getMaxSpeedIfDefined(road.getHighwayAttributes()) / 3.6d;
|
||||
boolean highway = "highway".equals(pair.tag);
|
||||
double priority = highway && autoPriorityValues.containsKey(pair.value) ? autoPriorityValues.get(pair.value) : 1d;
|
||||
double priority = highway && autoPriorityValues.containsKey(pair.value) ? autoPriorityValues.get(pair.value) : 0.5d;
|
||||
if (speed == 0 && highway) {
|
||||
Double value = autoNotDefinedValues.get(pair.value);
|
||||
if (value == null) {
|
||||
|
|
|
@ -28,6 +28,16 @@ public abstract class VehicleRouter {
|
|||
int attributes = road.getHighwayAttributes();
|
||||
return MapRenderingTypes.isOneWayWay(attributes) || MapRenderingTypes.isRoundabout(attributes);
|
||||
}
|
||||
|
||||
/**
|
||||
* Used for algorithm of increasing road priorities (actually make sense only for car routing)
|
||||
* other routers can increase/decrease road priorities in the middle of route
|
||||
* @param road
|
||||
* @return
|
||||
*/
|
||||
public double getRoadPriority(BinaryMapDataObject road) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* return delay in seconds
|
||||
|
|
|
@ -49,7 +49,7 @@ import org.xml.sax.SAXException;
|
|||
public class MapRouterLayer implements MapPanelLayer {
|
||||
|
||||
private /*final */ static boolean ANIMATE_CALCULATING_ROUTE = false;
|
||||
private /*final */ static int SIZE_OF_ROUTES_TO_ANIMATE = 50;
|
||||
private /*final */ static int SIZE_OF_ROUTES_TO_ANIMATE = 250;
|
||||
|
||||
|
||||
private MapPanel map;
|
||||
|
|
Loading…
Reference in a new issue