Fix public transport routing (walking part)
This commit is contained in:
parent
6853d7ca76
commit
e35c72067c
3 changed files with 59 additions and 34 deletions
|
@ -162,7 +162,6 @@ public class TransportRoutePlanner {
|
||||||
}
|
}
|
||||||
p = p.parentRoute;
|
p = p.parentRoute;
|
||||||
}
|
}
|
||||||
route.finishWalkSegment = new TransportRouteResultSegment(null, 0, 0, route.finishWalkDist, -1);
|
|
||||||
// test if faster routes fully included
|
// test if faster routes fully included
|
||||||
boolean include = false;
|
boolean include = false;
|
||||||
for(TransportRouteResult s : lst) {
|
for(TransportRouteResult s : lst) {
|
||||||
|
@ -317,7 +316,6 @@ public class TransportRoutePlanner {
|
||||||
public static class TransportRouteResult {
|
public static class TransportRouteResult {
|
||||||
|
|
||||||
List<TransportRouteResultSegment> segments = new ArrayList<TransportRouteResultSegment>(4);
|
List<TransportRouteResultSegment> segments = new ArrayList<TransportRouteResultSegment>(4);
|
||||||
TransportRouteResultSegment finishWalkSegment;
|
|
||||||
double finishWalkDist;
|
double finishWalkDist;
|
||||||
double routeTime;
|
double routeTime;
|
||||||
private final TransportRoutingConfiguration cfg;
|
private final TransportRoutingConfiguration cfg;
|
||||||
|
@ -330,10 +328,6 @@ public class TransportRoutePlanner {
|
||||||
return segments;
|
return segments;
|
||||||
}
|
}
|
||||||
|
|
||||||
public TransportRouteResultSegment getFinishWalkSegment() {
|
|
||||||
return finishWalkSegment;
|
|
||||||
}
|
|
||||||
|
|
||||||
public double getWalkDist() {
|
public double getWalkDist() {
|
||||||
double d = finishWalkDist;
|
double d = finishWalkDist;
|
||||||
for (TransportRouteResultSegment s : segments) {
|
for (TransportRouteResultSegment s : segments) {
|
||||||
|
|
|
@ -2,6 +2,7 @@ package net.osmand.plus.routing;
|
||||||
|
|
||||||
import android.support.annotation.NonNull;
|
import android.support.annotation.NonNull;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
|
import android.util.Pair;
|
||||||
|
|
||||||
import net.osmand.Location;
|
import net.osmand.Location;
|
||||||
import net.osmand.PlatformUtil;
|
import net.osmand.PlatformUtil;
|
||||||
|
@ -46,7 +47,7 @@ public class TransportRoutingHelper {
|
||||||
private RoutingHelper routingHelper;
|
private RoutingHelper routingHelper;
|
||||||
|
|
||||||
private List<TransportRouteResult> routes;
|
private List<TransportRouteResult> routes;
|
||||||
private Map<TransportRouteResultSegment, RouteCalculationResult> walkingRouteSegments;
|
private Map<Pair<TransportRouteResultSegment, TransportRouteResultSegment>, RouteCalculationResult> walkingRouteSegments;
|
||||||
private int currentRoute;
|
private int currentRoute;
|
||||||
|
|
||||||
private LatLon startLocation;
|
private LatLon startLocation;
|
||||||
|
@ -93,8 +94,8 @@ public class TransportRoutingHelper {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
public RouteCalculationResult getWalkingRouteSegment(TransportRouteResultSegment s) {
|
public RouteCalculationResult getWalkingRouteSegment(TransportRouteResultSegment s1, TransportRouteResultSegment s2) {
|
||||||
return walkingRouteSegments.get(s);
|
return walkingRouteSegments.get(new Pair<>(s1, s2));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setCurrentRoute(int currentRoute) {
|
public void setCurrentRoute(int currentRoute) {
|
||||||
|
@ -294,14 +295,35 @@ public class TransportRoutingHelper {
|
||||||
}
|
}
|
||||||
|
|
||||||
private class WalkingRouteSegment {
|
private class WalkingRouteSegment {
|
||||||
TransportRouteResultSegment s;
|
TransportRouteResultSegment s1;
|
||||||
|
TransportRouteResultSegment s2;
|
||||||
LatLon start;
|
LatLon start;
|
||||||
|
boolean startTransportStop;
|
||||||
LatLon end;
|
LatLon end;
|
||||||
|
boolean endTransportStop;
|
||||||
|
|
||||||
WalkingRouteSegment(TransportRouteResultSegment s, LatLon start, LatLon end) {
|
WalkingRouteSegment(TransportRouteResultSegment s1, TransportRouteResultSegment s2) {
|
||||||
this.s = s;
|
this.s1 = s1;
|
||||||
|
this.s2 = s2;
|
||||||
|
|
||||||
|
start = s1.getEnd().getLocation();
|
||||||
|
end = s2.getStart().getLocation();
|
||||||
|
startTransportStop = true;
|
||||||
|
endTransportStop = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
WalkingRouteSegment(LatLon start, TransportRouteResultSegment s) {
|
||||||
this.start = start;
|
this.start = start;
|
||||||
|
this.s2 = s;
|
||||||
|
end = s2.getStart().getLocation();
|
||||||
|
endTransportStop = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
WalkingRouteSegment(TransportRouteResultSegment s, LatLon end) {
|
||||||
|
this.s1 = s;
|
||||||
this.end = end;
|
this.end = end;
|
||||||
|
start = s1.getEnd().getLocation();
|
||||||
|
startTransportStop = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -311,7 +333,7 @@ public class TransportRoutingHelper {
|
||||||
private Thread prevRunningJob;
|
private Thread prevRunningJob;
|
||||||
|
|
||||||
private final Queue<WalkingRouteSegment> walkingSegmentsToCalculate = new ConcurrentLinkedQueue<>();
|
private final Queue<WalkingRouteSegment> walkingSegmentsToCalculate = new ConcurrentLinkedQueue<>();
|
||||||
private Map<TransportRouteResultSegment, RouteCalculationResult> walkingRouteSegments = new HashMap<>();
|
private Map<Pair<TransportRouteResultSegment, TransportRouteResultSegment>, RouteCalculationResult> walkingRouteSegments = new HashMap<>();
|
||||||
private boolean walkingSegmentsCalculated;
|
private boolean walkingSegmentsCalculated;
|
||||||
|
|
||||||
public RouteRecalculationThread(String name, TransportRouteCalculationParams params) {
|
public RouteRecalculationThread(String name, TransportRouteCalculationParams params) {
|
||||||
|
@ -353,12 +375,15 @@ public class TransportRoutingHelper {
|
||||||
LatLon end = new LatLon(walkingRouteSegment.end.getLatitude(), walkingRouteSegment.end.getLongitude());
|
LatLon end = new LatLon(walkingRouteSegment.end.getLatitude(), walkingRouteSegment.end.getLongitude());
|
||||||
|
|
||||||
final float currentDistanceFromBegin =
|
final float currentDistanceFromBegin =
|
||||||
RouteRecalculationThread.this.params.calculationProgress.distanceFromBegin + (float) walkingRouteSegment.s.getTravelDist();
|
RouteRecalculationThread.this.params.calculationProgress.distanceFromBegin +
|
||||||
|
(walkingRouteSegment.s1 != null ? (float) walkingRouteSegment.s1.getTravelDist() : 0);
|
||||||
|
|
||||||
final RouteCalculationParams params = new RouteCalculationParams();
|
final RouteCalculationParams params = new RouteCalculationParams();
|
||||||
params.inSnapToRoadMode = true;
|
params.inPublicTransportMode = true;
|
||||||
params.start = start;
|
params.start = start;
|
||||||
params.end = end;
|
params.end = end;
|
||||||
|
params.startTransportStop = walkingRouteSegment.startTransportStop;
|
||||||
|
params.targetTransportStop = walkingRouteSegment.endTransportStop;
|
||||||
RoutingHelper.applyApplicationSettings(params, app.getSettings(), walkingMode);
|
RoutingHelper.applyApplicationSettings(params, app.getSettings(), walkingMode);
|
||||||
params.mode = walkingMode;
|
params.mode = walkingMode;
|
||||||
params.ctx = app;
|
params.ctx = app;
|
||||||
|
@ -396,7 +421,7 @@ public class TransportRoutingHelper {
|
||||||
params.resultListener = new RouteCalculationResultListener() {
|
params.resultListener = new RouteCalculationResultListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onRouteCalculated(RouteCalculationResult route) {
|
public void onRouteCalculated(RouteCalculationResult route) {
|
||||||
RouteRecalculationThread.this.walkingRouteSegments.put(walkingRouteSegment.s, route);
|
RouteRecalculationThread.this.walkingRouteSegments.put(new Pair<>(walkingRouteSegment.s1, walkingRouteSegment.s2), route);
|
||||||
if (!walkingSegmentsToCalculate.isEmpty()) {
|
if (!walkingSegmentsToCalculate.isEmpty()) {
|
||||||
RouteCalculationParams walkingRouteParams = getWalkingRouteParams();
|
RouteCalculationParams walkingRouteParams = getWalkingRouteParams();
|
||||||
if (walkingRouteParams != null) {
|
if (walkingRouteParams != null) {
|
||||||
|
@ -415,16 +440,21 @@ public class TransportRoutingHelper {
|
||||||
walkingRouteSegments.clear();
|
walkingRouteSegments.clear();
|
||||||
if (routes != null && routes.size() > 0) {
|
if (routes != null && routes.size() > 0) {
|
||||||
for (TransportRouteResult r : routes) {
|
for (TransportRouteResult r : routes) {
|
||||||
LatLon start = params.start;
|
TransportRouteResultSegment prev = null;
|
||||||
for (TransportRouteResultSegment s : r.getSegments()) {
|
for (TransportRouteResultSegment s : r.getSegments()) {
|
||||||
|
LatLon start = prev != null ? prev.getEnd().getLocation() : params.start;
|
||||||
LatLon end = s.getStart().getLocation();
|
LatLon end = s.getStart().getLocation();
|
||||||
double dist = MapUtils.getDistance(start, end);
|
if (start != null && end != null) {
|
||||||
if (dist > 50) {
|
if (prev == null || MapUtils.getDistance(start, end) > 50) {
|
||||||
walkingSegmentsToCalculate.add(new WalkingRouteSegment(s, start, end));
|
walkingSegmentsToCalculate.add(prev == null ?
|
||||||
|
new WalkingRouteSegment(start, s) : new WalkingRouteSegment(prev, s));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
start = s.getEnd().getLocation();
|
prev = s;
|
||||||
|
}
|
||||||
|
if (prev != null) {
|
||||||
|
walkingSegmentsToCalculate.add(new WalkingRouteSegment(prev, params.end));
|
||||||
}
|
}
|
||||||
walkingSegmentsToCalculate.add(new WalkingRouteSegment(r.getFinishWalkSegment(), start, params.end));
|
|
||||||
}
|
}
|
||||||
RouteCalculationParams walkingRouteParams = getWalkingRouteParams();
|
RouteCalculationParams walkingRouteParams = getWalkingRouteParams();
|
||||||
if (walkingRouteParams != null) {
|
if (walkingRouteParams != null) {
|
||||||
|
|
|
@ -805,20 +805,23 @@ public class RouteLayer extends OsmandMapLayer {
|
||||||
private void calculateTransportResult(LatLon start, LatLon end, TransportRouteResult r, List<Way> res, List<Integer> colors) {
|
private void calculateTransportResult(LatLon start, LatLon end, TransportRouteResult r, List<Way> res, List<Integer> colors) {
|
||||||
if (r != null) {
|
if (r != null) {
|
||||||
LatLon p = start;
|
LatLon p = start;
|
||||||
|
TransportRouteResultSegment prev = null;
|
||||||
for (TransportRouteResultSegment s : r.getSegments()) {
|
for (TransportRouteResultSegment s : r.getSegments()) {
|
||||||
LatLon floc = s.getStart().getLocation();
|
LatLon floc = s.getStart().getLocation();
|
||||||
addRouteWalk(s, p, floc, res, colors);
|
addRouteWalk(prev, s, p, floc, res, colors);
|
||||||
List<Way> geometry = s.getGeometry();
|
List<Way> geometry = s.getGeometry();
|
||||||
res.addAll(geometry);
|
res.addAll(geometry);
|
||||||
addColors(s.route, geometry.size(), colors);
|
addColors(s.route, geometry.size(), colors);
|
||||||
p = s.getEnd().getLocation();
|
p = s.getEnd().getLocation();
|
||||||
|
prev = s;
|
||||||
}
|
}
|
||||||
addRouteWalk(r.getFinishWalkSegment(), p, end, res, colors);
|
addRouteWalk(prev, null, p, end, res, colors);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addRouteWalk(TransportRouteResultSegment s, LatLon start, LatLon end, List<Way> res, List<Integer> colors) {
|
private void addRouteWalk(TransportRouteResultSegment s1, TransportRouteResultSegment s2,
|
||||||
final RouteCalculationResult walkingRouteSegment = transportHelper.getWalkingRouteSegment(s);
|
LatLon start, LatLon end, List<Way> res, List<Integer> colors) {
|
||||||
|
final RouteCalculationResult walkingRouteSegment = transportHelper.getWalkingRouteSegment(s1, s2);
|
||||||
if (walkingRouteSegment != null && walkingRouteSegment.getRouteLocations().size() > 0) {
|
if (walkingRouteSegment != null && walkingRouteSegment.getRouteLocations().size() > 0) {
|
||||||
final List<Location> routeLocations = walkingRouteSegment.getRouteLocations();
|
final List<Location> routeLocations = walkingRouteSegment.getRouteLocations();
|
||||||
Way way = new Way(-1);
|
Way way = new Way(-1);
|
||||||
|
@ -830,14 +833,12 @@ public class RouteLayer extends OsmandMapLayer {
|
||||||
addColors(null, 1, colors);
|
addColors(null, 1, colors);
|
||||||
} else {
|
} else {
|
||||||
double dist = MapUtils.getDistance(start, end);
|
double dist = MapUtils.getDistance(start, end);
|
||||||
if (dist > 50) {
|
Way way = new Way(-1);
|
||||||
Way way = new Way(-1);
|
way.putTag(OSMSettings.OSMTagKey.NAME.getValue(), String.format(Locale.US, "Walk %.1f m", dist));
|
||||||
way.putTag(OSMSettings.OSMTagKey.NAME.getValue(), String.format(Locale.US, "Walk %.1f m", dist));
|
way.addNode(new Node(start.getLatitude(), start.getLongitude(), -1));
|
||||||
way.addNode(new Node(start.getLatitude(), start.getLongitude(), -1));
|
way.addNode(new Node(end.getLatitude(), end.getLongitude(), -1));
|
||||||
way.addNode(new Node(end.getLatitude(), end.getLongitude(), -1));
|
res.add(way);
|
||||||
res.add(way);
|
addColors(null, 1, colors);
|
||||||
addColors(null, 1, colors);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue