Merge remote-tracking branch 'origin/master'

This commit is contained in:
Weblate 2013-11-26 00:55:38 +01:00
commit 37833a10e8
2 changed files with 56 additions and 47 deletions

View file

@ -14,10 +14,9 @@ import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteTypeRule;
import net.osmand.data.DataTileManager; import net.osmand.data.DataTileManager;
import net.osmand.data.LatLon; import net.osmand.data.LatLon;
import net.osmand.plus.ApplicationMode; import net.osmand.plus.ApplicationMode;
import net.osmand.plus.GPXUtilities.WptPt;
import net.osmand.plus.ClientContext; import net.osmand.plus.ClientContext;
import net.osmand.plus.GPXUtilities.WptPt;
import net.osmand.plus.OsmAndFormatter; import net.osmand.plus.OsmAndFormatter;
import net.osmand.plus.OsmandSettings;
import net.osmand.plus.R; import net.osmand.plus.R;
import net.osmand.router.RouteSegmentResult; import net.osmand.router.RouteSegmentResult;
import net.osmand.router.TurnType; import net.osmand.router.TurnType;
@ -47,35 +46,45 @@ public class RouteCalculationResult {
protected int lastWaypointGPX = 0; protected int lastWaypointGPX = 0;
public RouteCalculationResult(String errorMessage) { public RouteCalculationResult(String errorMessage) {
this(null, null, null, null, null, null, errorMessage, null, false, false); this.errorMessage = errorMessage;
this.routingTime = 0;
this.intermediatePoints = new int[0];
this.locations = new ArrayList<Location>();
this.segments = new ArrayList<RouteSegmentResult>();
this.listDistance = new int[0];
this.directions = new ArrayList<RouteDirectionInfo>();
this.alarmInfo = new ArrayList<AlarmInfo>();
this.waypointIndexes = new int[0];
this.waypoints = new ArrayList<WptPt>();
} }
public RouteCalculationResult(List<Location> list, List<RouteDirectionInfo> directions, Location start, LatLon end, public RouteCalculationResult(List<Location> list, List<RouteDirectionInfo> directions, RouteCalculationParams params,
List<LatLon> intermediates, DataTileManager<WptPt> waypointsTm, String errorMessage, ClientContext ctx, boolean leftSide, boolean addMissingTurns) { DataTileManager<WptPt> waypointsTm) {
this.routingTime = 0; this.routingTime = 0;
this.errorMessage = errorMessage; this.errorMessage = null;
this.intermediatePoints = new int[intermediates == null ? 0 : intermediates.size()]; this.intermediatePoints = new int[params.intermediates == null ? 0 : params.intermediates.size()];
List<Location> locations = list == null ? new ArrayList<Location>() : new ArrayList<Location>(list); List<Location> locations = list == null ? new ArrayList<Location>() : new ArrayList<Location>(list);
List<RouteDirectionInfo> localDirections = directions == null? new ArrayList<RouteDirectionInfo>() : new ArrayList<RouteDirectionInfo>(directions); List<RouteDirectionInfo> localDirections = directions == null? new ArrayList<RouteDirectionInfo>() : new ArrayList<RouteDirectionInfo>(directions);
if (!locations.isEmpty()) { if (!locations.isEmpty()) {
checkForDuplicatePoints(locations, localDirections); checkForDuplicatePoints(locations, localDirections);
} }
boolean addMissingTurns = true;
if(addMissingTurns) { if(addMissingTurns) {
removeUnnecessaryGoAhead(localDirections); removeUnnecessaryGoAhead(localDirections);
OsmandSettings settings = ctx.getSettings(); addMissingTurnsToRoute(locations, localDirections, params.start,params.end,
addMissingTurnsToRoute(locations, localDirections, start, end, settings.getApplicationMode(), ctx, leftSide); params.mode, params.ctx, params.leftSide);
// if there is no closest points to start - add it // if there is no closest points to start - add it
introduceFirstPointAndLastPoint(locations, localDirections, null, start, end); introduceFirstPointAndLastPoint(locations, localDirections, null, params.start, params.end);
} }
this.locations = Collections.unmodifiableList(locations); this.locations = Collections.unmodifiableList(locations);
this.segments = new ArrayList<RouteSegmentResult>(); this.segments = new ArrayList<RouteSegmentResult>();
this.listDistance = new int[locations.size()]; this.listDistance = new int[locations.size()];
updateListDistanceTime(); updateListDistanceTime(this.listDistance, this.locations);
this.alarmInfo = new ArrayList<AlarmInfo>(); this.alarmInfo = new ArrayList<AlarmInfo>();
calculateIntermediateIndexes(ctx, intermediates, localDirections); calculateIntermediateIndexes(params.ctx, this.locations, params.intermediates, localDirections, this.intermediatePoints);
this.directions = Collections.unmodifiableList(localDirections); this.directions = Collections.unmodifiableList(localDirections);
updateDirectionsTime(); updateDirectionsTime(this.directions, this.listDistance);
this.waypoints = new ArrayList<WptPt>(); this.waypoints = new ArrayList<WptPt>();
this.waypointIndexes = calculateWaypointIndexes(list, waypointsTm, waypoints); this.waypointIndexes = calculateWaypointIndexes(list, waypointsTm, waypoints);
} }
@ -94,11 +103,11 @@ public class RouteCalculationResult {
this.locations = Collections.unmodifiableList(locations); this.locations = Collections.unmodifiableList(locations);
this.segments = Collections.unmodifiableList(segments); this.segments = Collections.unmodifiableList(segments);
this.listDistance = new int[locations.size()]; this.listDistance = new int[locations.size()];
calculateIntermediateIndexes(ctx, intermediates, computeDirections); calculateIntermediateIndexes(ctx, this.locations, intermediates, computeDirections, this.intermediatePoints);
updateListDistanceTime(); updateListDistanceTime(this.listDistance, this.locations);
this.directions = Collections.unmodifiableList(computeDirections); this.directions = Collections.unmodifiableList(computeDirections);
updateDirectionsTime(); updateDirectionsTime(this.directions, this.listDistance);
this.alarmInfo = Collections.unmodifiableList(alarms); this.alarmInfo = Collections.unmodifiableList(alarms);
this.waypointIndexes = new int[0]; this.waypointIndexes = new int[0];
this.waypoints = new ArrayList<WptPt>(); this.waypoints = new ArrayList<WptPt>();
@ -129,7 +138,8 @@ public class RouteCalculationResult {
return Collections.emptyList(); return Collections.emptyList();
} }
private void calculateIntermediateIndexes(ClientContext ctx, List<LatLon> intermediates, List<RouteDirectionInfo> localDirections) { private static void calculateIntermediateIndexes(ClientContext ctx, List<Location> locations,
List<LatLon> intermediates, List<RouteDirectionInfo> localDirections, int[] intermediatePoints) {
if(intermediates != null && localDirections != null) { if(intermediates != null && localDirections != null) {
int[] interLocations = new int[intermediates.size()]; int[] interLocations = new int[intermediates.size()];
int currentIntermediate = 0; int currentIntermediate = 0;
@ -137,16 +147,16 @@ public class RouteCalculationResult {
double distanceThreshold = 25; double distanceThreshold = 25;
double prevDistance = distanceThreshold * 4; double prevDistance = distanceThreshold * 4;
while((currentIntermediate < intermediates.size() || prevDistance > distanceThreshold) while((currentIntermediate < intermediates.size() || prevDistance > distanceThreshold)
&& currentLocation < this.locations.size()){ && currentLocation < locations.size()){
if(currentIntermediate < intermediates.size() && if(currentIntermediate < intermediates.size() &&
getDistanceToLocation(intermediates.get(currentIntermediate), currentLocation) < 50) { getDistanceToLocation(locations, intermediates.get(currentIntermediate), currentLocation) < 50) {
prevDistance = getDistanceToLocation(intermediates.get(currentIntermediate), currentLocation); prevDistance = getDistanceToLocation(locations, intermediates.get(currentIntermediate), currentLocation);
interLocations[currentIntermediate] = currentLocation; interLocations[currentIntermediate] = currentLocation;
currentIntermediate++; currentIntermediate++;
} else if(currentIntermediate > 0 && prevDistance > distanceThreshold && } else if(currentIntermediate > 0 && prevDistance > distanceThreshold &&
getDistanceToLocation(intermediates.get(currentIntermediate - 1), getDistanceToLocation(locations, intermediates.get(currentIntermediate - 1),
currentLocation) < prevDistance) { currentLocation) < prevDistance) {
prevDistance = getDistanceToLocation(intermediates.get(currentIntermediate - 1), currentLocation); prevDistance = getDistanceToLocation(locations, intermediates.get(currentIntermediate - 1), currentLocation);
interLocations[currentIntermediate - 1] = currentLocation; interLocations[currentIntermediate - 1] = currentLocation;
} }
currentLocation ++; currentLocation ++;
@ -158,7 +168,7 @@ public class RouteCalculationResult {
if (locationIndex >= interLocations[currentIntermediate]) { if (locationIndex >= interLocations[currentIntermediate]) {
// split directions // split directions
if (locationIndex > interLocations[currentIntermediate] if (locationIndex > interLocations[currentIntermediate]
&& getDistanceToLocation(intermediates.get(currentIntermediate), locationIndex) > 50) { && getDistanceToLocation(locations, intermediates.get(currentIntermediate), locationIndex) > 50) {
RouteDirectionInfo toSplit = localDirections.get(currentDirection); RouteDirectionInfo toSplit = localDirections.get(currentDirection);
RouteDirectionInfo info = new RouteDirectionInfo(localDirections.get(currentDirection).getAverageSpeed(), TurnType.sraight()); RouteDirectionInfo info = new RouteDirectionInfo(localDirections.get(currentDirection).getAverageSpeed(), TurnType.sraight());
info.setRef(toSplit.getRef()); info.setRef(toSplit.getRef());
@ -176,12 +186,12 @@ public class RouteCalculationResult {
} }
} }
private double getDistanceToLocation(LatLon p, int currentLocation) { private static double getDistanceToLocation(List<Location> locations, LatLon p, int currentLocation) {
return MapUtils.getDistance(p, return MapUtils.getDistance(p,
this.locations.get(currentLocation).getLatitude(), this.locations.get(currentLocation).getLongitude()); locations.get(currentLocation).getLatitude(), locations.get(currentLocation).getLongitude());
} }
private void attachAlarmInfo(List<AlarmInfo> alarms, RouteSegmentResult res, int intId, int locInd) { private static void attachAlarmInfo(List<AlarmInfo> alarms, RouteSegmentResult res, int intId, int locInd) {
int[] pointTypes = res.getObject().getPointTypes(intId); int[] pointTypes = res.getObject().getPointTypes(intId);
RouteRegion reg = res.getObject().region; RouteRegion reg = res.getObject().region;
if (pointTypes != null) { if (pointTypes != null) {
@ -212,7 +222,7 @@ public class RouteCalculationResult {
/** /**
* PREPARATION * PREPARATION
*/ */
private List<RouteSegmentResult> convertVectorResult(List<RouteDirectionInfo> directions, List<Location> locations, List<RouteSegmentResult> list, private static List<RouteSegmentResult> convertVectorResult(List<RouteDirectionInfo> directions, List<Location> locations, List<RouteSegmentResult> list,
List<AlarmInfo> alarms, ClientContext ctx) { List<AlarmInfo> alarms, ClientContext ctx) {
float prevDirectionTime = 0; float prevDirectionTime = 0;
float prevDirectionDistance = 0; float prevDirectionDistance = 0;
@ -282,7 +292,7 @@ public class RouteCalculationResult {
return segmentsToPopulate; return segmentsToPopulate;
} }
protected void addMissingTurnsToRoute(List<Location> locations, protected static void addMissingTurnsToRoute(List<Location> locations,
List<RouteDirectionInfo> originalDirections, Location start, LatLon end, ApplicationMode mode, ClientContext ctx, List<RouteDirectionInfo> originalDirections, Location start, LatLon end, ApplicationMode mode, ClientContext ctx,
boolean leftSide){ boolean leftSide){
if(locations.isEmpty()){ if(locations.isEmpty()){
@ -459,7 +469,7 @@ public class RouteCalculationResult {
} }
public String toString(TurnType type, ClientContext ctx) { public static String toString(TurnType type, ClientContext ctx) {
if(type.isRoundAbout()){ if(type.isRoundAbout()){
return ctx.getString(R.string.route_roundabout, type.getExitOut()); return ctx.getString(R.string.route_roundabout, type.getExitOut());
} else if(type.getValue().equals(TurnType.C)) { } else if(type.getValue().equals(TurnType.C)) {
@ -582,7 +592,7 @@ public class RouteCalculationResult {
* If beginning is too far from start point, then introduce GO Ahead * If beginning is too far from start point, then introduce GO Ahead
* @param end * @param end
*/ */
private void introduceFirstPointAndLastPoint(List<Location> locations, List<RouteDirectionInfo> directions, List<RouteSegmentResult> segs, Location start, private static void introduceFirstPointAndLastPoint(List<Location> locations, List<RouteDirectionInfo> directions, List<RouteSegmentResult> segs, Location start,
LatLon end) { LatLon end) {
if (!locations.isEmpty() && locations.get(0).distanceTo(start) > 50) { if (!locations.isEmpty() && locations.get(0).distanceTo(start) > 50) {
// add start point // add start point
@ -626,7 +636,7 @@ public class RouteCalculationResult {
* PREPARATION * PREPARATION
* At the end always update listDistance local vars and time * At the end always update listDistance local vars and time
*/ */
private void updateListDistanceTime() { private static void updateListDistanceTime(int[] listDistance, List<Location> locations) {
if (listDistance.length > 0) { if (listDistance.length > 0) {
listDistance[locations.size() - 1] = 0; listDistance[locations.size() - 1] = 0;
for (int i = locations.size() - 1; i > 0; i--) { for (int i = locations.size() - 1; i > 0; i--) {
@ -640,7 +650,7 @@ public class RouteCalculationResult {
* PREPARATION * PREPARATION
* At the end always update listDistance local vars and time * At the end always update listDistance local vars and time
*/ */
private void updateDirectionsTime() { private static void updateDirectionsTime(List<RouteDirectionInfo> directions, int[] listDistance) {
int sum = 0; int sum = 0;
for (int i = directions.size() - 1; i >= 0; i--) { for (int i = directions.size() - 1; i >= 0; i--) {
directions.get(i).afterLeftTime = sum; directions.get(i).afterLeftTime = sum;

View file

@ -241,9 +241,9 @@ public class RouteProvider {
} }
} }
ArrayList<Location> sublist = new ArrayList<Location>(gpxRoute.subList(startI, endI)); ArrayList<Location> sublist = new ArrayList<Location>(gpxRoute.subList(startI, endI));
pars.intermediates = null;
if(params.directions == null){ if(params.directions == null){
res = new RouteCalculationResult(sublist, params.directions, pars.start, pars.end, null, params.wpt, null, res = new RouteCalculationResult(sublist, null, pars, params.wpt);
pars.ctx, pars.leftSide, true);
} else { } else {
List<RouteDirectionInfo> subdirections = new ArrayList<RouteDirectionInfo>(); List<RouteDirectionInfo> subdirections = new ArrayList<RouteDirectionInfo>();
for (RouteDirectionInfo info : params.directions) { for (RouteDirectionInfo info : params.directions) {
@ -258,8 +258,7 @@ public class RouteProvider {
subdirections.add(ch); subdirections.add(ch);
} }
} }
res = new RouteCalculationResult(sublist, subdirections, pars.start, pars.end, null, null, null, res = new RouteCalculationResult(sublist, subdirections, pars, params.wpt);
pars.ctx, pars.leftSide, true);
} }
return res; return res;
} }
@ -330,8 +329,8 @@ public class RouteProvider {
} }
} }
return new RouteCalculationResult(res, null, params.start, params.end, null, null, null, params.intermediates = null;
params.ctx, params.leftSide, true); return new RouteCalculationResult(res, null, params, null);
} }
protected RouteCalculationResult findVectorMapsRoute(RouteCalculationParams params) throws IOException { protected RouteCalculationResult findVectorMapsRoute(RouteCalculationParams params) throws IOException {
@ -493,8 +492,7 @@ public class RouteProvider {
GPXFile gpxFile = GPXUtilities.loadGPXFile(params.ctx, connection.getInputStream(), false); GPXFile gpxFile = GPXUtilities.loadGPXFile(params.ctx, connection.getInputStream(), false);
directions = parseCloudmadeRoute(res, gpxFile, false, params.leftSide, speed); directions = parseCloudmadeRoute(res, gpxFile, false, params.leftSide, speed);
return new RouteCalculationResult(res, directions, params.start, params.end, params.intermediates, null, return new RouteCalculationResult(res, directions, params, null);
null, params.ctx, params.leftSide, true);
} }
private static List<RouteDirectionInfo> parseCloudmadeRoute(List<Location> res, GPXFile gpxFile, boolean osmandRouter, private static List<RouteDirectionInfo> parseCloudmadeRoute(List<Location> res, GPXFile gpxFile, boolean osmandRouter,
@ -673,7 +671,8 @@ public class RouteProvider {
} }
} }
return new RouteCalculationResult(res, null, params.start, params.end, null, null, null, params.ctx, params.leftSide, true); params.intermediates = null;
return new RouteCalculationResult(res, null, params, null);
} }
public GPXFile createOsmandRouterGPX(RouteCalculationResult srcRoute, OsmandApplication ctx){ public GPXFile createOsmandRouterGPX(RouteCalculationResult srcRoute, OsmandApplication ctx){
@ -789,7 +788,7 @@ public class RouteProvider {
URL url = new URL(uri.toString()); URL url = new URL(uri.toString());
URLConnection connection = url.openConnection(); URLConnection connection = url.openConnection();
connection.setRequestProperty("User-Agent", Version.getFullVersion(params.ctx)); connection.setRequestProperty("User-Agent", Version.getFullVersion(params.ctx));
StringBuilder content = new StringBuilder(); // StringBuilder content = new StringBuilder();
// BufferedReader rs = new BufferedReader(new InputStreamReader(connection.getInputStream())); // BufferedReader rs = new BufferedReader(new InputStreamReader(connection.getInputStream()));
// String s; // String s;
// while((s = rs.readLine()) != null) { // while((s = rs.readLine()) != null) {
@ -803,8 +802,8 @@ public class RouteProvider {
for (WptPt pt : gpxFile.routes.get(0).points) { for (WptPt pt : gpxFile.routes.get(0).points) {
res.add(createLocation(pt)); res.add(createLocation(pt));
} }
return new RouteCalculationResult(res, null, params.start, params.end, null, null, null, params.intermediates = null;
params.ctx, params.leftSide, true); return new RouteCalculationResult(res, null, params, null);
} }