commit
74bd9a002d
1 changed files with 68 additions and 16 deletions
|
@ -35,6 +35,7 @@ public class RouteCalculationResult {
|
|||
|
||||
private static double distanceClosestToIntermediate = 3000;
|
||||
private static double distanceThresholdToIntermediate = 25;
|
||||
private static double DISTANCE_THRESHOLD_TO_INTRODUCE_FIRST_AND_LAST_POINTS = 50;
|
||||
// could not be null and immodifiable!
|
||||
private final List<Location> locations;
|
||||
private final List<RouteDirectionInfo> directions;
|
||||
|
@ -692,22 +693,9 @@ public class RouteCalculationResult {
|
|||
private static void introduceFirstPointAndLastPoint(List<Location> locations, List<RouteDirectionInfo> directions,
|
||||
List<RouteSegmentResult> segs, Location start, LatLon end,
|
||||
OsmandApplication ctx) {
|
||||
if (!locations.isEmpty() && locations.get(0).distanceTo(start) > 50) {
|
||||
// add start point
|
||||
locations.add(0, start);
|
||||
if(segs != null) {
|
||||
segs.add(0, segs.get(0));
|
||||
}
|
||||
if (directions != null && !directions.isEmpty()) {
|
||||
for (RouteDirectionInfo i : directions) {
|
||||
i.routePointOffset++;
|
||||
}
|
||||
RouteDirectionInfo info = new RouteDirectionInfo(directions.get(0).getAverageSpeed(),
|
||||
TurnType.straight());
|
||||
info.routePointOffset = 0;
|
||||
// info.setDescriptionRoute(ctx.getString( R.string.route_head));//; //$NON-NLS-1$
|
||||
directions.add(0, info);
|
||||
}
|
||||
boolean firstPointIntroduced = introduceFirstPoint(locations, directions, segs, start);
|
||||
boolean lastPointIntroduced = introduceLastPoint(locations, directions, segs, end);
|
||||
if (firstPointIntroduced || lastPointIntroduced) {
|
||||
checkForDuplicatePoints(locations, directions);
|
||||
}
|
||||
RouteDirectionInfo lastDirInf = directions.size() > 0 ? directions.get(directions.size() - 1) : null;
|
||||
|
@ -742,6 +730,70 @@ public class RouteCalculationResult {
|
|||
}
|
||||
}
|
||||
|
||||
private static boolean introduceFirstPoint(List<Location> locations, List<RouteDirectionInfo> directions,
|
||||
List<RouteSegmentResult> segs, Location start) {
|
||||
if (!locations.isEmpty() && locations.get(0).distanceTo(start) > DISTANCE_THRESHOLD_TO_INTRODUCE_FIRST_AND_LAST_POINTS) {
|
||||
// add start point
|
||||
locations.add(0, start);
|
||||
if (segs != null) {
|
||||
segs.add(0, segs.get(0));
|
||||
}
|
||||
if (directions != null && !directions.isEmpty()) {
|
||||
for (RouteDirectionInfo i : directions) {
|
||||
i.routePointOffset++;
|
||||
}
|
||||
RouteDirectionInfo info = new RouteDirectionInfo(directions.get(0).getAverageSpeed(), TurnType.straight());
|
||||
info.routePointOffset = 0;
|
||||
// info.setDescriptionRoute(ctx.getString( R.string.route_head));//; //$NON-NLS-1$
|
||||
directions.add(0, info);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private static boolean introduceLastPoint(List<Location> locations, List<RouteDirectionInfo> directions,
|
||||
List<RouteSegmentResult> segs, LatLon end) {
|
||||
if (!locations.isEmpty()) {
|
||||
Location lastFoundLocation = locations.get(locations.size() - 1);
|
||||
|
||||
Location endLocation = new Location(lastFoundLocation.getProvider());
|
||||
endLocation.setLatitude(end.getLatitude());
|
||||
endLocation.setLongitude(end.getLongitude());
|
||||
|
||||
if (lastFoundLocation.distanceTo(endLocation) > DISTANCE_THRESHOLD_TO_INTRODUCE_FIRST_AND_LAST_POINTS) {
|
||||
if (directions != null && !directions.isEmpty()) {
|
||||
if (locations.size() > 2) {
|
||||
int type = TurnType.C;
|
||||
Location prevLast = locations.get(locations.size() - 2);
|
||||
float lastBearing = prevLast.bearingTo(lastFoundLocation);
|
||||
float bearingToEnd = lastFoundLocation.bearingTo(endLocation);
|
||||
double diff = MapUtils.degreesDiff(lastBearing, bearingToEnd);
|
||||
if (Math.abs(diff) > 10) {
|
||||
if (Math.abs(diff) < 60) {
|
||||
type = diff > 0 ? TurnType.TSLL : TurnType.TSLR;
|
||||
} else {
|
||||
type = diff > 0 ? TurnType.TL : TurnType.TR;
|
||||
}
|
||||
}
|
||||
|
||||
RouteDirectionInfo lastDirInf = directions.get(directions.size() - 1);
|
||||
RouteDirectionInfo info = new RouteDirectionInfo(lastDirInf != null ? lastDirInf.getAverageSpeed() : 1, TurnType.valueOf(type, false));
|
||||
info.routePointOffset = locations.size() - 1;
|
||||
directions.add(info);
|
||||
}
|
||||
}
|
||||
// add end point
|
||||
locations.add(endLocation);
|
||||
if (segs != null) {
|
||||
segs.add(segs.get(segs.size() - 1));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* PREPARATION
|
||||
* At the end always update listDistance local vars and time
|
||||
|
|
Loading…
Reference in a new issue