draft version searching closest way
git-svn-id: https://osmand.googlecode.com/svn/trunk@848 e29c36b1-1cfa-d876-8d93-3434fc2bb7b8
This commit is contained in:
parent
aed5ca28aa
commit
fe02e64d45
1 changed files with 67 additions and 10 deletions
|
@ -49,6 +49,8 @@ public class BinaryRouteDataReader {
|
||||||
autoValues.put("primary_link", 70d);
|
autoValues.put("primary_link", 70d);
|
||||||
autoValues.put("secondary", 50d);
|
autoValues.put("secondary", 50d);
|
||||||
autoValues.put("secondary_link", 50d);
|
autoValues.put("secondary_link", 50d);
|
||||||
|
autoValues.put("tertiary", 50d);
|
||||||
|
autoValues.put("tertiary_link", 50d);
|
||||||
autoValues.put("residential", 50d);
|
autoValues.put("residential", 50d);
|
||||||
autoValues.put("service", 40d);
|
autoValues.put("service", 40d);
|
||||||
autoValues.put("unclassified", 40d);
|
autoValues.put("unclassified", 40d);
|
||||||
|
@ -135,31 +137,86 @@ public class BinaryRouteDataReader {
|
||||||
ctx.loadedTiles.add(tileC);
|
ctx.loadedTiles.add(tileC);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static class RouteSegment {
|
||||||
|
int segment = 0;
|
||||||
|
BinaryMapDataObject road;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static double dist(int x1, int y1, int x2, int y2) {
|
||||||
|
return Math.sqrt(((double)x1 - x2) * ((double)x1 - x2) + ((double)y1 - y2) * ((double)y1 - y2));
|
||||||
|
}
|
||||||
|
|
||||||
|
public RouteSegment findRouteSegment(double lat, double lon, RoutingContext ctx) throws IOException {
|
||||||
|
double tileX = MapUtils.getTileNumberX(ZOOM_LOAD_TILES, lon);
|
||||||
|
double tileY = MapUtils.getTileNumberY(ZOOM_LOAD_TILES, lat);
|
||||||
|
searchRoutes(ctx, (int) tileX , (int) tileY);
|
||||||
|
|
||||||
|
RouteSegment road = null;
|
||||||
|
double dist = 0;
|
||||||
|
int px = MapUtils.get31TileNumberX(lon);
|
||||||
|
int py = MapUtils.get31TileNumberY(lat);
|
||||||
|
for(BinaryMapDataObject r : ctx.values()){
|
||||||
|
if(r.getPointsLength() > 1){
|
||||||
|
double prevDist = dist(r.getPoint31XTile(0), r.getPoint31YTile(0), px, py);
|
||||||
|
for (int j = 1; j < r.getPointsLength(); j++) {
|
||||||
|
double cDist = dist(r.getPoint31XTile(j), r.getPoint31YTile(j), px, py);
|
||||||
|
double mDist = dist(r.getPoint31XTile(j), r.getPoint31YTile(j), r.getPoint31XTile(j - 1), r.getPoint31YTile(j - 1));
|
||||||
|
if (road == null || prevDist + cDist - mDist < dist) {
|
||||||
|
road = new RouteSegment();
|
||||||
|
road.road = r;
|
||||||
|
road.segment = j;
|
||||||
|
dist = prevDist + cDist - mDist;
|
||||||
|
}
|
||||||
|
prevDist = cDist;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return road;
|
||||||
|
}
|
||||||
|
|
||||||
public static void main(String[] args) throws IOException {
|
public static void main(String[] args) throws IOException {
|
||||||
RandomAccessFile raf = new RandomAccessFile(new File("d:\\android\\data\\Minsk.obf"), "r"); //$NON-NLS-1$ //$NON-NLS-2$
|
RandomAccessFile raf = new RandomAccessFile(new File("d:\\android\\data\\Belarus.obf"), "r"); //$NON-NLS-1$ //$NON-NLS-2$
|
||||||
BinaryMapIndexReader reader = new BinaryMapIndexReader(raf);
|
BinaryMapIndexReader reader = new BinaryMapIndexReader(raf);
|
||||||
BinaryRouteDataReader route = new BinaryRouteDataReader(reader);
|
BinaryRouteDataReader router = new BinaryRouteDataReader(reader);
|
||||||
|
|
||||||
// int sleft = MapUtils.get31TileNumberX(27.596);
|
// int sleft = MapUtils.get31TileNumberX(27.596);
|
||||||
// int sright = MapUtils.get31TileNumberX(27.599);
|
// int sright = MapUtils.get31TileNumberX(27.599);
|
||||||
// int stop = MapUtils.get31TileNumberY(53.921);
|
// int stop = MapUtils.get31TileNumberY(53.921);
|
||||||
// int sbottom = MapUtils.get31TileNumberY(53.919);
|
// int sbottom = MapUtils.get31TileNumberY(53.919);
|
||||||
|
|
||||||
double tileX = MapUtils.getTileNumberX(15, 27.596);
|
double lon = 27.5976;
|
||||||
double tileY = MapUtils.getTileNumberY(15, 53.919);
|
double lat = 53.9199;
|
||||||
|
|
||||||
RoutingContext ctx = new RoutingContext();
|
RoutingContext ctx = new RoutingContext();
|
||||||
|
|
||||||
long ms = System.currentTimeMillis();
|
long ms = System.currentTimeMillis();
|
||||||
route.searchRoutes(ctx, (int) tileX, (int) tileY);
|
// find closest way
|
||||||
|
RouteSegment routeSegment = router.findRouteSegment(lat, lon, ctx);
|
||||||
|
if (routeSegment != null) {
|
||||||
|
BinaryMapDataObject road = routeSegment.road;
|
||||||
|
TagValuePair pair = road.mapIndex.decodeType(road.getTypes()[0]);
|
||||||
|
System.out.println("ROAD TO START " + pair.tag + " " + pair.value + " " + road.name + " " + routeSegment.segment + " "
|
||||||
|
+ (road.id >> 3));
|
||||||
|
}
|
||||||
|
|
||||||
|
double tileX = Math.round(MapUtils.getTileNumberX(ZOOM_LOAD_TILES, lon));
|
||||||
|
double tileY = Math.round(MapUtils.getTileNumberY(ZOOM_LOAD_TILES, lat));
|
||||||
|
// preload neighboors
|
||||||
|
router.searchRoutes(ctx, (int) tileX, (int) tileY);
|
||||||
|
router.searchRoutes(ctx, (int) tileX - 1, (int) tileY);
|
||||||
|
router.searchRoutes(ctx, (int) tileX, (int) tileY - 1);
|
||||||
|
router.searchRoutes(ctx, (int) tileX - 1, (int) tileY - 1);
|
||||||
Collection<BinaryMapDataObject> res = ctx.values();
|
Collection<BinaryMapDataObject> res = ctx.values();
|
||||||
System.out.println(res.size() + " objects for " + (System.currentTimeMillis() - ms) + " ms");
|
System.out.println(res.size() + " objects for " + (System.currentTimeMillis() - ms) + " ms");
|
||||||
for(BinaryMapDataObject r : res){
|
for(BinaryMapDataObject r : res){
|
||||||
TagValuePair pair = r.mapIndex.decodeType(r.getTypes()[0]);
|
TagValuePair pair = r.mapIndex.decodeType(r.getTypes()[0]);
|
||||||
if(r.name != null){
|
// if(r.name != null){
|
||||||
System.out.println(pair.tag + " " + pair.value + " " + r.name);
|
// System.out.println(pair.tag + " " + pair.value + " " + r.name );
|
||||||
} else {
|
// } else {
|
||||||
System.out.println(pair.tag + " " + pair.value);
|
// System.out.println(pair.tag + " " + pair.value + " " + (r.id >> 3));
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue