consider restrictions

git-svn-id: https://osmand.googlecode.com/svn/trunk@852 e29c36b1-1cfa-d876-8d93-3434fc2bb7b8
This commit is contained in:
vics001 2010-12-24 20:55:53 +00:00
parent c0508cb526
commit aa6ddff8f0
2 changed files with 85 additions and 38 deletions

View file

@ -260,6 +260,8 @@ public class BinaryRouteDataReader {
List<RouteSegmentResult> result = new ArrayList<RouteSegmentResult>();
long now = System.currentTimeMillis();
ArrayList<RouteSegment> addedRoutesWORestrictions = new ArrayList<RouteSegment>(5);
ArrayList<RouteSegment> addedRoutesOthers = new ArrayList<RouteSegment>(5);
PriorityQueue<RouteSegment> graphSegments = new PriorityQueue<RouteSegment>(50, new Comparator<RouteSegment>(){
@Override
public int compare(RouteSegment o1, RouteSegment o2) {
@ -276,8 +278,21 @@ public class BinaryRouteDataReader {
int startY = start.road.getPoint31YTile(start.segmentStart);
start.distanceToEnd = squareRootDist(startX, startY, endX, endY) / 10;
// double maxAreaDist = 100 * squareRootDist(startX, startY, endX, endY);
// add possible first junctions
RouteSegment gotoStart = ctx.routes.get((startX << 31l) + (long)startY);
while(gotoStart != null){
if(gotoStart.road.id != start.road.id){
gotoStart.distanceToEnd = start.distanceToEnd;
long nt = (gotoStart.road.id << 8l) + gotoStart.segmentStart;
visitedPoints.add(nt);
graphSegments.add(gotoStart);
}
gotoStart = gotoStart.next;
}
// TODO think about u-turn
while(!graphSegments.isEmpty() && endRoute == null){
RouteSegment segment = graphSegments.poll();
BinaryMapDataObject road = segment.road;
@ -285,10 +300,10 @@ public class BinaryRouteDataReader {
// try to find all ways
boolean oneway = ctx.router.isOneWay(road.getHighwayAttributes());
int middle = segment.segmentEnd;
int middle = segment.segmentStart;
boolean minus = true;
boolean plus = true;
int d = 0;
int d = 1;
int middlex = road.getPoint31XTile(middle);
int middley = road.getPoint31YTile(middle);
double trafficSignalsTime = 0;
@ -312,21 +327,18 @@ public class BinaryRouteDataReader {
plus = false;
continue;
}
if(end.road.id == road.id && end.segmentStart == j){
if(end.road.id == road.id && Math.abs(end.segmentStart - j) <= 1){
endRoute = segment;
break;
}
long l = (((long) road.getPoint31XTile(j)) << 31) + (long) road.getPoint31YTile(j);
if(visitedPoints.contains(l)){
continue;
}
loadRoutes(ctx, (road.getPoint31XTile(j) >> (31 - ZOOM_LOAD_TILES)), (road.getPoint31YTile(j) >> (31 - ZOOM_LOAD_TILES)));
RouteSegment next = ctx.routes.get(l);
if (next != null) {
visitedPoints.add(l);
//visitedPoints.add(t);
if (d != 0) {
RouteSegment trafficSignalsTest = next;
while (trafficSignalsTest != null) {
@ -340,39 +352,74 @@ public class BinaryRouteDataReader {
}
}
}
addedRoutesWORestrictions.clear();
addedRoutesOthers.clear();
boolean exclusiveRestriction = false;
while(next != null){
// TODO consider restrictions !
if(next.road.id != road.id){
next.parentRoute = segment;
next.parentSegmentEnd = j;
int x = road.getPoint31XTile(j);
int y = road.getPoint31YTile(j);
// Using A* routing algorithm
// g(x) - calculate distance to that point and calculate time
double speed = ctx.router.defineSpeed(road);
if(speed == 0){
speed = ctx.router.getMinDefaultSpeed();
long nt = (next.road.id << 8l) + next.segmentStart;
if(!visitedPoints.contains(nt) && next.road.id>>3 != road.id>>3){
int type = -1;
for(int i = 0; i< road.getRestrictionCount(); i++){
if(road.getRestriction(i) == next.road.id){
type = road.getRestrictionType(i);
break;
}
}
next.distanceFromStart = segment.distanceFromStart + squareRootDist(x, y, middlex, middley) / speed;
// for each turn add 45 seconds
// TODO consider right turn 20 seconds and left turn 45 seconds
if (j < road.getPointsLength() - 1) {
next.distanceFromStart += 30;
if(type == -1 && exclusiveRestriction){
// continue;
} else if(type == MapRenderingTypes.RESTRICTION_NO_LEFT_TURN ||
type == MapRenderingTypes.RESTRICTION_NO_RIGHT_TURN ||
type == MapRenderingTypes.RESTRICTION_NO_STRAIGHT_ON ||
type == MapRenderingTypes.RESTRICTION_NO_U_TURN){
// continue;
} else {
next.parentRoute = segment;
next.parentSegmentEnd = j;
int x = road.getPoint31XTile(j);
int y = road.getPoint31YTile(j);
// Using A* routing algorithm
// g(x) - calculate distance to that point and calculate time
double speed = ctx.router.defineSpeed(road);
if(speed == 0){
speed = ctx.router.getMinDefaultSpeed();
}
next.distanceFromStart = segment.distanceFromStart + squareRootDist(x, y, middlex, middley) / speed;
// for each turn add 45 seconds
// TODO consider right turn 20 seconds and left turn 45 seconds
if (j < road.getPointsLength() - 1 || next.segmentStart != 0) {
next.distanceFromStart += 30;
}
// traffic signals time
next.distanceFromStart += trafficSignalsTime;
// h(x) - calculate approximate distance to the end point and divide to 37 km/h = 10 m/s
// max speed
next.distanceToEnd = squareRootDist(x, y, endX, endY) / 30;
if(type == -1){
addedRoutesOthers.add(next);
} else {
exclusiveRestriction = true;
addedRoutesOthers.clear();
addedRoutesWORestrictions.add(next);
}
}
// traffic signals time
next.distanceFromStart += trafficSignalsTime;
// h(x) - calculate approximate distance to the end point and divide to 37 km/h = 10 m/s
// max speed
next.distanceToEnd = squareRootDist(x, y, endX, endY) / 30;
graphSegments.add(next);
}
next = next.next;
}
for(RouteSegment s : addedRoutesOthers){
long nt = (s.road.id << 8l) + s.segmentStart;
visitedPoints.add(nt);
graphSegments.add(s);
}
for(RouteSegment s : addedRoutesWORestrictions){
long nt = (s.road.id << 8l) + s.segmentStart;
visitedPoints.add(nt);
graphSegments.add(s);
}
}
}

View file

@ -146,11 +146,11 @@ public class DownloadIndexActivity extends ListActivity {
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
MenuItem item = menu.add(0, RELOAD_ID, 0, R.string.reload);
/*MenuItem item = */menu.add(0, RELOAD_ID, 0, R.string.reload);
// item.setIcon(R.drawable.ic_menu_refresh);
item = menu.add(0, SELECT_ALL_ID, 0, R.string.select_all);
item = menu.add(0, DESELECT_ALL_ID, 0, R.string.deselect_all);
item = menu.add(0, FILTER_EXISTING_REGIONS, 0, R.string.filter_existing_indexes);
/*item = */menu.add(0, SELECT_ALL_ID, 0, R.string.select_all);
/*item = */menu.add(0, DESELECT_ALL_ID, 0, R.string.deselect_all);
/*item = */menu.add(0, FILTER_EXISTING_REGIONS, 0, R.string.filter_existing_indexes);
return true;
}