Fix critical issue with Cloudmade routing

This commit is contained in:
Victor Shcherb 2012-07-03 00:59:42 +02:00
parent 8535042418
commit 023576b6a1
2 changed files with 43 additions and 16 deletions

View file

@ -19,6 +19,7 @@ public class RouteCalculationResult {
// could not be null and immodifiable!
private final List<Location> locations;
private final List<RouteDirectionInfo> directions;
private final List<RouteSegmentResult> segments;
private final String errorMessage;
private final int[] listDistance;
@ -39,11 +40,12 @@ public class RouteCalculationResult {
List<RouteDirectionInfo> localDirections = directions == null? new ArrayList<RouteDirectionInfo>() : new ArrayList<RouteDirectionInfo>(directions);
if (!locations.isEmpty()) {
// if there is no closest points to start - add it
introduceFirstPoint(locations, start);
checkForDuplicatePoints(locations);
removeUnnecessaryGoAhead();
introduceFirstPoint(locations, localDirections, null, start);
checkForDuplicatePoints(locations, localDirections);
removeUnnecessaryGoAhead(localDirections);
}
this.locations = Collections.unmodifiableList(locations);
this.segments = new ArrayList<RouteSegmentResult>(locations.size());
this.listDistance = new int[locations.size()];
updateListDistanceTime();
@ -60,9 +62,10 @@ public class RouteCalculationResult {
List<RouteDirectionInfo> computeDirections = new ArrayList<RouteDirectionInfo>();
this.errorMessage = null;
List<Location> locations = new ArrayList<Location>();
convertVectorResult(computeDirections, locations, list, ctx);
introduceFirstPoint(locations, start);
List<RouteSegmentResult> segments = convertVectorResult(computeDirections, locations, list, ctx);
introduceFirstPoint(locations,computeDirections, segments, start);
this.locations = Collections.unmodifiableList(locations);
this.segments = Collections.unmodifiableList(segments);
this.listDistance = new int[locations.size()];
updateListDistanceTime();
@ -73,9 +76,10 @@ public class RouteCalculationResult {
/**
* PREPARATION
*/
private void convertVectorResult(List<RouteDirectionInfo> directions, List<Location> locations, List<RouteSegmentResult> list, Context ctx) {
private List<RouteSegmentResult> convertVectorResult(List<RouteDirectionInfo> directions, List<Location> locations, List<RouteSegmentResult> list, Context ctx) {
float prevDirectionTime = 0;
float prevDirectionDistance = 0;
List<RouteSegmentResult> segmentsToPopulate = new ArrayList<RouteSegmentResult>();
for (int routeInd = 0; routeInd < list.size(); routeInd++) {
RouteSegmentResult s = list.get(routeInd);
boolean plus = s.getStartPointIndex() < s.getEndPointIndex();
@ -90,10 +94,10 @@ public class RouteCalculationResult {
break;
}
locations.add(n);
segmentsToPopulate.add(s);
if (i == s.getEndPointIndex() ) {
break;
}
if (plus) {
i++;
} else {
@ -124,6 +128,7 @@ public class RouteCalculationResult {
prev.setAverageSpeed(prevDirectionDistance / prevDirectionTime);
prev.setDescriptionRoute(prev.getDescriptionRoute() + " " + OsmAndFormatter.getFormattedDistance(prevDirectionDistance, ctx));
}
return segmentsToPopulate;
}
protected void addMissingTurnsToRoute(List<RouteDirectionInfo> originalDirections, Location start, LatLon end, ApplicationMode mode, Context ctx,
@ -344,7 +349,7 @@ public class RouteCalculationResult {
* Remove unnecessary go straight from CloudMade.
* Remove also last direction because it will be added after.
*/
private void removeUnnecessaryGoAhead() {
private void removeUnnecessaryGoAhead(List<RouteDirectionInfo> directions) {
if (directions != null && directions.size() > 1) {
for (int i = 1; i < directions.size();) {
RouteDirectionInfo r = directions.get(i);
@ -364,7 +369,7 @@ public class RouteCalculationResult {
* PREPARATION
* Check points for duplicates (it is very bad for routing) - cloudmade could return it
*/
private void checkForDuplicatePoints(List<Location> locations) {
private void checkForDuplicatePoints(List<Location> locations, List<RouteDirectionInfo> directions) {
//
for (int i = 0; i < locations.size() - 1;) {
if (locations.get(i).distanceTo(locations.get(i + 1)) == 0) {
@ -386,10 +391,13 @@ public class RouteCalculationResult {
* PREPARATION
* If beginning is too far from start point, then introduce GO Ahead
*/
private void introduceFirstPoint(List<Location> locations, Location start) {
private void introduceFirstPoint(List<Location> locations, List<RouteDirectionInfo> directions, List<RouteSegmentResult> segs, Location start) {
if (!locations.isEmpty() && locations.get(0).distanceTo(start) > 200) {
// 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++;
@ -417,6 +425,10 @@ public class RouteCalculationResult {
}
}
/**
* PREPARATION
* At the end always update listDistance local vars and time
*/
private void updateDirectionsTime() {
int sum = 0;
for (int i = directions.size() - 1; i >= 0; i--) {

View file

@ -12,6 +12,11 @@ public class RouteDirectionInfo {
// Speed after the action till next turn
private float averageSpeed;
private String ref;
private String streetName;
// Constructor to verify average speed always > 0
public RouteDirectionInfo(float averageSpeed, TurnType turnType) {
this.averageSpeed = averageSpeed == 0 ? 1 : averageSpeed;
@ -22,6 +27,22 @@ public class RouteDirectionInfo {
return descriptionRoute;
}
public String getRef() {
return ref;
}
public void setRef(String ref) {
this.ref = ref;
}
public String getStreetName() {
return streetName;
}
public void setStreetName(String streetName) {
this.streetName = streetName;
}
public void setDescriptionRoute(String descriptionRoute) {
this.descriptionRoute = descriptionRoute;
}
@ -45,12 +66,6 @@ public class RouteDirectionInfo {
}
// TODO add from parser
// public String ref;
// public String streetName;
// // speed limit in m/s (should be array of speed limits?)
// public float speedLimit;
// calculated vars
// after action (excluding expectedTime)
public int afterLeftTime;