diff --git a/OsmAnd-java/src/main/java/net/osmand/IndexConstants.java b/OsmAnd-java/src/main/java/net/osmand/IndexConstants.java index 14401c4a04..0dea2d42fb 100644 --- a/OsmAnd-java/src/main/java/net/osmand/IndexConstants.java +++ b/OsmAnd-java/src/main/java/net/osmand/IndexConstants.java @@ -28,9 +28,6 @@ public class IndexConstants { public static final String EXTRA_EXT = ".extra"; public static final String EXTRA_ZIP_EXT = ".extra.zip"; - public static final String TOUR_INDEX_EXT = ".tour"; //$NON-NLS-1$ - public static final String TOUR_INDEX_EXT_ZIP = ".tour.zip"; //$NON-NLS-1$ - public static final String GEN_LOG_EXT = ".gen.log"; //$NON-NLS-1$ public static final String VOICE_INDEX_EXT_ZIP = ".voice.zip"; //$NON-NLS-1$ diff --git a/OsmAnd-java/src/main/java/net/osmand/router/BinaryRoutePlanner.java b/OsmAnd-java/src/main/java/net/osmand/router/BinaryRoutePlanner.java index 1b6077cbb1..5c0f38f4a5 100644 --- a/OsmAnd-java/src/main/java/net/osmand/router/BinaryRoutePlanner.java +++ b/OsmAnd-java/src/main/java/net/osmand/router/BinaryRoutePlanner.java @@ -65,13 +65,11 @@ public class BinaryRoutePlanner { * Calculate route between start.segmentEnd and end.segmentStart (using A* algorithm) * return list of segments */ - @SuppressWarnings("unused") FinalRouteSegment searchRouteInternal(final RoutingContext ctx, RouteSegmentPoint start, RouteSegmentPoint end, RouteSegment recalculationEnd ) throws InterruptedException, IOException { // measure time ctx.timeToLoad = 0; ctx.memoryOverhead = 1000; - ctx.visitedSegments = 0; // Initializing priority queue to visit way segments Comparator nonHeuristicSegmentsComparator = new NonHeuristicSegmentsComparator(); @@ -166,8 +164,12 @@ public class BinaryRoutePlanner { throw new InterruptedException("Route calculation interrupted"); } } - ctx.visitedSegments = visitedDirectSegments.size() + visitedOppositeSegments.size(); - printDebugMemoryInformation(ctx, graphDirectSegments, graphReverseSegments, visitedDirectSegments, visitedOppositeSegments); + ctx.visitedSegments += visitedDirectSegments.size() + visitedOppositeSegments.size(); + ctx.visitedDirectSegments += visitedDirectSegments.size(); + ctx.visitedOppositeSegments += visitedOppositeSegments.size(); + ctx.directQueueSize = graphDirectSegments.size(); // Math.max(ctx.directQueueSize, graphDirectSegments.size()); + ctx.oppositeQueueSize = graphReverseSegments.size(); + ctx.visitedOppositeSegments += visitedOppositeSegments.size(); return finalSegment; } @@ -368,8 +370,7 @@ public class BinaryRoutePlanner { log.warn(logMsg); } - public void printDebugMemoryInformation(RoutingContext ctx, PriorityQueue graphDirectSegments, PriorityQueue graphReverseSegments, - TLongObjectHashMap visitedDirectSegments,TLongObjectHashMap visitedOppositeSegments) { + public static void printDebugMemoryInformation(RoutingContext ctx) { printInfo(String.format("Time. Total: %.2f, to load: %.2f, to load headers: %.2f, to calc dev: %.2f ", (System.nanoTime() - ctx.timeToCalculate) / 1e6, ctx.timeToLoad / 1e6, ctx.timeToLoadHeaders / 1e6, ctx.timeNanoToCalcDeviation / 1e6)); @@ -380,12 +381,8 @@ public class BinaryRoutePlanner { ", loaded more than once same tiles " + ctx.loadedPrevUnloadedTiles); printInfo("Visited segments " + ctx.visitedSegments + ", relaxed roads " + ctx.relaxedSegments); - if (graphDirectSegments != null && graphReverseSegments != null) { - printInfo("Priority queues sizes : " + graphDirectSegments.size() + "/" + graphReverseSegments.size()); - } - if (visitedDirectSegments != null && visitedOppositeSegments != null) { - printInfo("Visited interval sizes: " + visitedDirectSegments.size() + "/" + visitedOppositeSegments.size()); - } + printInfo("Priority queues sizes : " + ctx.directQueueSize + "/" + ctx.oppositeQueueSize); + printInfo("Visited interval sizes: " + ctx.visitedDirectSegments + "/" + ctx.visitedOppositeSegments); } diff --git a/OsmAnd-java/src/main/java/net/osmand/router/GeneralRouter.java b/OsmAnd-java/src/main/java/net/osmand/router/GeneralRouter.java index 3c6553f523..537e3a5f74 100644 --- a/OsmAnd-java/src/main/java/net/osmand/router/GeneralRouter.java +++ b/OsmAnd-java/src/main/java/net/osmand/router/GeneralRouter.java @@ -72,6 +72,8 @@ public class GeneralRouter implements VehicleRouter { private float defaultSpeed = 1f; // speed in m/s private float maxSpeed = 10f; + // speed in m/s (used for shortest route) + private float maxVehicleSpeed; private TLongHashSet impassableRoads; private GeneralRouterProfile profile; @@ -149,6 +151,7 @@ public class GeneralRouter implements VehicleRouter { if (params.containsKey(MAX_SPEED)) { maxSpeed = parseSilentFloat(params.get(MAX_SPEED), maxSpeed); } + maxVehicleSpeed = maxSpeed; if (shortestRoute) { maxSpeed = Math.min(CAR_SHORTEST_DEFAULT_SPEED, maxSpeed); } @@ -489,10 +492,15 @@ public class GeneralRouter implements VehicleRouter { @Override public float defineVehicleSpeed(RouteDataObject road) { + // don't use cache cause max/min is different for routing speed + if (maxVehicleSpeed != maxSpeed) { + float spd = getObjContext(RouteDataObjectAttribute.ROAD_SPEED).evaluateFloat(road, defaultSpeed); + return Math.max(Math.min(spd, maxVehicleSpeed), minSpeed); + } Float sp = getCache(RouteDataObjectAttribute.ROAD_SPEED, road); if (sp == null) { float spd = getObjContext(RouteDataObjectAttribute.ROAD_SPEED).evaluateFloat(road, defaultSpeed); - sp = Math.max(Math.min(spd, maxSpeed), minSpeed); + sp = Math.max(Math.min(spd, maxVehicleSpeed), minSpeed); putCache(RouteDataObjectAttribute.ROAD_SPEED, road, sp); } return sp; diff --git a/OsmAnd-java/src/main/java/net/osmand/router/RoutePlannerFrontEnd.java b/OsmAnd-java/src/main/java/net/osmand/router/RoutePlannerFrontEnd.java index acf76552a4..60dc5add01 100644 --- a/OsmAnd-java/src/main/java/net/osmand/router/RoutePlannerFrontEnd.java +++ b/OsmAnd-java/src/main/java/net/osmand/router/RoutePlannerFrontEnd.java @@ -31,7 +31,7 @@ public class RoutePlannerFrontEnd { // Check issue #8649 protected static final double GPS_POSSIBLE_ERROR = 7; public boolean useSmartRouteRecalculation = true; - + public RoutePlannerFrontEnd() { } @@ -50,7 +50,7 @@ public class RoutePlannerFrontEnd { // don't search subsegments shorter than specified distance (also used to step back for car turns) public double MINIMUM_STEP_APPROXIMATION = 100; // Parameter to smoother the track itself (could be 0 if it's not recorded track) - public double SMOOTHEN_POINTS_NO_ROUTE = 2; + public double SMOOTHEN_POINTS_NO_ROUTE = 5; public final RoutingContext ctx; public int routeCalculations = 0; @@ -92,6 +92,7 @@ public class RoutePlannerFrontEnd { public double cumDist; public RouteSegmentPoint pnt; public List routeToTarget; + public List stepBackRoute; public int targetInd = -1; } @@ -202,38 +203,35 @@ public class RoutePlannerFrontEnd { useSmartRouteRecalculation = use; } - - // TODO last segment not correct (cut) before end point and point of straight line - - // TODO add missing turns for straight lines (compare code) // TODO native matches less roads - - // TODO fix progress - next iteration - // TODO fix timings and remove logging every iteration public GpxRouteApproximation searchGpxRoute(GpxRouteApproximation gctx, List points) throws IOException, InterruptedException { gctx.ctx.timeToCalculate = System.nanoTime(); if (gctx.ctx.calculationProgress == null) { gctx.ctx.calculationProgress = new RouteCalculationProgress(); } List gpxPoints = generageGpxPoints(points, gctx); - GpxPoint start = gpxPoints.size() > 0 ? gpxPoints.get(0) : null; - boolean prevRouteFound = false; + GpxPoint start = null; + GpxPoint prev = null; + if(gpxPoints.size() > 0) { + gctx.ctx.calculationProgress.totalIterations = (int) (gpxPoints.get(gpxPoints.size() - 1).cumDist / gctx.MAXIMUM_STEP_APPROXIMATION + 1); + start = gpxPoints.get(0); + } while (start != null) { double routeDist = gctx.MAXIMUM_STEP_APPROXIMATION; GpxPoint next = findNextGpxPointWithin(gctx, gpxPoints, start, routeDist); boolean routeFound = false; - + gctx.ctx.calculationProgress.nextIteration(); if (next != null && initRoutingPoint(start, gctx, gctx.MINIMUM_POINT_APPROXIMATION)) { while (routeDist >= gctx.MINIMUM_STEP_APPROXIMATION && !routeFound) { routeFound = initRoutingPoint(next, gctx, gctx.MINIMUM_POINT_APPROXIMATION); if (routeFound) { - routeFound = findGpxRouteSegment(gctx, gpxPoints, start, next, prevRouteFound); + routeFound = findGpxRouteSegment(gctx, gpxPoints, start, next, prev != null); if (routeFound) { // route is found - cut the end of the route and move to next iteration boolean stepBack = stepBackAndFindPrevPointInRoute(gctx, gpxPoints, start, next); if (!stepBack) { // not supported case (workaround increase MAXIMUM_STEP_APPROXIMATION) - log.info("Consider to increase MAXIMUM_STEP_APPROXIMATION to: " + routeDist*2); + log.info("Consider to increase MAXIMUM_STEP_APPROXIMATION to: " + routeDist * 2); start.routeToTarget = null; routeFound = false; break; @@ -257,21 +255,21 @@ public class RoutePlannerFrontEnd { if (!routeFound) { // route is not found, move start point by next = findNextGpxPointWithin(gctx, gpxPoints, start, gctx.MINIMUM_STEP_APPROXIMATION); - if (prevRouteFound) { - if (next == null) { - // TODO finish - // makeSegmentPointPrecise(prev.routeToTarget.get(prev.routeToTarget.size() - 1), start.loc, false); - } else { + if (prev != null) { + prev.routeToTarget.addAll(prev.stepBackRoute); + makeSegmentPointPrecise(prev.routeToTarget.get(prev.routeToTarget.size() - 1), start.loc, false); + if (next != null) { log.warn("NOT found route from: " + start.pnt.getRoad() + " at " + start.pnt.getSegmentStart()); } } + prev = null; + } else { + prev = start; } - prevRouteFound = routeFound; start = next; } - + BinaryRoutePlanner.printDebugMemoryInformation(gctx.ctx); calculateGpxRoute(gctx, gpxPoints); - if (!gctx.res.isEmpty()) { new RouteResultPreparation().printResults(gctx.ctx, points.get(0), points.get(points.size() - 1), gctx.res); System.out.println(gctx); @@ -289,6 +287,7 @@ public class RoutePlannerFrontEnd { double d = 0; int segmendInd = start.routeToTarget.size() - 1; boolean search = true; + start.stepBackRoute = new ArrayList(); mainLoop: for (; segmendInd >= 0 && search; segmendInd--) { RouteSegmentResult rr = start.routeToTarget.get(segmendInd); boolean minus = rr.getStartPointIndex() < rr.getEndPointIndex(); @@ -300,6 +299,7 @@ public class RoutePlannerFrontEnd { if (nextInd == rr.getStartPointIndex()) { segmendInd--; } else { + start.stepBackRoute.add(new RouteSegmentResult(rr.getObject(), nextInd, rr.getEndPointIndex())); rr.setEndPointIndex(nextInd); } search = false; @@ -311,8 +311,10 @@ public class RoutePlannerFrontEnd { // here all route segments - 1 is longer than needed distance to step back return false; } + while (start.routeToTarget.size() > segmendInd + 1) { - start.routeToTarget.remove(segmendInd + 1); + RouteSegmentResult removed = start.routeToTarget.remove(segmendInd + 1); + start.stepBackRoute.add(removed); } RouteSegmentResult res = start.routeToTarget.get(segmendInd); next.pnt = new RouteSegmentPoint(res.getObject(), res.getEndPointIndex(), 0); @@ -321,7 +323,7 @@ public class RoutePlannerFrontEnd { private void calculateGpxRoute(GpxRouteApproximation gctx, List gpxPoints) { RouteRegion reg = new RouteRegion(); - reg.initRouteEncodingRule(0, "highway", "unmatched"); + reg.initRouteEncodingRule(0, "highway", RouteResultPreparation.UNMATCHED_HIGHWAY_TYPE); List lastStraightLine = null; for (int i = 0; i < gpxPoints.size(); ) { GpxPoint pnt = gpxPoints.get(i); @@ -424,8 +426,17 @@ public class RoutePlannerFrontEnd { rdo.pointsY = y.toArray(); rdo.types = new int[] { 0 } ; rdo.id = -1; - // comment to see road without straight connections - res.add(new RouteSegmentResult(rdo, 0, rdo.getPointsLength() - 1)); + List rts = new ArrayList<>(); + rts.add(new RouteSegmentResult(rdo, 0, rdo.getPointsLength() - 1)); + RouteResultPreparation preparation = new RouteResultPreparation(); + try { + preparation.prepareResult(gctx.ctx, rts, false); + } catch (IOException e) { + throw new IllegalStateException(e); + } + + // VIEW: comment to see road without straight connections + res.addAll(rts); } @@ -493,6 +504,7 @@ public class RoutePlannerFrontEnd { gctx.routeDistCalculations += (target.cumDist - start.cumDist); gctx.routeCalculations++; res = searchRouteInternalPrepare(gctx.ctx, start.pnt, target.pnt, null); + //BinaryRoutePlanner.printDebugMemoryInformation(gctx.ctx); routeIsCorrect = res != null && !res.isEmpty(); for (int k = start.ind + 1; routeIsCorrect && k < target.ind; k++) { GpxPoint ipoint = gpxPoints.get(k); @@ -848,6 +860,7 @@ public class RoutePlannerFrontEnd { } pringGC(ctx, true); List res = searchRouteInternalPrepare(ctx, points.get(0), points.get(1), routeDirection); + BinaryRoutePlanner.printDebugMemoryInformation(ctx); pringGC(ctx, false); makeStartEndPointsPrecise(res, points.get(0).getPreciseLatLon(), points.get(1).getPreciseLatLon(), null); return res; diff --git a/OsmAnd-java/src/main/java/net/osmand/router/RouteResultPreparation.java b/OsmAnd-java/src/main/java/net/osmand/router/RouteResultPreparation.java index 8344ff6027..b0c32de648 100644 --- a/OsmAnd-java/src/main/java/net/osmand/router/RouteResultPreparation.java +++ b/OsmAnd-java/src/main/java/net/osmand/router/RouteResultPreparation.java @@ -44,8 +44,11 @@ public class RouteResultPreparation { public static boolean PRINT_TO_CONSOLE_ROUTE_INFORMATION_TO_TEST = false; public static String PRINT_TO_GPX_FILE = null; private static final float TURN_DEGREE_MIN = 45; + private static final float UNMATCHED_TURN_DEGREE_MINIMUM = 45; + private static final float SPLIT_TURN_DEGREE_NOT_STRAIGHT = 100; public static final int SHIFT_ID = 6; private Log log = PlatformUtil.getLog(RouteResultPreparation.class); + public static final String UNMATCHED_HIGHWAY_TYPE = "unmatched"; /** * Helper method to prepare final result */ @@ -222,7 +225,7 @@ public class RouteResultPreparation { private void justifyUTurns(boolean leftSide, List result) { int next; - for (int i = 0; i < result.size() - 1; i = next) { + for (int i = 1; i < result.size() - 1; i = next) { next = i + 1; TurnType t = result.get(i).getTurnType(); // justify turn @@ -313,6 +316,7 @@ public class RouteResultPreparation { RouteSegmentResult rr = result.get(i); boolean plus = rr.getStartPointIndex() < rr.getEndPointIndex(); int next; + boolean unmatched = UNMATCHED_HIGHWAY_TYPE.equals(rr.getObject().getHighway()); for (int j = rr.getStartPointIndex(); j != rr.getEndPointIndex(); j = next) { next = plus ? j + 1 : j - 1; if (j == rr.getStartPointIndex()) { @@ -323,27 +327,33 @@ public class RouteResultPreparation { } List attachedRoutes = rr.getAttachedRoutes(next); boolean tryToSplit = next != rr.getEndPointIndex() && !rr.getObject().roundabout() && attachedRoutes != null; - if(rr.getDistance(next, plus ) == 0) { + if (rr.getDistance(next, plus) == 0) { // same point will be processed next step tryToSplit = false; } if (tryToSplit) { + float distBearing = unmatched ? RouteSegmentResult.DIST_BEARING_DETECT_UNMATCHED : RouteSegmentResult.DIST_BEARING_DETECT; // avoid small zigzags - float before = rr.getBearing(next, !plus); - float after = rr.getBearing(next, plus); - if(rr.getDistance(next, plus ) < 5) { - after = before + 180; - } else if(rr.getDistance(next, !plus ) < 5) { - before = after - 180; + float before = rr.getBearingEnd(next, distBearing); + float after = rr.getBearingBegin(next, distBearing); + if (rr.getDistance(next, plus) < distBearing) { + after = before; + } else if (rr.getDistance(next, !plus) < distBearing) { + before = after; } - boolean straight = Math.abs(MapUtils.degreesDiff(before + 180, after)) < TURN_DEGREE_MIN; + double contAngle = Math.abs(MapUtils.degreesDiff(before, after)); + boolean straight = contAngle < TURN_DEGREE_MIN; boolean isSplit = false; + + if (unmatched && Math.abs(contAngle) >= UNMATCHED_TURN_DEGREE_MINIMUM) { + isSplit = true; + } // split if needed for (RouteSegmentResult rs : attachedRoutes) { - double diff = MapUtils.degreesDiff(before + 180, rs.getBearingBegin()); + double diff = MapUtils.degreesDiff(before, rs.getBearingBegin()); if (Math.abs(diff) <= TURN_DEGREE_MIN) { isSplit = true; - } else if (!straight && Math.abs(diff) < 100) { + } else if (!straight && Math.abs(diff) < SPLIT_TURN_DEGREE_NOT_STRAIGHT) { isSplit = true; } } @@ -1061,18 +1071,17 @@ public class RouteResultPreparation { } TurnType t = null; if (prev != null) { - boolean noAttachedRoads = rr.getAttachedRoutes(rr.getStartPointIndex()).size() == 0; // add description about turn - double mpi = MapUtils.degreesDiff(prev.getBearingEnd(), rr.getBearingBegin()); - if(noAttachedRoads){ - // VICTOR : look at the comment inside direction route - // ? avoid small zigzags is covered at (search for "zigzags") -// double begin = rr.getObject().directionRoute(rr.getStartPointIndex(), rr.getStartPointIndex() < -// rr.getEndPointIndex(), 25); -// mpi = MapUtils.degreesDiff(prev.getBearingEnd(), begin); + // avoid small zigzags is covered at (search for "zigzags") + float bearingDist = RouteSegmentResult.DIST_BEARING_DETECT; + // could be || noAttachedRoads, boolean noAttachedRoads = rr.getAttachedRoutes(rr.getStartPointIndex()).size() == 0; + if (UNMATCHED_HIGHWAY_TYPE.equals(rr.getObject().getHighway())) { + bearingDist = RouteSegmentResult.DIST_BEARING_DETECT_UNMATCHED; } + double mpi = MapUtils.degreesDiff(prev.getBearingEnd(prev.getEndPointIndex(), bearingDist), + rr.getBearingBegin(rr.getStartPointIndex(), bearingDist)); if (mpi >= TURN_DEGREE_MIN) { - if (mpi < 45) { + if (mpi < TURN_DEGREE_MIN) { // Slight turn detection here causes many false positives where drivers would expect a "normal" TL. Best use limit-angle=TURN_DEGREE_MIN, this reduces TSL to the turn-lanes cases. t = TurnType.valueOf(TurnType.TSLL, leftSide); } else if (mpi < 120) { @@ -1085,7 +1094,7 @@ public class RouteResultPreparation { int[] lanes = getTurnLanesInfo(prev, t.getValue()); t.setLanes(lanes); } else if (mpi < -TURN_DEGREE_MIN) { - if (mpi > -45) { + if (mpi > -TURN_DEGREE_MIN) { t = TurnType.valueOf(TurnType.TSLR, leftSide); } else if (mpi > -120) { t = TurnType.valueOf(TurnType.TR, leftSide); @@ -1467,32 +1476,39 @@ public class RouteResultPreparation { protected TurnType createSimpleKeepLeftRightTurn(boolean leftSide, RouteSegmentResult prevSegm, RouteSegmentResult currentSegm, RoadSplitStructure rs) { + double devation = Math.abs(MapUtils.degreesDiff(prevSegm.getBearingEnd(), currentSegm.getBearingBegin())); + boolean makeSlightTurn = devation > 5 && (!isMotorway(prevSegm) || !isMotorway(currentSegm)); + TurnType t = null; + int laneType = TurnType.C; + if (rs.keepLeft && rs.keepRight) { + t = TurnType.valueOf(TurnType.C, leftSide); + } else if (rs.keepLeft) { + t = TurnType.valueOf(makeSlightTurn ? TurnType.TSLL : TurnType.KL, leftSide); + if (makeSlightTurn) { + laneType = TurnType.TSLL; + } + } else if (rs.keepRight) { + t = TurnType.valueOf(makeSlightTurn ? TurnType.TSLR : TurnType.KR, leftSide); + if (makeSlightTurn) { + laneType = TurnType.TSLR; + } + } else { + return null; + } int current = countLanesMinOne(currentSegm); int ls = current + rs.leftLanes + rs.rightLanes; int[] lanes = new int[ls]; for (int it = 0; it < ls; it++) { if (it < rs.leftLanes || it >= rs.leftLanes + current) { - lanes[it] = 0; + lanes[it] = TurnType.C << 1; } else { - lanes[it] = 1; + lanes[it] = (laneType << 1) + 1; } } // sometimes links are if ((current <= rs.leftLanes + rs.rightLanes) && (rs.leftLanes > 1 || rs.rightLanes > 1)) { rs.speak = true; } - double devation = Math.abs(MapUtils.degreesDiff(prevSegm.getBearingEnd(), currentSegm.getBearingBegin())); - boolean makeSlightTurn = devation > 5 && (!isMotorway(prevSegm) || !isMotorway(currentSegm)); - TurnType t = null; - if (rs.keepLeft && rs.keepRight) { - t = TurnType.valueOf(TurnType.C, leftSide); - } else if (rs.keepLeft) { - t = TurnType.valueOf(makeSlightTurn ? TurnType.TSLL : TurnType.KL, leftSide); - } else if (rs.keepRight) { - t = TurnType.valueOf(makeSlightTurn ? TurnType.TSLR : TurnType.KR, leftSide); - } else { - return t; - } t.setSkipToSpeak(!rs.speak); t.setLanes(lanes); return t; diff --git a/OsmAnd-java/src/main/java/net/osmand/router/RouteSegmentResult.java b/OsmAnd-java/src/main/java/net/osmand/router/RouteSegmentResult.java index 40257c474b..6ebe1645ee 100644 --- a/OsmAnd-java/src/main/java/net/osmand/router/RouteSegmentResult.java +++ b/OsmAnd-java/src/main/java/net/osmand/router/RouteSegmentResult.java @@ -22,7 +22,10 @@ import gnu.trove.map.hash.TIntObjectHashMap; public class RouteSegmentResult implements StringExternalizable { // this should be bigger (50-80m) but tests need to be fixed first - private static final float DIST_BEARING_DETECT = 5; + public static final float DIST_BEARING_DETECT = 5; + + public static final float DIST_BEARING_DETECT_UNMATCHED = 50; + private RouteDataObject object; private int startPointIndex; private int endPointIndex; @@ -446,19 +449,32 @@ public class RouteSegmentResult implements StringExternalizable } public float getBearingBegin() { - return (float) (object.directionRoute(startPointIndex, startPointIndex < endPointIndex, DIST_BEARING_DETECT) / Math.PI * 180); + return getBearingBegin(startPointIndex, DIST_BEARING_DETECT); } - public float getBearing(int point, boolean plus) { - return (float) (object.directionRoute(point, plus, DIST_BEARING_DETECT) / Math.PI * 180); - } - - public float getDistance(int point, boolean plus) { - return (float) (plus? object.distance(point, endPointIndex): object.distance(startPointIndex, point)); + public float getBearingBegin(int point, float dist) { + return getBearing(point, true, dist); } public float getBearingEnd() { - return (float) (MapUtils.alignAngleDifference(object.directionRoute(endPointIndex, startPointIndex > endPointIndex, DIST_BEARING_DETECT) - Math.PI) / Math.PI * 180); + return getBearingEnd(endPointIndex, DIST_BEARING_DETECT); + } + + public float getBearingEnd(int point, float dist) { + return getBearing(point, false, dist); + } + + public float getBearing(int point, boolean begin, float dist) { + if (begin) { + return (float) (object.directionRoute(point, startPointIndex < endPointIndex, dist) / Math.PI * 180); + } else { + double dr = object.directionRoute(point, startPointIndex > endPointIndex, dist); + return (float) (MapUtils.alignAngleDifference(dr - Math.PI) / Math.PI * 180); + } + } + + public float getDistance(int point, boolean plus) { + return (float) (plus ? object.distance(point, endPointIndex) : object.distance(startPointIndex, point)); } public void setSegmentTime(float segmentTime) { diff --git a/OsmAnd-java/src/main/java/net/osmand/router/RoutingContext.java b/OsmAnd-java/src/main/java/net/osmand/router/RoutingContext.java index 2c44940dff..e3c233b4d4 100644 --- a/OsmAnd-java/src/main/java/net/osmand/router/RoutingContext.java +++ b/OsmAnd-java/src/main/java/net/osmand/router/RoutingContext.java @@ -98,11 +98,17 @@ public class RoutingContext { public int loadedTiles = 0; public int visitedSegments = 0; public int relaxedSegments = 0; + public int visitedDirectSegments = 0; + public int visitedOppositeSegments = 0; + public int directQueueSize = 0; + public int oppositeQueueSize = 0; // callback of processing segments RouteSegmentVisitor visitor = null; // old planner public FinalRouteSegment finalRouteSegment; + + RoutingContext(RoutingContext cp) { this.config = cp.config; @@ -252,18 +258,6 @@ public class RoutingContext { return ind; } - public void newRoutingPoints() { - int middleX = startX / 2 + targetX / 2; - int middleY = startY / 2 + targetY; - List dataObjects = new ArrayList(); - loadTileData(middleX, middleY, 17, dataObjects); - - - System.out.println("Size of data objects " + dataObjects.size()); - } - - - public RouteSegment loadRouteSegment(int x31, int y31, long memoryLimit) { long tileId = getRoutingTile(x31, y31, memoryLimit); diff --git a/OsmAnd/res/values-ar/strings.xml b/OsmAnd/res/values-ar/strings.xml index 064a00bc8d..93c9629d1c 100644 --- a/OsmAnd/res/values-ar/strings.xml +++ b/OsmAnd/res/values-ar/strings.xml @@ -3799,4 +3799,10 @@ أحذية تزلج تمكين التحكم في مستوى التكبير/التصغير بالخريطة باستخدام أزرار مستوى صوت الجهاز. أزرار مستوى الصوت + إعطاء معلومات وزن مركبتك ،قد يتم تطبيق بعض القيود على المركبات الثقيلة. + حذف نقطة الوجهة التالية + يرجى إعطاء اسم للنقطة + سيتم حذف نقطة الوجهة الحالية على المسار. إذا كانت هي الوجهة، سوف تتوقف الملاحة. + تنزيل بيانات ويكيبيديا + الحصول على معلومات حول النقاط المثيرة للاهتمام من ويكيبيديا. إنه دليلك غير المتصل بجيبك - ما عليك سوى تمكين المكون الإضافي ويكبيديا والاستمتاع بمقالات حول الكائنات من حولك. \ No newline at end of file diff --git a/OsmAnd/res/values-ca/strings.xml b/OsmAnd/res/values-ca/strings.xml index 360d9eea91..3c4e7ee70f 100644 --- a/OsmAnd/res/values-ca/strings.xml +++ b/OsmAnd/res/values-ca/strings.xml @@ -3699,4 +3699,17 @@ Abasta l\'àrea: %1$s x %2$s Patins en línia Activeu per controlar el nivell d\'ampliació del mapa amb els botons del volum del dispositiu. Botons de volum pel zoom + Esteu segur que voleu suprimir definitivament %d dreceres\? + Podeu exportar o importar les dreceres amb els perfils de les aplicacions. + Ho esborrem tot\? + Retard de pantalla + Continua actiu + Si està activat \"%1$s\" el temps d\'activitat quedarà afectat. + tones + metres + Suprimeix la propera fita + Proporcioneu un nom per al punt + La propera fita de la ruta s\'esborrarà. Si es tractés de la Destinació final, la navegació s\'aturaria. + Baixa mapes de la Viquipèdia + Obteniu informació de punts d\'interès des la Viquipèdia. Serà la vostra guia de butxaca en desconnexió - només cal que activeu el connector Viquipèdia i fruireu dels articles que tracten de les coses que us rodegen. \ No newline at end of file diff --git a/OsmAnd/res/values-es/strings.xml b/OsmAnd/res/values-es/strings.xml index c2036f284b..a0baae1d76 100644 --- a/OsmAnd/res/values-es/strings.xml +++ b/OsmAnd/res/values-es/strings.xml @@ -3811,4 +3811,9 @@ Patines en línea Permite controlar el nivel de zoom del mapa con los botones de volumen del dispositivo. Botones de volumen como zoom + Proporcione la longitud de su vehículo, se pueden aplicar algunas restricciones de rutas para vehículos largos. + Eliminar el siguiente punto de destino + Por favor, proporcione un nombre para el punto + El punto de destino actual de la ruta será borrado. Si se trata del destino, la navegación se detendrá. + Descargar mapas de Wikipedia \ No newline at end of file diff --git a/OsmAnd/res/values-fa/strings.xml b/OsmAnd/res/values-fa/strings.xml index 55c3b83a71..061c2a10e9 100644 --- a/OsmAnd/res/values-fa/strings.xml +++ b/OsmAnd/res/values-fa/strings.xml @@ -3840,4 +3840,8 @@ طول مجاز طول مجاز خودرو در مسیرها را مشخص کنید. این دستگاه دوربین‌های سرعت را ندارد. + فعال بماند + حذف مقصد بعدی + لطفاً نام نقطه را بنویسید + دانلود نقشه‌های ویکی‌پدیا \ No newline at end of file diff --git a/OsmAnd/res/values-gl/phrases.xml b/OsmAnd/res/values-gl/phrases.xml index 6f15e30f7e..5e15e78702 100644 --- a/OsmAnd/res/values-gl/phrases.xml +++ b/OsmAnd/res/values-gl/phrases.xml @@ -3823,4 +3823,6 @@ Frecha Vibración Caixa de distribución + Predio + Concello \ No newline at end of file diff --git a/OsmAnd/res/values-gl/strings.xml b/OsmAnd/res/values-gl/strings.xml index 6c2608e370..d373b082d4 100644 --- a/OsmAnd/res/values-gl/strings.xml +++ b/OsmAnd/res/values-gl/strings.xml @@ -3836,4 +3836,10 @@ Lon %2$s Patíns en liña Activar para controlar o nivel de achegamento (zoom) do mapa cos botóns de volume do dispositivo. Os botóns de volume mudan o achegamento + Fornece a lonxitude do teu vehículo. Algunhas restricións de ruta poden ser aplicadas a vehículos longos. + Eliminar seguinte punto de destino + Fornece un nome para o punto + O punto de destino actual na ruta será eliminado. Se fora o destino, a navegación sería interrompida. + Baixar mapas da Wikipedia + Obter información sobre os puntos de interesse da Wikipédia. É o teu guía de peto sen conexión - só activar o complemento da Wikipédia e desfrutar dos artigos sobre os elementos ó teu redor. \ No newline at end of file diff --git a/OsmAnd/res/values-he/strings.xml b/OsmAnd/res/values-he/strings.xml index 16a5f1030f..6a93ee035a 100644 --- a/OsmAnd/res/values-he/strings.xml +++ b/OsmAnd/res/values-he/strings.xml @@ -3817,4 +3817,10 @@ למכשיר הזה אין מצלמות מהירות. מאפשר לשלוח ברמת התקריב של המפה עם כפתורי עצמת השמע של המכשיר. כפתורי עצמת שמע כתקריב + נא לספק את אורך כלי הרכב שלך, מגבלות מסלול מסוימות עשויות לחול על כלי רכב ארוכים. + מחיקת נקודת היעד הבאה + נא לספק שם לנקודה + נקודת היעד הנוכחית במסלול תימחק. אם זה יהיה היעד, הניווט ייעצר. + הורדת מפות ויקיפדיה + קבלת מידע על נקודות עניין מוויקיפדיה. מדריך הכיס הפרטי שלך - עליך פשוט להפעיל את התוסף של ויקיפדיה וליהנות מערכים על מה שסביבך. \ No newline at end of file diff --git a/OsmAnd/res/values-hu/phrases.xml b/OsmAnd/res/values-hu/phrases.xml index 1f7dda4e7e..07a5eabded 100644 --- a/OsmAnd/res/values-hu/phrases.xml +++ b/OsmAnd/res/values-hu/phrases.xml @@ -3789,4 +3789,7 @@ igen nem Csak amikor át szabad menni + Nyíl + Rezgés + Nyomás \ No newline at end of file diff --git a/OsmAnd/res/values-hu/strings.xml b/OsmAnd/res/values-hu/strings.xml index cbbd8958eb..678c4dda4d 100644 --- a/OsmAnd/res/values-hu/strings.xml +++ b/OsmAnd/res/values-hu/strings.xml @@ -245,8 +245,7 @@ További telepítése… Raszteres térképek használata ezen nagyítási szint alatt. Legkisebb vektoros nagyítási szint - - Online OSM térképbesorolás képekkel. + Online OSM térképbesorolás képekkel. Nem sikerült az offline keresés. Keresés geolokáció alapján Rendszer nyelve @@ -572,7 +571,7 @@ 3D térképnézet Utoljára használt POI-rátétréteg megjelenítése. POI-rátétréteg megjelenítése - Online vagy gyorsítótárazott térképcsempék kiválasztása + Online vagy gyorsítótárazott térképcsempék kiválasztása. Csempés térkép forrása Térkép forrása Internet használata @@ -787,29 +786,27 @@ Megjelenítési jellemzők Térképstílus Globális mobil térkép és navigáció, offline és online OSM-térképekkel - OsmAnd (OSM Automated Navigation Directions) -\n -\n Az OsmAnd nyílt forráskódú navigációs alkalmazás, amely a globális OSM adatok széles skáláját használja. Az alkalmazás internetkapcsolat nélkül is használható, mert minden (vektoros és csempés) térképadat tárolható a telefon memóriájában. Az alkalmazás továbbá offline és online útvonaltervezést is tartalmaz, részletes, hangvezérléses navigációval. -\n + OsmAnd (OSM Automated Navigation Directions) +\n +\n Az OsmAnd nyílt forráskódú navigációs alkalmazás, amely a globális OSM adatok széles skáláját használja. Az alkalmazás internetkapcsolat nélkül is használható, mert minden (vektoros és csempés) térképadat tárolható a telefon memóriájában. Az alkalmazás továbbá offline és online útvonaltervezést is tartalmaz, részletes, hangvezérléses navigációval. +\n \n Néhány fontos funkció: -\n - Teljesen offline működés (letöltött vektoros és csempés térképek tárolása a készülék tárhelyén) -\n - kompakt vektoros térképek az egész világról -\n - Ország- és régiótérképek letöltése közvetlenül az alkalmazásból -\n - Több térkép egymásra rétegezése, például állítható átlátszóságú GPX- vagy navigációs nyomvonalak, érdekes pontok, kedvence, szintvonalak, tömegközlekedési megállók és további térképek -\n - Címek és helyek (érdekes pontok) offline keresése -\n - Offline útvonaltervezés közepes távolságra -\n -\n- Autós, kerékpáros és gyalogos módok a következő beállításokkal: -\n - éjszakai/nappali nézet automatikus átkapcsolása -\n - sebességfüggő térképnagyítás -\n - térképigazítás iránytű vagy mozgásirány szerint -\n - sávnavigáció, sebességkorlátozás kijelzése, rögzített és hangfelolvasásos (TTS) hangok -\n -\n -\n Az OsmAnd ezen ingyenes verziójának korlátozásai: -\n - letölthető térképek számának korlátozása -\n - wikipédia-POI offline elérés nélkül +\n - Teljesen offline működés (letöltött vektoros és csempés térképek tárolása a készülék tárhelyén) +\n - kompakt vektoros térképek az egész világról +\n - Ország- és régiótérképek letöltése közvetlenül az alkalmazásból +\n - Több térkép egymásra rétegezése, például állítható átlátszóságú GPX- vagy navigációs nyomvonalak, érdekes pontok, kedvence, szintvonalak, tömegközlekedési megállók és további térképek +\n - Címek és helyek (érdekes pontok) offline keresése +\n - Offline útvonaltervezés közepes távolságra +\n - Autós, kerékpáros és gyalogos módok a következő beállításokkal: +\n - éjszakai/nappali nézet automatikus átkapcsolása +\n - sebességfüggő térképnagyítás +\n - térképigazítás iránytű vagy mozgásirány szerint +\n - sávnavigáció, sebességkorlátozás kijelzése, rögzített és hangfelolvasásos (TTS) hangok \n +\n Az OsmAnd ezen ingyenes verziójának korlátozásai: +\n - letölthető térképek számának korlátozása +\n - wikipédia-POI offline elérés nélkül +\n \n Az OsmAndot aktívan fejlesztjük. Projektünk és a folyamatos előrelépés az új funkciók kifejlesztésére és tesztelésére kapott adományoktól függ. Kérjük, fontolja meg az OsmAnd+ megvásárlását vagy konkrét új funkciók finanszírozását vagy egy álalános adományt a https://osmand.net oldalon. OsmAnd+ (OSM Automated Navigation Directions) \n @@ -936,7 +933,7 @@ Kérem, fontolja meg a „Szintvonalak” bővítmény megvásárlását, ezzel is támogatva a további fejlesztéseket. Szintvonal bővítmény Más sorrend - Szinkronizálja a hang/videó jegyzeteket a Dropbox fiókjával + Szinkronizálja a hang/videó jegyzeteket a Dropbox fiókjával. Dropbox bővítmény Hang- és videofelvétel Biztosan megszakítja a navigációt\? @@ -1437,7 +1434,7 @@ Töltse le a speciális offline térképet a sílétesítmények megjelenítéséhez. Töltse le a speciális offline térképet a hajózási részletek megjelenítéséhez. Eszköz memóriája - "%1$s szabad " + %1$s szabad Csak utak Sípályák Sípálya kezeltség @@ -1473,7 +1470,7 @@ Pozíció szimulálása Lapos lista Szélesség: %1$s -Hosszúság: %2$s +\nHosszúság: %2$s Gyakran ismételt kérdések, legutóbbi módosítások és egyebek. Navigációs beállítások Általános beállítások @@ -1926,7 +1923,7 @@ Hosszúság: %2$s OSM felhasználónév és jelszó Ezzel kaphat friss tájékoztatást a szerkesztéseiről. Minden visszavonása - A fájlnév érvénytelen karaktereket tartalmaz + A fájlnév érvénytelen karaktert tartalmaz Az alkalmazás már tud írni a külső tárolóra, de ehhez egy kézi újraindítás szükséges. Klipek elvágása, ha a felhasznált hely túllépi a tárolási méretet. A felvett klipek maximális hossza. @@ -2127,21 +2124,21 @@ Hosszúság: %2$s Kedvencek párbeszédablak megjelenítése Előre megadott név Gomb, amely létrehoz a képernyő közepén egy térképjelölőt. - A gomb, amely létrehoz a képernyő közepén egy GPX-útpontot. + Gomb, amely létrehoz a képernyő közepén egy GPX-útpontot. Gomb, amely létrehoz a képernyő közepén egy hangjegyzetet. Gomb, amely létrehoz a képernyő közepén egy videojegyzetet. Gomb, amely létrehoz a képernyő közepén egy fényképes jegyzetet. Gomb, amely létrehoz a képernyő közepén egy OSM-jegyzetet. Gomb, amely létrehoz a képernyő közepén egy érdekes helyet (POI-t). - Váltógomb, amely engedélyezi vagy letiltja a navigáció közbeni hangutasításokat. + Gomb, amely engedélyezi vagy letiltja a navigáció közbeni hangutasításokat. Gomb, amely létrehoz a képernyő közepén egy parkolási helyet. Ideiglenes dialógusablak megjelenítése " elmentve ide: " Hely A duplikáció elkerüléséért a gyorsművelet át lett nevezve erre: %1$s. A gyorsművelet neve kétszer szerepel - Váltógomb, amely a térképen megjeleníti vagy elrejti a Kedvenc helyeket. - Váltógomb, amely a térképen megjeleníti vagy elrejti az érdekes pontokat (POI-kat). + Gomb, amely a térképen megjeleníti vagy elrejti a Kedvenc helyeket. + Gomb, amely a térképen megjeleníti vagy elrejti az érdekes pontokat (POI-kat). Kedvencek megjelenítése/elrejtése Kedvencek megjelenítése Kedvencek elrejtése @@ -2239,7 +2236,7 @@ Hosszúság: %2$s Add meg az irányítószámot Közeli települések Térkép automatikus nagyítása be/ki - Váltógomb, amely be- vagy kikapcsolja a sebességtől függő automatikus térképnagyítást. + Gomb, amely be- vagy kikapcsolja a sebességtől függő automatikus térképnagyítást. Automatikus nagyítás bekapcsolása Automatikus nagyítás kikapcsolása Célpont megadása @@ -2269,10 +2266,10 @@ Hosszúság: %2$s Utca kijelölése itt: %1$s Cím megadása - OSM-jegyzetek megjelenítése vagy elrejtése + OSM-jegyzetek megjelenítése / elrejtése OSM-jegyzetek megjelenítése OSM-jegyzetek elrejtése - Váltógomb, amely a térképen megjeleníti vagy elrejti az OSM-jegyzeteket. + Gomb, amely a térképen megjeleníti vagy elrejti az OSM-jegyzeteket. Távolság szerinti sorrendben Keresés a Kedvencekben A függőleges árnyékolás megjelenítéséhez töltse le a „Domborzatárnyékolás” térképet. @@ -2300,7 +2297,7 @@ Hosszúság: %2$s A célpont korlátozott hozzáférésű területen található. Engedélyezed a magánutak használatát ennél az útvonaltervnél\? Keresés újraindítása Keresett terület szélesítése - "Nincs találat " + Nincs találat Módosítsa a keresést vagy növelje a sugarát. Mapillary Fényképek hozzáadása @@ -2318,20 +2315,20 @@ Hosszúság: %2$s Telepítés Mapillary megnyitása Mapillary-fénykép - "Hozzávetőleges lefedettség és térképminőség: -\n • Nyugat-Európa: **** -\n • Kelet-Európa: *** -\n • Oroszország: *** -\n • Észak-Amerika: *** -\n • Dél-Amerika: ** -\n • Ázsia: ** -\n • Japán és Korea: *** -\n • Közel-Kelet: ** -\n • Afrika: ** -\n • Antarktisz: * + Hozzávetőleges lefedettség és térképminőség: +\n • Nyugat-Európa: **** +\n • Kelet-Európa: *** +\n • Oroszország: *** +\n • Észak-Amerika: *** +\n • Dél-Amerika: ** +\n • Ázsia: ** +\n • Japán és Korea: *** +\n • Közel-Kelet: ** +\n • Afrika: ** +\n • Antarktisz: * \n A világ legtöbb országa letölthető. \n Afganisztántól Zimbabwéig, Ausztráliától az Egyesült Államokig. Magyarország, Szlovákia, Románia, Ausztria, Németország, Olaszország… -\n" +\n Korrigált távolság Engedélyek Nem sikerült a fájl importálása. Győződjék meg arról, hogy az OsmAndnak van engedélye a fájl olvasására. @@ -2449,9 +2446,9 @@ Hosszúság: %2$s Útpont 1 Útvonalpont 1 GPX-fájlok hozzáadása - GPX fájlok importálása, vagy nyomvonalak rögzítése. + GPX fájlok importálása vagy nyomvonalak rögzítése. Kedvencek hozzáadása - Kedvencek importálása, vagy hozzáadása a térképen pontok megjelölésével. + Kedvencek importálása vagy hozzáadása a térképen pontok megjelölésével. GPX fájl importálása %1$s fájl nem tartalmaz útpontot. Importálod nyomvonalként? Pont mozgatása @@ -2623,7 +2620,7 @@ Hosszúság: %2$s Csak Wi-Fin Útikönyv kiválasztása Útikönyv - Az oldal csak online érhető el. Megnyitod böngészőben? + Az oldal csak online érhető el. Megnyitja böngészőben\? Kép gyorsítótár Keresési előzmények törlése Képek letöltése @@ -2720,7 +2717,7 @@ Hosszúság: %2$s Törlöd „%s” térképjelölőt\? Térképjelölő szerkesztése Utca keresése - Előbb adja meg meg a várost/helyet + Előbb adja meg a várost/helyet Visszaállítás Elhagyott jelölők megtartása a térképen A folytatáshoz engedélyezze a helymeghatározást az OsmAnd számára. @@ -2854,7 +2851,7 @@ Hosszúság: %2$s \n • Az útvonalterv újratervezésre kerül, ha eltérsz attól \n • Célkeresés cím, típus (például: parkoló, étterem, hotel, benzinkút, múzeum), vagy földrajzi koordináták szerint \n - Váltógomb, amellyel az OsmAnd éjszakai és nappali módja között lehet váltani. + Gomb, amellyel az OsmAnd éjszakai és nappali módja között lehet váltani. Nappali mód Éjszakai mód Váltás a nappali/éjszakai mód között @@ -2875,7 +2872,7 @@ Hosszúság: %2$s Úttípusok Szálljon le itt: GPX-nyomvonalak megjelenítése/elrejtése - Váltógomb, amely a térképen megjeleníti vagy elrejti a GPX-nyomvonalakat. + Gomb, amely a térképen megjeleníti vagy elrejti a GPX-nyomvonalakat. GPX nyomvonalak elrejtése GPX nyomvonalak megjelenítése Először adjon meg egy célpontot @@ -3123,7 +3120,7 @@ Hosszúság: %2$s Előnyben részesített nehézség Az ilyen nehézségű pályák részesülnek előnyben, azonban az útvonalba továbbra is bekerülhetnek nehezebb vagy könnyebb pályák, ha úgy rövidebb. Pályán kívül - A freeride és pályán kívüli utak nem hivatalos útvonalak és átjárók. Általában nem egyengetik el őket, nincsenek karbantartva, este pedig nem ellenőrzik őket. Belépés csak saját felelősségre. + A \'freeride\' és a \'pályán kívüli utak\' nem hivatalos útvonalak és átjárók. Általában nem egyengetik el őket, nincsenek karbantartva, este pedig nem ellenőrzik őket. Belépés csak saját felelősségre. Profil beállításai: A kiválasztott formátum az alkalmazás összes területén alkalmazva lesz. Beállítás módosítása @@ -3183,8 +3180,8 @@ Hosszúság: %2$s OsmAnd beállítások Kiszámít OSM-szerkesztések - Váltógomb, amely a térképen megjeleníti vagy elrejti a szintvonalakat. - Váltógomb, amely a térképen megjeleníti vagy elrejti a domborzatárnyékolást. + Gomb, amely a térképen megjeleníti vagy elrejti a szintvonalakat. + Gomb, amely a térképen megjeleníti vagy elrejti a domborzatárnyékolást. Szövegfelolvasó motor indítása sikertelen. %1$s • %2$s %1$s GB szabad (%2$s GB-ból) @@ -3439,7 +3436,7 @@ Hosszúság: %2$s Online nyomvonalrögzítés Naplózás pontossága Az összes rögzített nyomvonal megtalálható a %1$s helyen vagy a fájlkezelővel az OsmAnd mappában. - Az összes jegyzetét megtalálja a %1$s helyen + Az összes OSM-jegyzetét megtalálja a %1$s helyen. Videojegyzetek Fényképes jegyzetek Útvonal újraszámítása @@ -3503,7 +3500,7 @@ Hosszúság: %2$s Mindkettő megtartása Összes lecserélése Domborzat - A domborzatárnyékolás réteg sötét árnyalattal emeli ki a lejtőket, csúcsokat és az alföldeket. + A domborzatárnyékolás réteg sötét árnyalattal emeli ki a lejtőket, csúcsokat és a síkságokat. A lejtő réteg színezéssel jeleníti meg a terep meredekségét. Állítsa be a legkisebb és legnagyobb nagyítási szintet, amelyen a réteg megjelenjen. További térképek szükségesek a domborzatárnyékolás térképen való megjelenítéséhez. @@ -3532,7 +3529,7 @@ Hosszúság: %2$s Négyzet Min Rögzített adatok törlése - Engedélyezésével domborzatárnyékolás vagy lejtőtérkép jeleníthető meg. Ezekről a térképfajtákról többet olvashat a honlapunkon: + Engedélyezésével domborzatárnyékolás vagy lejtőtérkép jeleníthető meg. Ezekről a térképfajtákról többet olvashat a honlapunkon. Túrasízés Motoros hószán Egyéni OsmAnd bővítmény @@ -3556,7 +3553,7 @@ Hosszúság: %2$s Fő műveletek Csak ezen a kategórián belül lehetséges az elemek áthelyezése. Fejlesztő bővítmény - Másik pont lecserélése erre + Másik pont lecserélése erre. Elemek Módosítások alkalmazva erre a profilra: %1$s. Nyelvek @@ -3624,7 +3621,7 @@ Hosszúság: %2$s Kedvenc hozzáadása/módosítása Alapértelmezett elemsorrend visszaállítása Vissza a szerkesztéshez - Nem található ilyen profil + Nem található ilyen profil. A műveletgomb vált a kiválasztott profilok között. Profil hozzáadása Alkalmazásprofil módosítása @@ -3760,4 +3757,15 @@ Hosszúság: %2$s Adja meg a járműve hosszát, a hosszú járművekre útvonalkorlátozások lehetnek érvényben. Következő célpont törlése Wikipédia térképek letöltése + További adatokat is kijelölhet exportálásra a profillal együtt. + Kiegészítő adatok átvétele + Az importált profil kiegészítő adatokat is tartalmaz. Koppintson az \"Importál\" gombra kizálólag a profiladatok importálásához vagy válassza a kiegészítő adatokat. + Összes adat importálva innen: %1$s, az alábbi gombokkal megnyithatja az alkalmazás megfelelő részét az adatok kezeléséhez. + A fizetés a Google Play fiókhoz lesz felszámítva a vásárlás megerősítésekor. +\n +\nAz előfizetés automatikusan megújul, kivéve ha a meghosszabbítás napja előtt lemondásra kerül. A fókjához az új időszak (hónap/három hónap/év) díja kizárólag a meghosszabítás napján lesz felszámolva. +\n +\nAz előfizetéseit a Google Play beállításainál tudja kezelni és lemondani. + Törli az útvonal soron következő célpontját. Amennyiben ez a végző célpont, a navigáció megáll. + Szerezzen információt az érdekes helyekkel kapcsolatban a Wikipédiáról. Ez az ön offline zseb útikönyve - egyszerűen engedélyezze a Wikipédia bővítményt és élvezze az ön körül lévő objektumokról szóló cikkeket. \ No newline at end of file diff --git a/OsmAnd/res/values-hy/strings.xml b/OsmAnd/res/values-hy/strings.xml index 9644134415..e41d3c45ed 100644 --- a/OsmAnd/res/values-hy/strings.xml +++ b/OsmAnd/res/values-hy/strings.xml @@ -3037,4 +3037,13 @@ Փոխել hավելվածի պրոֆիլը Համապատասխան պրոֆիլներ չեն գտնվել: Համաշխարհային ակնարկային քարտեզ (մանրամասն) + Նշեք մեքենայի երկարությունը, երկար տրանսպորտային միջոցների համար կարող են կիրառվել երթուղու սահմանափակումներ։ + Նշեք թույլատրելի տրանսպորտային միջոցի երկարությունը երթուղով երթևեկության համար։ + Երկարության սահմանապակումը + Այս սարքը չունի արագության վերահսկման տեսախցիկներ: + Անվաչմուշկներ + Ջնջել հաջորդ նպատակակետը + Խնդրում ենք մուտքագրել կետի անունը + Երթուղու ընթացիկ նպատակակետը կջնջվի: Եթե դա նպատակակետն է, նավարկումը կդադարի։ + Ներբեռնել Վիքիպեդիայի քարտեզները \ No newline at end of file diff --git a/OsmAnd/res/values-pt/phrases.xml b/OsmAnd/res/values-pt/phrases.xml index a2bbe6f233..4871e54c12 100644 --- a/OsmAnd/res/values-pt/phrases.xml +++ b/OsmAnd/res/values-pt/phrases.xml @@ -1426,7 +1426,7 @@ Sim Sem piso tátil Sim - Não + Som: não Só quando permitido atravessar Estação de resgate Área de serviço @@ -3809,4 +3809,9 @@ Tubo Pressão Estado da bomba: falta de feixe + Sim + Sim + Vibração: não + Seta + Vibração \ No newline at end of file diff --git a/OsmAnd/res/values-ru/strings.xml b/OsmAnd/res/values-ru/strings.xml index 7bb16d1e97..cb563bcdd3 100644 --- a/OsmAnd/res/values-ru/strings.xml +++ b/OsmAnd/res/values-ru/strings.xml @@ -365,9 +365,9 @@ Онлайн и кешированные карты (растровые) Стандартные карты (векторные) Загрузка и управление локальными файлами карт на вашем устройстве. - Активируйте плагин онлайн карт, чтобы выбирать различные источники карт - Онлайн карты - Использовать онлайн карты (загрузка и кеширование на SD-карте). + Активируйте плагин онлайн-карт, чтобы выбирать различные источники карт + Онлайн-карты + Использовать онлайн-карты (загрузка и кеширование на SD-карте). Онлайн-карты Выберите источник онлайн или кешированных растровых карт. Получение доступа ко множеству видов онлайн-карт (тайловых или растровых): от предопределённых тайловых OSM (как Mapnik), до спутниковых снимков и слоёв специального назначения, таких как карты погоды, климатические карты, геологические карты, слои затемнения высот и т. д. @@ -387,7 +387,7 @@ Отладка и разработка Быстрая отрисовка Тест голосовых подсказок - Скачайте локальную векторную карту для этой локации в меню «Настройки» («Управление файлами карт»), или переключитесь на плагин «Онлайн карты». + Скачайте локальную векторную карту для этой локации в меню «Настройки» («Управление файлами карт»), или переключитесь на плагин «Онлайн-карты». Отправить файлы GPX в OSM\? Видимость Теги @@ -410,10 +410,10 @@ Локальное дополнение: OSM POI/заметки на устройстве Просмотр и управление OSM POI/заметками в локальной базе данных. - Укажите интервал онлайн слежения. - Интервал онлайн слежения + Укажите интервал онлайн-слежения. + Интервал онлайн-слежения Укажите веб-адрес со следующими параметрами: lat={0}, lon={1}, timestamp={2}, hdop={3}, altitude={4}, speed={5}, bearing={6}. - Web адрес онлайн слежения + Web адрес онлайн-слежения Записать трек можно с помощью виджета GPX или выбрав «Запись поездки» в Настройках. Показывать текущий путь Вы можете скачать или обновить карты %1$s. @@ -448,11 +448,11 @@ Прозрачная тема Нативная библиотека не поддерживается на этом устройстве. Инициализация нативной библиотеки… - Вид карты автоцентра + Центрировать карту автоматически Выберите время, через которое карта вернётся к текущей позиции. Автовозврат карты только при следовании по маршруту Возвращать карту в текущее положение только при следовании по маршруту. - Автоцентр просмотра карты во время использования. + Центрировать карту при использовании. Маршрут GPX Найдено несколько связанных категорий POI. Загрузите данные для локального поиска POI. @@ -704,7 +704,7 @@ Где я? Сеть GPS - секунды + сек. мин. Интервал пробуждения для фоновой службы: Интервал пробуждения GPS @@ -785,9 +785,9 @@ Поиск… Поиск адреса… Поиск адреса в OSM Nominatim - Онлайн поиск: Номер дома, улица, Город + Онлайн-поиск: номер дома, улица, город Локальный поиск - Онлайн поиск + Онлайн-поиск Уровень детализации Выберите максимальный масштаб для загрузки тайлов карт из интернета. Общая протяжённость = %1$s, время в пути = %2$d ч. %3$d м. @@ -836,7 +836,7 @@ Сохранение файла GPX… Окончен Использовать интернет-сервис для прокладки маршрута. - Онлайн маршрутизация + Онлайн-маршрутизация Пароль Укажите настройки для загрузки данных в Openstreetmap.org (OSM). Настройка данных: язык, обновление данных. @@ -994,7 +994,7 @@ Специальные возможности Настройки векторной отрисовки Дополнительные слои - Настройки онлайн карт + Настройки онлайн-карт Настройки локальных карт Удалить %1$s? Пригород @@ -1024,7 +1024,7 @@ Полигоны Режим отрисовки Оптимизация карты для соответствующего профиля - Показывать, начиная с уровня масштабирования (требуются данные контурных линий): + Показывать начиная с уровня масштабирования (требуются данные контурных линий): Показывать контурные линии Показывать больше деталей на карте. Больше деталей @@ -1055,7 +1055,7 @@ Точка парковки Позволяет записывать, где припаркован ваш автомобиль, а также сколько времени он на парковке. \nМесто и время парковки доступны на панели управления, а также в виде виджета на карте. Для напоминания в календарь Android может быть добавлено уведомление. - Парковочное место + Место парковки Пометить место парковки Удалить метку места парковки Точка отправления слишком далеко от ближайшей дороги. @@ -1123,7 +1123,7 @@ Мобильный просмотр и навигация по онлайн и локальным картам OSM всего мира OsmAnd (Open Street Maps Automated Navigation Directions) \n -\n OsmAnd — это навигационное приложение с открытым исходным кодом и доступом к картам и данным на основе OSM. Все данные карт (векторные или растровые) могут быть сохранены на карту памяти устройства для использования без подключения к интернету. OsmAnd также предоставляет локальные и онлайн средства построения маршрута, включая голосовые инструкции по маршруту. +\n OsmAnd — это навигационное приложение с открытым исходным кодом и доступом к картам и данным на основе OSM. Все данные карт (векторные или растровые) могут быть сохранены на карту памяти устройства для использования без подключения к интернету. OsmAnd также предоставляет локальные и онлайн-средства построения маршрута, включая голосовые инструкции по маршруту. \n \n Некоторые из основных возможностей приложения: \n — работа с векторными и растровыми картами без доступа в интернет (для этого нужно предварительно сохранить карты на карту памяти устройства); @@ -1146,7 +1146,7 @@ OsmAnd — это навигационное приложение для путешествий с открытым исходным кодом OsmAnd+ (OSM Automated Navigation Directions) \n -\n OsmAnd+ — это навигационное приложение с открытым исходным кодом и доступом к широкому спектру глобальных данных OpenStreetMap (OSM). Все данные карт (векторные или растровые/тайловые) могут быть сохранены на карту памяти устройства для автономного использования, без подключения к сети интернет. OsmAnd также предоставляет локальные и онлайн средства построения маршрута, включая пошаговые голосовые подсказки. +\n OsmAnd+ — это навигационное приложение с открытым исходным кодом и доступом к широкому спектру глобальных данных OpenStreetMap (OSM). Все данные карт (векторные или растровые/тайловые) могут быть сохранены на карту памяти устройства для автономного использования, без подключения к сети интернет. OsmAnd также предоставляет локальные и онлайн-средства построения маршрута, включая пошаговые голосовые подсказки. \n \n OsmAnd+ — это платная версия приложения, покупая которую вы поддерживаете проект, финансируете разработку новых функций и получаете последние обновления. \n @@ -1163,7 +1163,7 @@ \n — автоматического переключения на дневной/ночной режим отрисовки карты; \n — изменения масштабы карты в зависимости от скорости; \n — вращения карты по компасу или направлению движения; -\n — подсказки полосы движения, отображение ограничения скорости, предварительно записанные и синтезированные голосовые подсказки +\n — подсказки полосы движения, отображение ограничения скорости, предварительно записанные и синтезированные голосовые подсказки \n Без автомагистралей Привязываться к дорогам во время навигации. @@ -1182,9 +1182,9 @@ Жильё Рестораны Достопримечательности - Добавить как последний промежуточный пункт - Добавить как первый промежуточный пункт - Добавить промежуточный пункт в конец + Добавить последним промежуточным пунктом + Добавить первым промежуточным пунктом + Добавить последним промежуточным пунктом Добавить как первый промежуточный пункт Заменить пункт назначения Пункт назначения уже установлен: @@ -1621,7 +1621,7 @@ Маршруты автобусов Маршруты трамваев и поездов Скрыть - Избегать дороги… + Нежелательные участки %1$s необходимо это разрешение, чтобы выключить экран для экономии энергии. Автовключение экрана перед поворотом Включать экран устройства (если он выключен) при приближении к повороту. @@ -1638,7 +1638,7 @@ Локальные Зона Остановки транспорта - Отменить + Отклонить Загрузить локальные карты\? Загружено карт: %1$s Загрузить новую карту @@ -2301,7 +2301,7 @@ Выключить голос Не удалось переместить файл. Благодарим вас за покупку контуров морских глубин - Добавить фотографии + Добавить фото Разрешения Онлайн-фото Здесь нет фотографий. @@ -2414,7 +2414,7 @@ Маркер перемещён в действующие Указатель расстояния Показать карту - Вы должны добавить по крайней мере один маркер, чтобы использовать эту функцию. + Для использования этой функции вы должны добавить хотя бы один маркер. Не удалось изменить заметку. Дорога Показывать направляющие линии @@ -2447,7 +2447,7 @@ \n Большинство стран по всему миру доступны в виде загрузок \n От Афганистана до Зимбабве, от Австралии до США. Аргентина, Бразилия, Канада, Франция, Германия, Мексика, Великобритания, Испания, … \n - Временной буфер для онлайн слежения + Временной буфер для онлайн-слежения Укажите временной буфер для хранения местоположений при отсутствии подключения к сети Кнопка для добавления маркера карты в центр экрана. Кнопка для добавления путевой точки GPX в центре экрана. @@ -2543,7 +2543,7 @@ \n• Делитесь своим расположением, чтобы друзья смогли найти вас \n• Сохраняет ваши самые важные места в избранных \n• Позволяет вам выбрать как отображать названия на карте: на английском, местным или с фонетическим написанием -\n• Отображает специальные онлайн тайлы, спутниковые снимки (с Bing), различные метки, как туристические/навигационные треки GPX и дополнительные слои с настраиваемой прозрачностью +\n• Отображает специальные онлайн-тайлы, спутниковые снимки (с Bing), различные метки, как туристические/навигационные треки GPX и дополнительные слои с настраиваемой прозрачностью \n Катание на лыжах \n• OsmAnd плагин лыжные карты позволяет видеть лыжные трассы с уровнем сложности и некоторой дополнительной информацией, как расположение подъёмников и других объектов. @@ -2579,12 +2579,12 @@ \n• Автоматическое перестройка маршрута при отклонении от существующего \n• Поиск мест по адресу, типу (например, ресторан, гостиница, заправка, музей) или географическим координатам \n - Просмотр карты -\n• Отображение вашего местоположения и ориентации -\n• Возможность ориентирования карты по компасу или по направлению вашего движения -\n• Сохранение ваших самых важных мест в качестве избранных -\n• Отображение POI (точек интереса) вокруг вас -\n• Отображение специализированных онлайн тайлов, спутниковые снимки (от Bing), различные наложения, такие как туристические/навигационные GPX треки и дополнительные слои с настраиваемой прозрачностью + Просмотр карты +\n• Отображение вашего местоположения и ориентации +\n• Возможность ориентирования карты по компасу или по направлению вашего движения +\n• Сохранение ваших самых важных мест в качестве избранных +\n• Отображение POI (точек интереса) вокруг вас +\n• Отображение специализированных онлайн-тайлов, спутниковые снимки (от Bing), различные наложения, такие как туристические/навигационные GPX треки и дополнительные слои с настраиваемой прозрачностью \n• Возможность отображения географических названий на английском, местном или фонетическом написании \n Экран %d @@ -3414,7 +3414,7 @@ Канатная дорога Соединение Симулировать свою позицию используя записанный GPX трек. - Начальная точка + Начало маршрута Вернуться Эти карты необходимо использовать с плагином. Добавленные профили diff --git a/OsmAnd/res/values-sr/strings.xml b/OsmAnd/res/values-sr/strings.xml index 218a6e9b92..5b6be8d957 100644 --- a/OsmAnd/res/values-sr/strings.xml +++ b/OsmAnd/res/values-sr/strings.xml @@ -1646,8 +1646,8 @@ Праћење на мрежи (потребан GPX) Започни праћење на мрежи Заустави праћење на мрежи - Надтави GPX бележење - Паузирај GPX бележење + Настави GPX бележење + Заустави GPX бележење Одаберите GPX фајл дугим притискањем. Кинески Португалски (бразилски) @@ -3489,7 +3489,7 @@ %1$s/%2$s Сунце залази у %1$s Сунце излази у %1$s - Режим приступачности је искључен на вашем Андроид систему. + Режим приступачности је искључен на Вашем Андроид систему. Користи системско време одлагања гашења екрана Подразумевано је искључено: Док OsmAnd ради у предњем плану, екран неће да се гаси. \n diff --git a/OsmAnd/src/net/osmand/plus/routing/RouteCalculationResult.java b/OsmAnd/src/net/osmand/plus/routing/RouteCalculationResult.java index 6ac55e7592..46ceaf70ea 100644 --- a/OsmAnd/src/net/osmand/plus/routing/RouteCalculationResult.java +++ b/OsmAnd/src/net/osmand/plus/routing/RouteCalculationResult.java @@ -493,9 +493,9 @@ public class RouteCalculationResult { Location current = locations.get(i); float bearing = current.bearingTo(next); // try to get close to current location if possible - while(prevBearingLocation < i - 1){ - if(locations.get(prevBearingLocation + 1).distanceTo(current) > 70){ - prevBearingLocation ++; + while (prevBearingLocation < i - 1) { + if (locations.get(prevBearingLocation + 1).distanceTo(current) > 70) { + prevBearingLocation++; } else { break; }