From c29ed71fc64ac9d66024406582e6865e90a3e109 Mon Sep 17 00:00:00 2001 From: Victor Shcherb Date: Fri, 1 Jan 2021 14:32:30 +0100 Subject: [PATCH 01/37] Small refactoring --- .../osmand/plus/routing/RoutingHelper.java | 68 +++++++++++++++---- .../plus/routing/RoutingHelperUtils.java | 46 +++---------- ...ecalculateRouteInDeviationBottomSheet.java | 4 +- .../fragments/RouteParametersFragment.java | 2 +- 4 files changed, 65 insertions(+), 55 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java b/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java index 4b822fa64a..58cffca7f0 100644 --- a/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java +++ b/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java @@ -17,6 +17,7 @@ import net.osmand.plus.OsmandPlugin; import net.osmand.plus.R; import net.osmand.plus.TargetPointsHelper; import net.osmand.plus.TargetPointsHelper.TargetPoint; +import net.osmand.plus.helpers.enums.MetricsConstants; import net.osmand.plus.notifications.OsmandNotification.NotificationType; import net.osmand.plus.routing.RouteCalculationResult.NextDirectionInfo; import net.osmand.plus.routing.RouteProvider.GPXRouteParamsBuilder; @@ -29,7 +30,6 @@ import net.osmand.router.RouteExporter; import net.osmand.router.RoutePlannerFrontEnd.GpxPoint; import net.osmand.router.RoutePlannerFrontEnd.GpxRouteApproximation; import net.osmand.router.RouteSegmentResult; -import net.osmand.util.Algorithms; import net.osmand.util.MapUtils; import java.io.IOException; @@ -43,10 +43,15 @@ public class RoutingHelper { private static final org.apache.commons.logging.Log log = PlatformUtil.getLog(RoutingHelper.class); - public static final float ALLOWED_DEVIATION = 2; + // Used to 1) calculate current closest segment of the route during navigation + // 2) calculate max allowed deviation before route recalculation + private static final float POSITION_TOLERANCE = 60; + private static final float POS_TOLERANCE_DEVIATION_MULTIPLIER = 2; + // This should be correlated with RoutingHelper.updateCurrentRouteStatus ( when processed turn now is not announced) private static final int DEFAULT_GPS_TOLERANCE = 12; + // TODO make private public static int GPS_TOLERANCE = DEFAULT_GPS_TOLERANCE; public static float ARRIVAL_DISTANCE_FACTOR = 1; @@ -413,7 +418,7 @@ public class RoutingHelper { isDeviatedFromRoute = false; return locationProjection; } - float posTolerance = RoutingHelperUtils.getPosTolerance(currentLocation.hasAccuracy() ? currentLocation.getAccuracy() : 0); + float posTolerance = getPosTolerance(currentLocation.hasAccuracy() ? currentLocation.getAccuracy() : 0); boolean calculateRoute = false; synchronized (this) { isDeviatedFromRoute = false; @@ -432,7 +437,7 @@ public class RoutingHelper { int currentRoute = route.currentRoute; double allowableDeviation = route.getRouteRecalcDistance(); if (allowableDeviation == 0) { - allowableDeviation = RoutingHelperUtils.getDefaultAllowedDeviation(settings, route.getAppMode(), posTolerance); + allowableDeviation = RoutingHelper.getDefaultAllowedDeviation(settings, route.getAppMode(), posTolerance); } // 2. Analyze if we need to recalculate route @@ -478,15 +483,7 @@ public class RoutingHelper { // calculate projection of current location if (currentRoute > 0) { - locationProjection = new Location(currentLocation); - Location nextLocation = routeNodes.get(currentRoute); - LatLon project = RoutingHelperUtils.getProject(currentLocation, routeNodes.get(currentRoute - 1), routeNodes.get(currentRoute)); - - locationProjection.setLatitude(project.getLatitude()); - locationProjection.setLongitude(project.getLongitude()); - // we need to update bearing too - float bearingTo = locationProjection.bearingTo(nextLocation); - locationProjection.setBearing(bearingTo); + locationProjection = RoutingHelperUtils.getProject(currentLocation, routeNodes.get(currentRoute - 1), routeNodes.get(currentRoute)); } } lastFixedLocation = currentLocation; @@ -571,7 +568,7 @@ public class RoutingHelper { // 2. check if intermediate found if (route.getIntermediatePointsToPass() > 0 - && route.getDistanceToNextIntermediate(lastFixedLocation) < RoutingHelperUtils.getArrivalDistance(mode, settings) * 2f && !isRoutePlanningMode) { + && route.getDistanceToNextIntermediate(lastFixedLocation) < getArrivalDistance(mode, settings) * 2f && !isRoutePlanningMode) { showMessage(app.getString(R.string.arrived_at_intermediate_point)); route.passIntermediatePoint(); TargetPointsHelper targets = app.getTargetPointsHelper(); @@ -603,7 +600,7 @@ public class RoutingHelper { // 3. check if destination found Location lastPoint = routeNodes.get(routeNodes.size() - 1); if (currentRoute > routeNodes.size() - 3 - && currentLocation.distanceTo(lastPoint) < RoutingHelperUtils.getArrivalDistance(mode, settings) + && currentLocation.distanceTo(lastPoint) < getArrivalDistance(mode, settings) && !isRoutePlanningMode) { //showMessage(app.getString(R.string.arrived_at_destination)); TargetPointsHelper targets = app.getTargetPointsHelper(); @@ -672,6 +669,47 @@ public class RoutingHelper { return false; } + float getArrivalDistance(ApplicationMode mode, OsmandSettings settings) { + ApplicationMode m = mode == null ? settings.getApplicationMode() : mode; + float defaultSpeed = Math.max(0.3f, m.getDefaultSpeed()); + + /// Used to be: car - 90 m, bicycle - 50 m, pedestrian - 20 m + // return ((float)settings.getApplicationMode().getArrivalDistance()) * settings.ARRIVAL_DISTANCE_FACTOR.getModeValue(m); + // GPS_TOLERANCE - 12 m + // 5 seconds: car - 80 m @ 50 kmh, bicyle - 45 m @ 25 km/h, bicyle - 25 m @ 10 km/h, pedestrian - 18 m @ 4 km/h, + return RoutingHelper.GPS_TOLERANCE + defaultSpeed * 5 * RoutingHelper.ARRIVAL_DISTANCE_FACTOR; + } + + private static float getPosTolerance(float accuracy) { + if (accuracy > 0) { + return POSITION_TOLERANCE / 2 + accuracy; + } + return POSITION_TOLERANCE; + } + + private static float getDefaultAllowedDeviation(OsmandSettings settings, ApplicationMode mode, float posTolerance) { + if (settings.DISABLE_OFFROUTE_RECALC.getModeValue(mode)) { + return -1.0f; + } else if (mode.getRouteService() == RouteProvider.RouteService.DIRECT_TO) { + return -1.0f; + } else if (mode.getRouteService() == RouteProvider.RouteService.STRAIGHT) { + MetricsConstants mc = settings.METRIC_SYSTEM.getModeValue(mode); + if (mc == MetricsConstants.KILOMETERS_AND_METERS || mc == MetricsConstants.MILES_AND_METERS) { + return 500.f; + } else { + // 1/4 mile + return 482.f; + } + } + return posTolerance * POS_TOLERANCE_DEVIATION_MULTIPLIER; + } + + public static float getDefaultAllowedDeviationAccuracy(OsmandSettings settings, ApplicationMode mode) { + return getDefaultAllowedDeviation(settings, mode, getPosTolerance(0)); + } + + + private void fireRoutingDataUpdateEvent() { if (!updateListeners.isEmpty()) { ArrayList> tmp = new ArrayList<>(updateListeners); diff --git a/OsmAnd/src/net/osmand/plus/routing/RoutingHelperUtils.java b/OsmAnd/src/net/osmand/plus/routing/RoutingHelperUtils.java index c696c13585..b756238eca 100644 --- a/OsmAnd/src/net/osmand/plus/routing/RoutingHelperUtils.java +++ b/OsmAnd/src/net/osmand/plus/routing/RoutingHelperUtils.java @@ -17,7 +17,6 @@ import java.util.List; public class RoutingHelperUtils { - private static final float POSITION_TOLERANCE = 60; private static final int CACHE_RADIUS = 100000; @NonNull @@ -66,10 +65,17 @@ public class RoutingHelperUtils { return rect.left == 0 && rect.right == 0 ? null : rect; } - static LatLon getProject(Location loc, Location from, Location to) { - return MapUtils.getProjection(loc.getLatitude(), + static Location getProject(Location loc, Location from, Location to) { + LatLon project = MapUtils.getProjection(loc.getLatitude(), loc.getLongitude(), from.getLatitude(), from.getLongitude(), to.getLatitude(), to.getLongitude()); + Location locationProjection = new Location(loc); + locationProjection.setLatitude(project.getLatitude()); + locationProjection.setLongitude(project.getLongitude()); + // we need to update bearing too + float bearingTo = locationProjection.bearingTo(to); + locationProjection.setBearing(bearingTo); + return locationProjection; } static double getOrthogonalDistance(Location loc, Location from, Location to) { @@ -94,30 +100,6 @@ public class RoutingHelperUtils { return index; } - public static float getPosTolerance(float accuracy) { - if (accuracy > 0) { - return POSITION_TOLERANCE / 2 + accuracy; - } - return POSITION_TOLERANCE; - } - - public static float getDefaultAllowedDeviation(OsmandSettings settings, ApplicationMode mode, float posTolerance) { - if (settings.DISABLE_OFFROUTE_RECALC.getModeValue(mode)) { - return -1.0f; - } else if (mode.getRouteService() == RouteProvider.RouteService.DIRECT_TO) { - return -1.0f; - } else if (mode.getRouteService() == RouteProvider.RouteService.STRAIGHT) { - MetricsConstants mc = settings.METRIC_SYSTEM.getModeValue(mode); - if (mc == MetricsConstants.KILOMETERS_AND_METERS || mc == MetricsConstants.MILES_AND_METERS) { - return 500.f; - } else { - // 1/4 mile - return 482.f; - } - } - return posTolerance * RoutingHelper.ALLOWED_DEVIATION; - } - /** * Wrong movement direction is considered when between * current location bearing (determines by 2 last fixed position or provided) @@ -181,16 +163,6 @@ public class RoutingHelperUtils { return isOffRoute; } - static float getArrivalDistance(ApplicationMode mode, OsmandSettings settings) { - ApplicationMode m = mode == null ? settings.getApplicationMode() : mode; - float defaultSpeed = Math.max(0.3f, m.getDefaultSpeed()); - - /// Used to be: car - 90 m, bicycle - 50 m, pedestrian - 20 m - // return ((float)settings.getApplicationMode().getArrivalDistance()) * settings.ARRIVAL_DISTANCE_FACTOR.getModeValue(m); - // GPS_TOLERANCE - 12 m - // 5 seconds: car - 80 m @ 50 kmh, bicyle - 45 m @ 25 km/h, bicyle - 25 m @ 10 km/h, pedestrian - 18 m @ 4 km/h, - return RoutingHelper.GPS_TOLERANCE + defaultSpeed * 5 * RoutingHelper.ARRIVAL_DISTANCE_FACTOR; - } public static void checkAndUpdateStartLocation(@NonNull OsmandApplication app, LatLon newStartLocation) { if (newStartLocation != null) { diff --git a/OsmAnd/src/net/osmand/plus/settings/bottomsheets/RecalculateRouteInDeviationBottomSheet.java b/OsmAnd/src/net/osmand/plus/settings/bottomsheets/RecalculateRouteInDeviationBottomSheet.java index 40f6889397..d3bdf98ee5 100644 --- a/OsmAnd/src/net/osmand/plus/settings/bottomsheets/RecalculateRouteInDeviationBottomSheet.java +++ b/OsmAnd/src/net/osmand/plus/settings/bottomsheets/RecalculateRouteInDeviationBottomSheet.java @@ -15,6 +15,7 @@ import com.google.android.material.slider.Slider; import net.osmand.AndroidUtils; import net.osmand.plus.helpers.enums.MetricsConstants; +import net.osmand.plus.routing.RoutingHelper; import net.osmand.plus.routing.RoutingHelperUtils; import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.plus.OsmAndFormatter; @@ -207,8 +208,7 @@ public class RecalculateRouteInDeviationBottomSheet extends BooleanPreferenceBot } private void getDefaultValue() { - currentValue = RoutingHelperUtils.getDefaultAllowedDeviation(settings, appMode, - RoutingHelperUtils.getPosTolerance(0)); + currentValue = RoutingHelper.getDefaultAllowedDeviationAccuracy(settings, appMode); } private int findIndexOfValue(float allowedValue) { diff --git a/OsmAnd/src/net/osmand/plus/settings/fragments/RouteParametersFragment.java b/OsmAnd/src/net/osmand/plus/settings/fragments/RouteParametersFragment.java index b0e0ad0639..f7978aed47 100644 --- a/OsmAnd/src/net/osmand/plus/settings/fragments/RouteParametersFragment.java +++ b/OsmAnd/src/net/osmand/plus/settings/fragments/RouteParametersFragment.java @@ -479,7 +479,7 @@ public class RouteParametersFragment extends BaseSettingsFragment implements OnP float allowedValue = settings.ROUTE_RECALCULATION_DISTANCE.getModeValue(appMode); boolean enabled = allowedValue != DISABLE_MODE; if (allowedValue <= 0) { - allowedValue = RoutingHelperUtils.getDefaultAllowedDeviation(settings, appMode, RoutingHelperUtils.getPosTolerance(0)); + allowedValue = RoutingHelper.getDefaultAllowedDeviationAccuracy(settings, appMode); } String summary = String.format(getString(R.string.ltr_or_rtl_combine_via_bold_point), enabled ? getString(R.string.shared_string_enabled) : getString(R.string.shared_string_disabled), From 16b79b5cee013de1263eddf23b739dc14b5cdeb9 Mon Sep 17 00:00:00 2001 From: Victor Shcherb Date: Fri, 1 Jan 2021 14:48:52 +0100 Subject: [PATCH 02/37] Update default speed for voice router for car to take into account setting and have minimum speed --- .../net/osmand/plus/routing/RoutingHelper.java | 15 ++++++++------- .../src/net/osmand/plus/routing/VoiceRouter.java | 13 +++++-------- .../RecalculateRouteInDeviationBottomSheet.java | 3 +-- .../fragments/RouteParametersFragment.java | 3 +-- 4 files changed, 15 insertions(+), 19 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java b/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java index 58cffca7f0..07482366de 100644 --- a/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java +++ b/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java @@ -43,12 +43,13 @@ public class RoutingHelper { private static final org.apache.commons.logging.Log log = PlatformUtil.getLog(RoutingHelper.class); - // Used to 1) calculate current closest segment of the route during navigation - // 2) calculate max allowed deviation before route recalculation - private static final float POSITION_TOLERANCE = 60; + // POS_TOLERANCE + // 1) calculate current closest segment of the route during navigation + // 2) identify u-turn, projected distance + // 3) calculate max allowed deviation before route recalculation * multiplier + private static final float POS_TOLERANCE = 60; // 60m or 30m + accuracy private static final float POS_TOLERANCE_DEVIATION_MULTIPLIER = 2; - // This should be correlated with RoutingHelper.updateCurrentRouteStatus ( when processed turn now is not announced) private static final int DEFAULT_GPS_TOLERANCE = 12; // TODO make private @@ -682,9 +683,9 @@ public class RoutingHelper { private static float getPosTolerance(float accuracy) { if (accuracy > 0) { - return POSITION_TOLERANCE / 2 + accuracy; + return POS_TOLERANCE / 2 + accuracy; } - return POSITION_TOLERANCE; + return POS_TOLERANCE; } private static float getDefaultAllowedDeviation(OsmandSettings settings, ApplicationMode mode, float posTolerance) { @@ -704,7 +705,7 @@ public class RoutingHelper { return posTolerance * POS_TOLERANCE_DEVIATION_MULTIPLIER; } - public static float getDefaultAllowedDeviationAccuracy(OsmandSettings settings, ApplicationMode mode) { + public static float getDefaultAllowedDeviation(OsmandSettings settings, ApplicationMode mode) { return getDefaultAllowedDeviation(settings, mode, getPosTolerance(0)); } diff --git a/OsmAnd/src/net/osmand/plus/routing/VoiceRouter.java b/OsmAnd/src/net/osmand/plus/routing/VoiceRouter.java index 86523b6a49..996a6b825a 100644 --- a/OsmAnd/src/net/osmand/plus/routing/VoiceRouter.java +++ b/OsmAnd/src/net/osmand/plus/routing/VoiceRouter.java @@ -72,7 +72,9 @@ public class VoiceRouter { private long lastAnnouncement = 0; // Default speed to have comfortable announcements (Speed in m/s) - private float DEFAULT_SPEED = 12; + // initial value is updated from default speed settings anyway + private float DEFAULT_SPEED = 10; + // TODO review turn now speed private float TURN_NOW_SPEED; private int PREPARE_LONG_DISTANCE; @@ -181,13 +183,8 @@ public class VoiceRouter { public void updateAppMode() { ApplicationMode appMode = router.getAppMode() == null ? settings.getApplicationMode() : router.getAppMode(); if (appMode.isDerivedRoutingFrom(ApplicationMode.CAR)) { - // could be changed in future as others by default in settings is 45 kmh - DEFAULT_SPEED = 14; // ~50 km/h - //DEFAULT speed is configurable -// } else if (router.getAppMode().isDerivedRoutingFrom(ApplicationMode.BICYCLE)) { -// DEFAULT_SPEED = 2.77f; // 10 km/h -// } else if (router.getAppMode().isDerivedRoutingFrom(ApplicationMode.PEDESTRIAN)) { -// DEFAULT_SPEED = 1.11f; //4 km/h 2f; // 7,2 km/h + // keep it as minimum 30 kmh for voice announcement + DEFAULT_SPEED = (float) Math.max(8, appMode.getDefaultSpeed()); } else { // minimal is 1 meter for turn now DEFAULT_SPEED = (float) Math.max(0.3, appMode.getDefaultSpeed()); diff --git a/OsmAnd/src/net/osmand/plus/settings/bottomsheets/RecalculateRouteInDeviationBottomSheet.java b/OsmAnd/src/net/osmand/plus/settings/bottomsheets/RecalculateRouteInDeviationBottomSheet.java index d3bdf98ee5..c270ea0ed8 100644 --- a/OsmAnd/src/net/osmand/plus/settings/bottomsheets/RecalculateRouteInDeviationBottomSheet.java +++ b/OsmAnd/src/net/osmand/plus/settings/bottomsheets/RecalculateRouteInDeviationBottomSheet.java @@ -16,7 +16,6 @@ import com.google.android.material.slider.Slider; import net.osmand.AndroidUtils; import net.osmand.plus.helpers.enums.MetricsConstants; import net.osmand.plus.routing.RoutingHelper; -import net.osmand.plus.routing.RoutingHelperUtils; import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.plus.OsmAndFormatter; import net.osmand.plus.OsmandApplication; @@ -208,7 +207,7 @@ public class RecalculateRouteInDeviationBottomSheet extends BooleanPreferenceBot } private void getDefaultValue() { - currentValue = RoutingHelper.getDefaultAllowedDeviationAccuracy(settings, appMode); + currentValue = RoutingHelper.getDefaultAllowedDeviation(settings, appMode); } private int findIndexOfValue(float allowedValue) { diff --git a/OsmAnd/src/net/osmand/plus/settings/fragments/RouteParametersFragment.java b/OsmAnd/src/net/osmand/plus/settings/fragments/RouteParametersFragment.java index f7978aed47..d3d9ef2d93 100644 --- a/OsmAnd/src/net/osmand/plus/settings/fragments/RouteParametersFragment.java +++ b/OsmAnd/src/net/osmand/plus/settings/fragments/RouteParametersFragment.java @@ -33,7 +33,6 @@ import net.osmand.plus.UiUtilities; import net.osmand.plus.Version; import net.osmand.plus.routing.RouteProvider; import net.osmand.plus.routing.RoutingHelper; -import net.osmand.plus.routing.RoutingHelperUtils; import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.plus.settings.backend.BooleanPreference; import net.osmand.plus.settings.backend.CommonPreference; @@ -479,7 +478,7 @@ public class RouteParametersFragment extends BaseSettingsFragment implements OnP float allowedValue = settings.ROUTE_RECALCULATION_DISTANCE.getModeValue(appMode); boolean enabled = allowedValue != DISABLE_MODE; if (allowedValue <= 0) { - allowedValue = RoutingHelper.getDefaultAllowedDeviationAccuracy(settings, appMode); + allowedValue = RoutingHelper.getDefaultAllowedDeviation(settings, appMode); } String summary = String.format(getString(R.string.ltr_or_rtl_combine_via_bold_point), enabled ? getString(R.string.shared_string_enabled) : getString(R.string.shared_string_disabled), From 3a3b734e58312d76949ef72f08c956452142b733 Mon Sep 17 00:00:00 2001 From: Victor Shcherb Date: Fri, 1 Jan 2021 15:50:18 +0100 Subject: [PATCH 03/37] Preparation --- .../osmand/plus/routing/RoutingHelper.java | 2 +- .../net/osmand/plus/routing/VoiceRouter.java | 27 ++++++++++--------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java b/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java index 07482366de..3e6d8b81fd 100644 --- a/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java +++ b/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java @@ -677,7 +677,7 @@ public class RoutingHelper { /// Used to be: car - 90 m, bicycle - 50 m, pedestrian - 20 m // return ((float)settings.getApplicationMode().getArrivalDistance()) * settings.ARRIVAL_DISTANCE_FACTOR.getModeValue(m); // GPS_TOLERANCE - 12 m - // 5 seconds: car - 80 m @ 50 kmh, bicyle - 45 m @ 25 km/h, bicyle - 25 m @ 10 km/h, pedestrian - 18 m @ 4 km/h, + // 5 seconds: car - 80 m @ 50 kmh, bicycle - 45 m @ 25 km/h, bicycle - 25 m @ 10 km/h, pedestrian - 18 m @ 4 km/h, return RoutingHelper.GPS_TOLERANCE + defaultSpeed * 5 * RoutingHelper.ARRIVAL_DISTANCE_FACTOR; } diff --git a/OsmAnd/src/net/osmand/plus/routing/VoiceRouter.java b/OsmAnd/src/net/osmand/plus/routing/VoiceRouter.java index 996a6b825a..511aafcd77 100644 --- a/OsmAnd/src/net/osmand/plus/routing/VoiceRouter.java +++ b/OsmAnd/src/net/osmand/plus/routing/VoiceRouter.java @@ -73,8 +73,7 @@ public class VoiceRouter { // Default speed to have comfortable announcements (Speed in m/s) // initial value is updated from default speed settings anyway - private float DEFAULT_SPEED = 10; - // TODO review turn now speed + private float DEFAULT_SPEED = 10; private float TURN_NOW_SPEED; private int PREPARE_LONG_DISTANCE; @@ -189,20 +188,18 @@ public class VoiceRouter { // minimal is 1 meter for turn now DEFAULT_SPEED = (float) Math.max(0.3, appMode.getDefaultSpeed()); } + // Calculate minimal distance / time to announce turns, so time to turn is always >= ETALON_TIME + // Distance < ETALON_DIST or TIME_WITH_CURRENT_SPEED < ETALON_TIME_DEFAULT_SPEED - - // Do not play [issue 1411]: prepare_long_distance warning not needed, used only for goAhead prompt // 300 sec: 4 200 - 3 500 m - car [ 115 - 95 sec @ 120 km/h] PREPARE_LONG_DISTANCE = (int) (DEFAULT_SPEED * 300); PREPARE_LONG_DISTANCE_END = (int) (DEFAULT_SPEED * 250) ; - if (DEFAULT_SPEED < 30) { -// if (PREPARE_LONG_DISTANCE_END - PREPARE_DISTANCE < 4000) { // Play only for high speed vehicle with speed > 110 km/h - PREPARE_DISTANCE_END = PREPARE_DISTANCE * 2; + // [issue 1411] - used only for goAhead prompt + PREPARE_LONG_DISTANCE_END = PREPARE_LONG_DISTANCE * 2; } - // *#8749: Here the change for bicycle: 40-30 sec, 200-150 m -> 115-90 sec, 320-250m [ need to be tested ] // 115 sec: 1 500 m - car [45 sec @ 120 km/h], 320 m - bicycle [45 sec @ 25 km/h], 230 m - pedestrian PREPARE_DISTANCE = (int) (DEFAULT_SPEED * 115); // 90 sec: 1 200 m - car, 250 m - bicycle [36 sec @ 25 km/h], @@ -213,9 +210,10 @@ public class VoiceRouter { // 15 sec: 210 m - car, 40 m - bicycle, 30 m - pedestrian TURN_IN_DISTANCE_END = (int) (DEFAULT_SPEED * 15); - // same as speed < 150/(90-22) m/s = 2.2 m/s = 8 km/h + // Do not play prepare: for pedestrian and slow transport + // same check as speed < 150/(90-22) m/s = 2.2 m/s = 8 km/h + // if (DEFAULT_SPEED < 2.3) { if (PREPARE_DISTANCE_END - TURN_IN_DISTANCE < 150) { - // Do not play: for pedestrian and slow transport PREPARE_DISTANCE_END = PREPARE_DISTANCE * 2; } @@ -223,13 +221,16 @@ public class VoiceRouter { // float TURN_NOW_TIME = 7; // ** #8749 to keep 1m / 1 sec precision (GPS_TOLERANCE - 12 m) + // 1 kmh - 1 sec, 4 kmh - 2 sec (pedestrian), 10 kmh - 3 sec (*bicycle), 50 kmh - 7 sec (car) + float TURN_NOW_TIME = (float) Math.min(Math.sqrt(DEFAULT_SPEED * 3.6), 8); + + // test new: 50 kmh - 50 m (car), 10 kmh - 10 m (bike), 4 kmh - 4 m + // TURN_NOW_DISTANCE = (int) (TURN_NOW_TIME * DEFAULT_SPEED / 2); + // old value // 1 kmh - 1 m, 4 kmh - 4 m (pedestrian), 10 kmh - 10 m (bicycle), 50 kmh - 50 m (car) // TURN_NOW_DISTANCE = (int) (DEFAULT_SPEED * 3.6); // 3.6 sec // 50 kmh - 48 m (car), 10 kmh - 20 m, 4 kmh - 15 m, 1 kmh - 12 m TURN_NOW_DISTANCE = (int) (RoutingHelper.GPS_TOLERANCE + DEFAULT_SPEED * 2.5 * RoutingHelper.ARRIVAL_DISTANCE_FACTOR); // 3.6 sec - // 1 kmh - 1 sec, 4 kmh - 2 sec (pedestrian), 10 kmh - 3 sec (*bicycle), 50 kmh - 7 sec (car) - float TURN_NOW_TIME = (float) Math.min(Math.sqrt(DEFAULT_SPEED * 3.6), 8); - TURN_NOW_SPEED = TURN_NOW_DISTANCE / TURN_NOW_TIME; } From 494c7bc7069819f48bd91747d810331d3a6dabb1 Mon Sep 17 00:00:00 2001 From: Victor Shcherb Date: Fri, 1 Jan 2021 21:59:12 +0100 Subject: [PATCH 04/37] Code clean up: --- OsmAnd/src/net/osmand/plus/OsmandPlugin.java | 15 --------------- .../net/osmand/plus/routing/RoutingHelper.java | 15 ++++++--------- .../src/net/osmand/plus/routing/VoiceRouter.java | 3 ++- .../settings/backend/OsmAndAppCustomization.java | 3 --- 4 files changed, 8 insertions(+), 28 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/OsmandPlugin.java b/OsmAnd/src/net/osmand/plus/OsmandPlugin.java index 01203b6f72..af1570ecaa 100644 --- a/OsmAnd/src/net/osmand/plus/OsmandPlugin.java +++ b/OsmAnd/src/net/osmand/plus/OsmandPlugin.java @@ -519,10 +519,6 @@ public abstract class OsmandPlugin { } } - public boolean destinationReached() { - return true; - } - protected void registerLayerContextMenuActions(OsmandMapTileView mapView, ContextMenuAdapter adapter, MapActivity mapActivity) { } @@ -781,17 +777,6 @@ public abstract class OsmandPlugin { } } - public static boolean onDestinationReached() { - boolean b = true; - for (OsmandPlugin plugin : getEnabledPlugins()) { - if (!plugin.destinationReached()) { - b = false; - } - } - return b; - } - - public static void createLayers(OsmandMapTileView mapView, MapActivity activity) { for (OsmandPlugin plugin : getEnabledPlugins()) { plugin.registerLayers(activity); diff --git a/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java b/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java index 3e6d8b81fd..c7c1d87b8f 100644 --- a/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java +++ b/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java @@ -51,10 +51,9 @@ public class RoutingHelper { private static final float POS_TOLERANCE_DEVIATION_MULTIPLIER = 2; // This should be correlated with RoutingHelper.updateCurrentRouteStatus ( when processed turn now is not announced) - private static final int DEFAULT_GPS_TOLERANCE = 12; - // TODO make private - public static int GPS_TOLERANCE = DEFAULT_GPS_TOLERANCE; - public static float ARRIVAL_DISTANCE_FACTOR = 1; + public static final int DEFAULT_GPS_TOLERANCE = 12; + private static int GPS_TOLERANCE = DEFAULT_GPS_TOLERANCE; + private static float ARRIVAL_DISTANCE_FACTOR = 1; private List> listeners = new LinkedList<>(); private List> updateListeners = new LinkedList<>(); @@ -306,7 +305,6 @@ public class RoutingHelper { public void setAppMode(ApplicationMode mode) { this.mode = mode; ARRIVAL_DISTANCE_FACTOR = Math.max(settings.ARRIVAL_DISTANCE_FACTOR.getModeValue(mode), 0.1f); - GPS_TOLERANCE = (int) (DEFAULT_GPS_TOLERANCE * ARRIVAL_DISTANCE_FACTOR); voiceRouter.updateAppMode(); } @@ -569,7 +567,7 @@ public class RoutingHelper { // 2. check if intermediate found if (route.getIntermediatePointsToPass() > 0 - && route.getDistanceToNextIntermediate(lastFixedLocation) < getArrivalDistance(mode, settings) * 2f && !isRoutePlanningMode) { + && route.getDistanceToNextIntermediate(lastFixedLocation) < getArrivalDistance(mode, settings) && !isRoutePlanningMode) { showMessage(app.getString(R.string.arrived_at_intermediate_point)); route.passIntermediatePoint(); TargetPointsHelper targets = app.getTargetPointsHelper(); @@ -610,8 +608,7 @@ public class RoutingHelper { if (isFollowingMode) { voiceRouter.arrivedDestinationPoint(description); } - boolean onDestinationReached = OsmandPlugin.onDestinationReached(); - onDestinationReached &= app.getAppCustomization().onDestinationReached(); + boolean onDestinationReached = true; if (onDestinationReached) { clearCurrentRoute(null, null); setRoutePlanningMode(false); @@ -678,7 +675,7 @@ public class RoutingHelper { // return ((float)settings.getApplicationMode().getArrivalDistance()) * settings.ARRIVAL_DISTANCE_FACTOR.getModeValue(m); // GPS_TOLERANCE - 12 m // 5 seconds: car - 80 m @ 50 kmh, bicycle - 45 m @ 25 km/h, bicycle - 25 m @ 10 km/h, pedestrian - 18 m @ 4 km/h, - return RoutingHelper.GPS_TOLERANCE + defaultSpeed * 5 * RoutingHelper.ARRIVAL_DISTANCE_FACTOR; + return (DEFAULT_GPS_TOLERANCE + defaultSpeed * 5) * RoutingHelper.ARRIVAL_DISTANCE_FACTOR; } private static float getPosTolerance(float accuracy) { diff --git a/OsmAnd/src/net/osmand/plus/routing/VoiceRouter.java b/OsmAnd/src/net/osmand/plus/routing/VoiceRouter.java index 511aafcd77..1d62733760 100644 --- a/OsmAnd/src/net/osmand/plus/routing/VoiceRouter.java +++ b/OsmAnd/src/net/osmand/plus/routing/VoiceRouter.java @@ -230,7 +230,8 @@ public class VoiceRouter { // 1 kmh - 1 m, 4 kmh - 4 m (pedestrian), 10 kmh - 10 m (bicycle), 50 kmh - 50 m (car) // TURN_NOW_DISTANCE = (int) (DEFAULT_SPEED * 3.6); // 3.6 sec // 50 kmh - 48 m (car), 10 kmh - 20 m, 4 kmh - 15 m, 1 kmh - 12 m - TURN_NOW_DISTANCE = (int) (RoutingHelper.GPS_TOLERANCE + DEFAULT_SPEED * 2.5 * RoutingHelper.ARRIVAL_DISTANCE_FACTOR); // 3.6 sec + float factor = Math.max(settings.ARRIVAL_DISTANCE_FACTOR.getModeValue(appMode), 0.1f); + TURN_NOW_DISTANCE = (int) ((RoutingHelper.DEFAULT_GPS_TOLERANCE + DEFAULT_SPEED * 2.5) * factor); // 3.6 sec TURN_NOW_SPEED = TURN_NOW_DISTANCE / TURN_NOW_TIME; } diff --git a/OsmAnd/src/net/osmand/plus/settings/backend/OsmAndAppCustomization.java b/OsmAnd/src/net/osmand/plus/settings/backend/OsmAndAppCustomization.java index 742d9b26e1..2a7158ac11 100644 --- a/OsmAnd/src/net/osmand/plus/settings/backend/OsmAndAppCustomization.java +++ b/OsmAnd/src/net/osmand/plus/settings/backend/OsmAndAppCustomization.java @@ -227,9 +227,6 @@ public class OsmAndAppCustomization { return true; } - public boolean onDestinationReached() { - return true; - } @Nullable public Bitmap getNavDrawerLogo() { From 67e71c992b1c75ee4ab2f3e59624ea797129d098 Mon Sep 17 00:00:00 2001 From: Victor Shcherb Date: Fri, 1 Jan 2021 22:07:51 +0100 Subject: [PATCH 05/37] refactor to move vars to routing helper --- OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java b/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java index c7c1d87b8f..9254761083 100644 --- a/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java +++ b/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java @@ -52,7 +52,6 @@ public class RoutingHelper { // This should be correlated with RoutingHelper.updateCurrentRouteStatus ( when processed turn now is not announced) public static final int DEFAULT_GPS_TOLERANCE = 12; - private static int GPS_TOLERANCE = DEFAULT_GPS_TOLERANCE; private static float ARRIVAL_DISTANCE_FACTOR = 1; private List> listeners = new LinkedList<>(); @@ -528,8 +527,8 @@ public class RoutingHelper { } processed = true; } - } else if (newDist < dist || newDist < GPS_TOLERANCE / 2) { - // newDist < GPS_TOLERANCE (avoid distance 0 till next turn) + } else if (newDist < dist || newDist < posTolerance / 8) { + // newDist < posTolerance / 8 - 4-8 m (avoid distance 0 till next turn) if (dist > posTolerance) { processed = true; if (log.isDebugEnabled()) { From dba6af888aa4cd785c5f3f901b3136cbf481cf10 Mon Sep 17 00:00:00 2001 From: Victor Shcherb Date: Fri, 1 Jan 2021 22:15:47 +0100 Subject: [PATCH 06/37] Move arrival constants to voice router --- .../osmand/plus/routing/RoutingHelper.java | 23 ++------ .../net/osmand/plus/routing/VoiceRouter.java | 52 +++++++++++++------ 2 files changed, 39 insertions(+), 36 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java b/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java index 9254761083..03af123cc8 100644 --- a/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java +++ b/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java @@ -50,10 +50,6 @@ public class RoutingHelper { private static final float POS_TOLERANCE = 60; // 60m or 30m + accuracy private static final float POS_TOLERANCE_DEVIATION_MULTIPLIER = 2; - // This should be correlated with RoutingHelper.updateCurrentRouteStatus ( when processed turn now is not announced) - public static final int DEFAULT_GPS_TOLERANCE = 12; - private static float ARRIVAL_DISTANCE_FACTOR = 1; - private List> listeners = new LinkedList<>(); private List> updateListeners = new LinkedList<>(); private List> settingsListeners = new LinkedList<>(); @@ -303,7 +299,6 @@ public class RoutingHelper { public void setAppMode(ApplicationMode mode) { this.mode = mode; - ARRIVAL_DISTANCE_FACTOR = Math.max(settings.ARRIVAL_DISTANCE_FACTOR.getModeValue(mode), 0.1f); voiceRouter.updateAppMode(); } @@ -474,9 +469,7 @@ public class RoutingHelper { voiceRouter.interruptRouteCommands(); voiceRouterStopped = true; // Prevents excessive execution of stop() code } - if (distOrth > mode.getOffRouteDistance() * ARRIVAL_DISTANCE_FACTOR && !settings.DISABLE_OFFROUTE_RECALC.get()) { - voiceRouter.announceOffRoute(distOrth); - } + voiceRouter.announceOffRoute(distOrth); } // calculate projection of current location @@ -566,7 +559,7 @@ public class RoutingHelper { // 2. check if intermediate found if (route.getIntermediatePointsToPass() > 0 - && route.getDistanceToNextIntermediate(lastFixedLocation) < getArrivalDistance(mode, settings) && !isRoutePlanningMode) { + && route.getDistanceToNextIntermediate(lastFixedLocation) < voiceRouter.getArrivalDistance() && !isRoutePlanningMode) { showMessage(app.getString(R.string.arrived_at_intermediate_point)); route.passIntermediatePoint(); TargetPointsHelper targets = app.getTargetPointsHelper(); @@ -598,7 +591,7 @@ public class RoutingHelper { // 3. check if destination found Location lastPoint = routeNodes.get(routeNodes.size() - 1); if (currentRoute > routeNodes.size() - 3 - && currentLocation.distanceTo(lastPoint) < getArrivalDistance(mode, settings) + && currentLocation.distanceTo(lastPoint) < voiceRouter.getArrivalDistance() && !isRoutePlanningMode) { //showMessage(app.getString(R.string.arrived_at_destination)); TargetPointsHelper targets = app.getTargetPointsHelper(); @@ -666,16 +659,6 @@ public class RoutingHelper { return false; } - float getArrivalDistance(ApplicationMode mode, OsmandSettings settings) { - ApplicationMode m = mode == null ? settings.getApplicationMode() : mode; - float defaultSpeed = Math.max(0.3f, m.getDefaultSpeed()); - - /// Used to be: car - 90 m, bicycle - 50 m, pedestrian - 20 m - // return ((float)settings.getApplicationMode().getArrivalDistance()) * settings.ARRIVAL_DISTANCE_FACTOR.getModeValue(m); - // GPS_TOLERANCE - 12 m - // 5 seconds: car - 80 m @ 50 kmh, bicycle - 45 m @ 25 km/h, bicycle - 25 m @ 10 km/h, pedestrian - 18 m @ 4 km/h, - return (DEFAULT_GPS_TOLERANCE + defaultSpeed * 5) * RoutingHelper.ARRIVAL_DISTANCE_FACTOR; - } private static float getPosTolerance(float accuracy) { if (accuracy > 0) { diff --git a/OsmAnd/src/net/osmand/plus/routing/VoiceRouter.java b/OsmAnd/src/net/osmand/plus/routing/VoiceRouter.java index 1d62733760..58d9572aad 100644 --- a/OsmAnd/src/net/osmand/plus/routing/VoiceRouter.java +++ b/OsmAnd/src/net/osmand/plus/routing/VoiceRouter.java @@ -52,11 +52,16 @@ public class VoiceRouter { public static final String FROM_STREET_NAME = "fromStreetName"; public static final String FROM_DEST = "fromDest"; + // TODO combine into helper class + private static final int DEFAULT_GPS_TOLERANCE = 12; + private static float ARRIVAL_DISTANCE_FACTOR = 1; + protected CommandPlayer player; protected final OsmandApplication app; protected final RoutingHelper router; protected OsmandSettings settings; + private ApplicationMode appMode; private int currentStatus = STATUS_UNKNOWN; private boolean playedAndArriveAtTarget = false; @@ -90,6 +95,7 @@ public class VoiceRouter { private VoiceCommandPending pendingCommand = null; private RouteDirectionInfo nextRouteDirection; + public interface VoiceMessageListener { void onVoiceMessage(List listCommands, List played); } @@ -180,7 +186,8 @@ public class VoiceRouter { public void updateAppMode() { - ApplicationMode appMode = router.getAppMode() == null ? settings.getApplicationMode() : router.getAppMode(); + appMode = router.getAppMode() == null ? settings.getApplicationMode() : router.getAppMode(); + ARRIVAL_DISTANCE_FACTOR = Math.max(settings.ARRIVAL_DISTANCE_FACTOR.getModeValue(appMode), 0.1f); if (appMode.isDerivedRoutingFrom(ApplicationMode.CAR)) { // keep it as minimum 30 kmh for voice announcement DEFAULT_SPEED = (float) Math.max(8, appMode.getDefaultSpeed()); @@ -231,7 +238,7 @@ public class VoiceRouter { // TURN_NOW_DISTANCE = (int) (DEFAULT_SPEED * 3.6); // 3.6 sec // 50 kmh - 48 m (car), 10 kmh - 20 m, 4 kmh - 15 m, 1 kmh - 12 m float factor = Math.max(settings.ARRIVAL_DISTANCE_FACTOR.getModeValue(appMode), 0.1f); - TURN_NOW_DISTANCE = (int) ((RoutingHelper.DEFAULT_GPS_TOLERANCE + DEFAULT_SPEED * 2.5) * factor); // 3.6 sec + TURN_NOW_DISTANCE = (int) ((DEFAULT_GPS_TOLERANCE + DEFAULT_SPEED * 2.5) * factor); // 3.6 sec TURN_NOW_SPEED = TURN_NOW_DISTANCE / TURN_NOW_TIME; } @@ -289,22 +296,35 @@ public class VoiceRouter { private boolean statusNotPassed(int statusToCheck) { return currentStatus <= statusToCheck; } - + + public float getArrivalDistance() { + ApplicationMode m = appMode; + float defaultSpeed = Math.max(0.3f, m.getDefaultSpeed()); + + /// Used to be: car - 90 m, bicycle - 50 m, pedestrian - 20 m + // return ((float)settings.getApplicationMode().getArrivalDistance()) * settings.ARRIVAL_DISTANCE_FACTOR.getModeValue(m); + // GPS_TOLERANCE - 12 m + // 5 seconds: car - 80 m @ 50 kmh, bicycle - 45 m @ 25 km/h, bicycle - 25 m @ 10 km/h, pedestrian - 18 m @ 4 km/h, + return (DEFAULT_GPS_TOLERANCE + defaultSpeed * 5) * ARRIVAL_DISTANCE_FACTOR; + } + public void announceOffRoute(double dist) { - long ms = System.currentTimeMillis(); - if (waitAnnouncedOffRoute == 0 || ms - lastAnnouncedOffRoute > waitAnnouncedOffRoute) { - CommandBuilder p = getNewCommandPlayerToPlay(); - if (p != null) { - p.offRoute(dist); - announceBackOnRoute = true; + if (dist > appMode.getOffRouteDistance() * ARRIVAL_DISTANCE_FACTOR && !settings.DISABLE_OFFROUTE_RECALC.get()) { + long ms = System.currentTimeMillis(); + if (waitAnnouncedOffRoute == 0 || ms - lastAnnouncedOffRoute > waitAnnouncedOffRoute) { + CommandBuilder p = getNewCommandPlayerToPlay(); + if (p != null) { + p.offRoute(dist); + announceBackOnRoute = true; + } + play(p); + if (waitAnnouncedOffRoute == 0) { + waitAnnouncedOffRoute = 60000; + } else { + waitAnnouncedOffRoute *= 2.5; + } + lastAnnouncedOffRoute = ms; } - play(p); - if (waitAnnouncedOffRoute == 0) { - waitAnnouncedOffRoute = 60000; - } else { - waitAnnouncedOffRoute *= 2.5; - } - lastAnnouncedOffRoute = ms; } } From 4abaf5fa54f8de32be71844daa476d8c4043e25b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ordtrogen=20=C3=96vers=C3=A4ttning?= Date: Fri, 1 Jan 2021 22:31:55 +0000 Subject: [PATCH 07/37] Translated using Weblate (Swedish) Currently translated at 63.5% (2283 of 3590 strings) --- OsmAnd/res/values-sv/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd/res/values-sv/strings.xml b/OsmAnd/res/values-sv/strings.xml index fa8bc69b01..97e42d4886 100644 --- a/OsmAnd/res/values-sv/strings.xml +++ b/OsmAnd/res/values-sv/strings.xml @@ -2531,7 +2531,7 @@ Vänligen tillhandahåll fullständig kod Gamla \"Mapnik\'-stil standardrendering. Viktiga funktioner: Färger som liknar \"Mapnik\" stil. Högsdetaljsstil för turiständamål. Innehåller alla konfigurationsinställningar av standardstilen, dessutom: Visar så mycket detaljer som möjligt, i synnerhet alla vägar, stigar och andra sätt att resa. Tydliga visuella skillnader mellan olika vägtyper som påminner om många turistatlaser. Högkontrastfärger för utomhusbruk, dag- och nattläge. Stil för allmänna ändamål. Förenklad återgivning i tätbefolkade städer. Viktiga funktioner: höjdkurvor, rutter, ytkvalitet, tillträdeskontroll, farthinder, stigrendering enligt SAC-skala, vattensporter. - Öppna Wikipedia-länk på nätet + Öppna Wikipedia-länk online Länken kommer att öppnas i en webbläsare. Skaffa OsmAnd Live-prenumeration för att läsa Wikipedia och Wikivoyage-artiklar frånkopplad. Hur öppnar man länken? From c7edc7fd73881f212632a9a0f38eb2f239e99dc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20H=C3=A5ll?= Date: Fri, 1 Jan 2021 22:31:11 +0000 Subject: [PATCH 08/37] Translated using Weblate (Swedish) Currently translated at 63.5% (2283 of 3590 strings) --- OsmAnd/res/values-sv/strings.xml | 68 +++++++++++++++++++++++++++++++- 1 file changed, 66 insertions(+), 2 deletions(-) diff --git a/OsmAnd/res/values-sv/strings.xml b/OsmAnd/res/values-sv/strings.xml index 97e42d4886..d36a2b9a45 100644 --- a/OsmAnd/res/values-sv/strings.xml +++ b/OsmAnd/res/values-sv/strings.xml @@ -294,7 +294,7 @@ Du hittar din parkeringsplats och -tid på instrumentbrädan och i widgeten på Globala app-inställningar Ditt OSM-användarnamn Behövs för ändringar i openstreetmap.org. - Ditt OSM-lösenord + Lösenord Bakgrundsläge OsmAnd körs i bakgrunden medan skärmen är avstängd. Det finns inte tillräckligt med ledigt utrymme för att hämta %1$s MB (ledigt: %2$s). @@ -1486,7 +1486,7 @@ Long %2$s Undvik att korsa nationella gränser Höjdgräns Smart omräkning av rutt - Räkna om endast början av rutten för långa resor. + Räkna om endast början av färdvägen, användbart för längre resor. Ange tillåten fordonshöjd på rutter. Logga ut Inaktiverad @@ -2974,4 +2974,68 @@ Vänligen tillhandahåll fullständig kod Lägg till ett nytt segment OsmAnd profil Användarprofil + Rensa %1$s\? + Nytt insticksprogram tillagd + Stäng av + Profiler tillaggda av insticksprogram + Tillagda profiler + Dessa kartor erfordras av insticksprogrammet. + Föreslagna kartor + Kontrollera vilka popups, dialoger och notifieringar som OsmAnd visar under användning. + Dialoger och notifieringar + Kartnedladdningsdialog + Slå ihop segment + Visa cykelrutter längs nodnätverk + Nodnätverk + Inkludera rubrik + Lägg till ny profil \'%1$s\'\? + Personlig + Laddar ned %s + För öknar och andra glesbefolkade områden. Mer detaljerad. + Tät + Importera eller spela in spårfiler + Pausa inspelning av resa + Återuppta inspelning av resa + Utveckling + OsmAnd Live data + OsmAnd Live data + Dirigering i två steg för bilnavigation. + Logga in med OAuth för att använda OsmEdit funktioner + Logga in via OAuth + Rensa OpenStreetMap OAuth igenkänningstecken + Utloggad + Filen är redan importerad i OsmAnd + Använd en 2-fas A* dirigeringsalgoritm + Graf + %1$s data tillgänglig enbart på vägar, räkna ut en färdväg genom att använda \"Färdväg mellan punkter\" för att se grafer. + Vänligen vänta. +\nGrafen kommer bli tillgänglig efter att färdvägen omberäknats. + Lokala kartor + %1$s — %2$s + %1$s * %2$s + Kollektivtrafik + Tomrum + bekvämligheter + Speciell + Symboler + Resa + Lägg till minst 2 punkter + Idrott + Service + Nödsituation + Dessa inställningar för insticksmoduler är globala och appliceras för alla profiler + Logga in till OpenStreetMap + Logga in på OpenStreetMap.org + Logga in på OpenStreetMap + Användarnamn och lösenord + Konto + Markörhistorik + Inloggning + Hantera prenumeration + Klicka på knappen för att registrera en betalningsplan på Google Play för att åtruppta prenumerationen. + Prenumerationen på OsmAnd Live har + Prenumerationen på OsmAnd Live är pausad + Prenumerationen på OsmAnd Live är + Skicka GPX fil till OpenStreetMap + Ange taggar sepparerade med komma (,). \ No newline at end of file From 1dc796ac79479ffbc20e126544a3910e693b821d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20H=C3=A5ll?= Date: Fri, 1 Jan 2021 22:33:56 +0000 Subject: [PATCH 09/37] Translated using Weblate (Swedish) Currently translated at 63.5% (2283 of 3590 strings) --- OsmAnd/res/values-sv/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd/res/values-sv/strings.xml b/OsmAnd/res/values-sv/strings.xml index d36a2b9a45..982528dcd2 100644 --- a/OsmAnd/res/values-sv/strings.xml +++ b/OsmAnd/res/values-sv/strings.xml @@ -2531,7 +2531,7 @@ Vänligen tillhandahåll fullständig kod Gamla \"Mapnik\'-stil standardrendering. Viktiga funktioner: Färger som liknar \"Mapnik\" stil. Högsdetaljsstil för turiständamål. Innehåller alla konfigurationsinställningar av standardstilen, dessutom: Visar så mycket detaljer som möjligt, i synnerhet alla vägar, stigar och andra sätt att resa. Tydliga visuella skillnader mellan olika vägtyper som påminner om många turistatlaser. Högkontrastfärger för utomhusbruk, dag- och nattläge. Stil för allmänna ändamål. Förenklad återgivning i tätbefolkade städer. Viktiga funktioner: höjdkurvor, rutter, ytkvalitet, tillträdeskontroll, farthinder, stigrendering enligt SAC-skala, vattensporter. - Öppna Wikipedia-länk online + Öppna Wikipedia-länk på internet Länken kommer att öppnas i en webbläsare. Skaffa OsmAnd Live-prenumeration för att läsa Wikipedia och Wikivoyage-artiklar frånkopplad. Hur öppnar man länken? From ad71a022e7032e5c0b8816360ef14162010851d6 Mon Sep 17 00:00:00 2001 From: Temuri Doghonadze Date: Fri, 1 Jan 2021 17:24:57 +0000 Subject: [PATCH 10/37] Translated using Weblate (Georgian) Currently translated at 20.5% (738 of 3590 strings) --- OsmAnd/res/values-ka/strings.xml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/OsmAnd/res/values-ka/strings.xml b/OsmAnd/res/values-ka/strings.xml index 63ff651a4b..f0f96c138e 100644 --- a/OsmAnd/res/values-ka/strings.xml +++ b/OsmAnd/res/values-ka/strings.xml @@ -1237,4 +1237,12 @@ წთ სასრიალო ტურიზმი სნოუმობილი + სურათის დამატება + ახალი ანგარიშის შექმნა + სურათის არჩევა + რესურსები + ფაილის დაახლოებითი ზომაა + სეგმენტის დამატება + OsmAnd-ის პროფილი + პროფილი \ No newline at end of file From 4144aaa20ac6a434248be8a8d5207524c9470fd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1ns?= Date: Thu, 31 Dec 2020 16:03:36 +0000 Subject: [PATCH 11/37] Translated using Weblate (Galician) Currently translated at 99.8% (3586 of 3590 strings) --- OsmAnd/res/values-gl/strings.xml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/OsmAnd/res/values-gl/strings.xml b/OsmAnd/res/values-gl/strings.xml index 7bcde5c6c2..f096f64d68 100644 --- a/OsmAnd/res/values-gl/strings.xml +++ b/OsmAnd/res/values-gl/strings.xml @@ -3998,7 +3998,7 @@ Lon %2$s Engadir imaxe Rexistrarse no \nOpenPlaceReviews.org - As imaxes son fornecidas polo proxecto de datos abertos do OpenPlaceReviews.org. Para subir a túas imaxes precisas rexistrarte no sitio web. + As imaxes son fornecidas polo proxecto de datos abertos do OpenPlaceReviews.org. Para subir a túas imaxes precisas rexistrarte no seu sitio web. Crear nova conta Xa teño unha conta Historial de procura @@ -4042,4 +4042,12 @@ Lon %2$s \n \n Inverter todos os puntos + Escolle o perfil que será empregado ao iniciar a aplicación. + Usado por última vez + Preferir rutas de sendeirismo + Preferir rutas de sendeirismo + Permitir regatos e cunetas + Permitir regatos e cunetas + Permitir canles de auga intermitentes + Permitir canles de auga intermitentes \ No newline at end of file From 7ab7851b2768514fdb5817e38faca59485460b38 Mon Sep 17 00:00:00 2001 From: Oliver Date: Thu, 31 Dec 2020 20:53:19 +0000 Subject: [PATCH 12/37] Translated using Weblate (German) Currently translated at 99.9% (3880 of 3881 strings) --- OsmAnd/res/values-de/phrases.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/OsmAnd/res/values-de/phrases.xml b/OsmAnd/res/values-de/phrases.xml index b20f6b4092..028d5b5da0 100644 --- a/OsmAnd/res/values-de/phrases.xml +++ b/OsmAnd/res/values-de/phrases.xml @@ -3902,4 +3902,7 @@ Fahrzeugwaage Rangerstation Schwimmbereich + Fledermaustunnel + Fledermausbrücke + Wildwechsel \ No newline at end of file From 897cc71e7d24ad9ca74f1a195d86a580f95b0e0f Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Thu, 31 Dec 2020 09:55:59 +0000 Subject: [PATCH 13/37] Translated using Weblate (Ukrainian) Currently translated at 100.0% (3881 of 3881 strings) --- OsmAnd/res/values-uk/phrases.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/OsmAnd/res/values-uk/phrases.xml b/OsmAnd/res/values-uk/phrases.xml index 82e842588b..0d2506bab0 100644 --- a/OsmAnd/res/values-uk/phrases.xml +++ b/OsmAnd/res/values-uk/phrases.xml @@ -3887,4 +3887,7 @@ Громадська пральня Станція перевезення відходів Плавальний майданчик + Тунель кажанів + Міст кажанів + Переправа диких тварин \ No newline at end of file From 69776b06d3ec4118227e8002d54b53618cc826a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Babos=20G=C3=A1bor?= Date: Fri, 1 Jan 2021 16:36:38 +0000 Subject: [PATCH 14/37] Translated using Weblate (Hungarian) Currently translated at 99.9% (3878 of 3881 strings) --- OsmAnd/res/values-hu/phrases.xml | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/OsmAnd/res/values-hu/phrases.xml b/OsmAnd/res/values-hu/phrases.xml index 312ac3e5ee..29d3e11a5e 100644 --- a/OsmAnd/res/values-hu/phrases.xml +++ b/OsmAnd/res/values-hu/phrases.xml @@ -2176,7 +2176,7 @@ Leírás kerekesszékeseknek Leírás vakoknak Lépcső - Korlát + Korlát van Korlát nincs Rámpa Rámpa nincs @@ -2832,7 +2832,7 @@ Sárkányrepülés Hagyományos indiai (ájurvéda) Fekvőbeteg-ellátás - Vészhelyzet + Sürgősségi ellátás beváltható Páratartalom-mérő Vízforraló nincs @@ -2865,7 +2865,7 @@ Repüléstilalmi idő (siklórepüléshez) Vendégeknek szóló iránymutatás Vendégeknek szóló iránymutatás nincs - Vészhelyzet nincs + Sürgősségi ellátás nincs Híd száma Menza Útirányjelző tábla: erdőtag (RU) @@ -3317,7 +3317,7 @@ Roller Roller nem Teherautó - Teherautó nem + Teherautóval nem használható Parkolási díj Parkolási díj nincs Parkolási díj @@ -3891,4 +3891,7 @@ Vízmű Csöves kút Fürdésre kijelölt terület + Denevéralagút + Denevérhíd + Vadátjáró \ No newline at end of file From 243a1649b4a49dc22d09b6c99fe96209527f6f44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1ns?= Date: Thu, 31 Dec 2020 16:05:11 +0000 Subject: [PATCH 15/37] Translated using Weblate (Galician) Currently translated at 99.9% (3880 of 3881 strings) --- OsmAnd/res/values-gl/phrases.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/OsmAnd/res/values-gl/phrases.xml b/OsmAnd/res/values-gl/phrases.xml index df06bf6a08..9b32dbccb5 100644 --- a/OsmAnd/res/values-gl/phrases.xml +++ b/OsmAnd/res/values-gl/phrases.xml @@ -3891,4 +3891,8 @@ Vacinación: COVID19 Vacinación Base de salvavidas + Túnel para morcegos + Ponte para morcegos + Paso de fauna + Área de natación \ No newline at end of file From 8974251d94cc3607d8ce66fa0e9d7fd81edcfebd Mon Sep 17 00:00:00 2001 From: Franco Date: Thu, 31 Dec 2020 19:06:12 +0000 Subject: [PATCH 16/37] Translated using Weblate (Spanish (Argentina)) Currently translated at 100.0% (3881 of 3881 strings) --- OsmAnd/res/values-es-rAR/phrases.xml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/OsmAnd/res/values-es-rAR/phrases.xml b/OsmAnd/res/values-es-rAR/phrases.xml index 7aa4610509..38fd01127d 100644 --- a/OsmAnd/res/values-es-rAR/phrases.xml +++ b/OsmAnd/res/values-es-rAR/phrases.xml @@ -189,7 +189,7 @@ Biogás Hidrógeno líquido Electricidad - Estación vehícular de carga eléctrica + Estación de carga para vehículos eléctricos;Estación vehícular de carga eléctrica;Suministro para vehículos eléctricos Rampa de vehículos Aire comprimido Estacionamiento;Aparcamiento @@ -3905,4 +3905,8 @@ Estación de guardabosques Lavadero público de ropa Estación de transferencia de residuos + Túnel para murciélagos + Puente para murciélagos + Cruce de vida silvestre + Área de natación \ No newline at end of file From f6455bab3d0ffd940fbbc693f5c9623b17b429e7 Mon Sep 17 00:00:00 2001 From: Eduardo Addad de Oliveira Date: Thu, 31 Dec 2020 17:57:57 +0000 Subject: [PATCH 17/37] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (3881 of 3881 strings) --- OsmAnd/res/values-pt-rBR/phrases.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/OsmAnd/res/values-pt-rBR/phrases.xml b/OsmAnd/res/values-pt-rBR/phrases.xml index 53d09cabf8..d2656c04e1 100644 --- a/OsmAnd/res/values-pt-rBR/phrases.xml +++ b/OsmAnd/res/values-pt-rBR/phrases.xml @@ -3899,4 +3899,7 @@ Estação de transferência de resíduos Lavandaria pública Área de natação + Túnel para morcego + Ponte para morcego + Travessia de vida selvagem \ No newline at end of file From 1dab8cacadfba3bb8a225de062d5cdf2222519b3 Mon Sep 17 00:00:00 2001 From: Franco Date: Thu, 31 Dec 2020 19:07:26 +0000 Subject: [PATCH 18/37] Translated using Weblate (Spanish (American)) Currently translated at 100.0% (3881 of 3881 strings) --- OsmAnd/res/values-es-rUS/phrases.xml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/OsmAnd/res/values-es-rUS/phrases.xml b/OsmAnd/res/values-es-rUS/phrases.xml index b46dce884c..c33e501c94 100644 --- a/OsmAnd/res/values-es-rUS/phrases.xml +++ b/OsmAnd/res/values-es-rUS/phrases.xml @@ -189,7 +189,7 @@ Biogás Hidrógeno líquido Electricidad - Estación vehícular de carga eléctrica + Estación de carga para vehículos eléctricos;Estación vehícular de carga eléctrica;Suministro para vehículos eléctricos Rampa de vehículos Aire comprimido Estacionamiento;Aparcamiento @@ -3905,4 +3905,8 @@ Grifo Planta potabilizadora Pozo entubado + Túnel para murciélagos + Puente para murciélagos + Cruce de vida silvestre + Área de natación \ No newline at end of file From 07b0dccbe57530d1e6bd2729a44e64cd8c16abcc Mon Sep 17 00:00:00 2001 From: Verdulo Date: Thu, 31 Dec 2020 18:48:56 +0000 Subject: [PATCH 19/37] Translated using Weblate (Esperanto) Currently translated at 100.0% (3881 of 3881 strings) --- OsmAnd/res/values-eo/phrases.xml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/OsmAnd/res/values-eo/phrases.xml b/OsmAnd/res/values-eo/phrases.xml index 670f41c2be..8a4ea2f7c1 100644 --- a/OsmAnd/res/values-eo/phrases.xml +++ b/OsmAnd/res/values-eo/phrases.xml @@ -322,7 +322,7 @@ E85 biogaso elektro - Ŝargostacio + Ŝargostacio;shargostacio;sxargostacio;stacio de ŝargo;elektroaŭto;elektra aŭto;tesla Aŭtomobil-ripara fosaĵeto Taksistacio Baraĵo trakfina @@ -3891,4 +3891,8 @@ Oficejo de naturrezervejo Vestaĵ-lavejo (ĉe rivero) Stacio de rubmastrumado + Tunelo por vespertoj + Ponto por vespertoj + Trairejo por sovaĝaj bestoj + Naĝejo natura \ No newline at end of file From ee77be05b875d12df0faefe7402664c60cb3f782 Mon Sep 17 00:00:00 2001 From: Victor Shcherb Date: Sat, 2 Jan 2021 02:37:28 +0100 Subject: [PATCH 20/37] Finish refactoring - no changes in numbers --- .../osmand/plus/helpers/WaypointHelper.java | 40 ++-- .../plus/routing/CurrentStreetName.java | 4 +- .../net/osmand/plus/routing/VoiceRouter.java | 186 ++++------------- .../routing/data/AnnounceTimeDistances.java | 196 ++++++++++++++++++ .../settings/backend/ApplicationMode.java | 7 - 5 files changed, 262 insertions(+), 171 deletions(-) create mode 100644 OsmAnd/src/net/osmand/plus/routing/data/AnnounceTimeDistances.java diff --git a/OsmAnd/src/net/osmand/plus/helpers/WaypointHelper.java b/OsmAnd/src/net/osmand/plus/helpers/WaypointHelper.java index 7f20de3e60..26855ad129 100644 --- a/OsmAnd/src/net/osmand/plus/helpers/WaypointHelper.java +++ b/OsmAnd/src/net/osmand/plus/helpers/WaypointHelper.java @@ -33,6 +33,7 @@ import net.osmand.plus.routing.AlarmInfo; import net.osmand.plus.routing.AlarmInfo.AlarmInfoType; import net.osmand.plus.routing.RouteCalculationResult; import net.osmand.plus.routing.VoiceRouter; +import net.osmand.plus.routing.data.AnnounceTimeDistances; import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.util.MapUtils; @@ -46,6 +47,11 @@ import java.util.concurrent.ConcurrentHashMap; import gnu.trove.list.array.TIntArrayList; +import static net.osmand.plus.routing.data.AnnounceTimeDistances.STATE_LONG_ALARM_ANNOUNCE; +import static net.osmand.plus.routing.data.AnnounceTimeDistances.STATE_LONG_PNT_ANNOUNCE; +import static net.osmand.plus.routing.data.AnnounceTimeDistances.STATE_SHORT_ALARM_ANNOUNCE; +import static net.osmand.plus.routing.data.AnnounceTimeDistances.STATE_SHORT_PNT_ANNOUNCE; + // import android.widget.Toast; /** @@ -57,10 +63,6 @@ public class WaypointHelper { private int searchDeviationRadius = 500; private int poiSearchDeviationRadius = 100; - private static final int LONG_ANNOUNCE_RADIUS = 700; - private static final int SHORT_ANNOUNCE_RADIUS = 150; - private static final int ALARMS_ANNOUNCE_RADIUS = 150; - private static final int ALARMS_SHORT_ANNOUNCE_RADIUS = 100; // don't annoy users by lots of announcements private static final int APPROACH_POI_LIMIT = 1; @@ -167,6 +169,7 @@ public class WaypointHelper { list.clear(); } LocationPointWrapper found = null; + AnnounceTimeDistances atd = getVoiceRouter().getAnnounceTimeDistances(); for (int type = 0; type < locationPoints.size(); type++) { if (type == ALARMS || type == TARGETS) { continue; @@ -178,7 +181,8 @@ public class WaypointHelper { if (lp.get(kIterator).routeIndex < route.getCurrentRoute()) { // skip } else { - if (route.getDistanceToPoint(lwp.routeIndex) <= LONG_ANNOUNCE_RADIUS) { + if (atd.isTurnStateActive(0, + route.getDistanceToPoint(lwp.routeIndex), STATE_LONG_PNT_ANNOUNCE)) { if (found == null || found.routeIndex < lwp.routeIndex) { found = lwp; if (list != null) { @@ -205,6 +209,7 @@ public class WaypointHelper { AlarmInfo mostImportant = speedAlarm; int value = speedAlarm != null ? speedAlarm.updateDistanceAndGetPriority(0, 0) : Integer.MAX_VALUE; float speed = lastProjection != null && lastProjection.hasSpeed() ? lastProjection.getSpeed() : 0; + AnnounceTimeDistances atd = getVoiceRouter().getAnnounceTimeDistances(); if (ALARMS < pointsProgress.size()) { int kIterator = pointsProgress.get(ALARMS); List lp = locationPoints.get(ALARMS); @@ -221,7 +226,7 @@ public class WaypointHelper { inf.setFloatValue(route.getDistanceToPoint(inf.getLastLocationIndex())); } int d = route.getDistanceToPoint(inf.getLocationIndex()); - if (d > LONG_ANNOUNCE_RADIUS) { + if (!atd.isTurnStateActive(0, d, STATE_LONG_PNT_ANNOUNCE)) { break; } float time = speed > 0 ? d / speed : Integer.MAX_VALUE; @@ -371,6 +376,8 @@ public class WaypointHelper { pointsProgress.set(type, kIterator); VoiceRouter voiceRouter = getVoiceRouter(); + AnnounceTimeDistances atd = voiceRouter.getAnnounceTimeDistances(); + float atdSpeed = atd.getSpeed(lastKnownLocation); while (kIterator < lp.size()) { LocationPointWrapper lwp = lp.get(kIterator); if (type == ALARMS && lwp.routeIndex < currentRoute) { @@ -378,7 +385,8 @@ public class WaypointHelper { continue; } if (lwp.announce) { - if (route.getDistanceToPoint(lwp.routeIndex) > LONG_ANNOUNCE_RADIUS * 2) { + if (!atd.isTurnStateActive(atdSpeed, + route.getDistanceToPoint(lwp.routeIndex) / 2, STATE_LONG_PNT_ANNOUNCE)) { break; } LocationPoint point = lwp.point; @@ -386,33 +394,33 @@ public class WaypointHelper { point.getLatitude(), point.getLongitude()) - lwp.getDeviationDistance()); Integer state = locationPointsStates.get(point); if (state != null && state == ANNOUNCED_ONCE - && voiceRouter.isDistanceLess(lastKnownLocation.getSpeed(), d1, SHORT_ANNOUNCE_RADIUS)) { + && atd.isTurnStateActive(atdSpeed, d1, STATE_SHORT_PNT_ANNOUNCE)) { locationPointsStates.put(point, ANNOUNCED_DONE); announcePoints.add(lwp); } else if (type != ALARMS && (state == null || state == NOT_ANNOUNCED) - && voiceRouter.isDistanceLess(lastKnownLocation.getSpeed(), d1, LONG_ANNOUNCE_RADIUS)) { + && atd.isTurnStateActive(atdSpeed, d1, STATE_LONG_PNT_ANNOUNCE)) { locationPointsStates.put(point, ANNOUNCED_ONCE); approachPoints.add(lwp); } else if (type == ALARMS && (state == null || state == NOT_ANNOUNCED)) { AlarmInfo alarm = (AlarmInfo) point; AlarmInfoType t = alarm.getType(); int announceRadius; - boolean filter = false; + boolean filterCloseAlarms = false; switch (t) { case TRAFFIC_CALMING: - announceRadius = ALARMS_SHORT_ANNOUNCE_RADIUS; - filter = true; + announceRadius = STATE_SHORT_ALARM_ANNOUNCE; + filterCloseAlarms = true; break; default: - announceRadius = ALARMS_ANNOUNCE_RADIUS; + announceRadius = STATE_LONG_ALARM_ANNOUNCE; break; } - boolean proceed = voiceRouter.isDistanceLess(lastKnownLocation.getSpeed(), d1, announceRadius); - if (proceed && filter) { + boolean proceed = atd.isTurnStateActive(atdSpeed, d1, announceRadius); + if (proceed && filterCloseAlarms) { AlarmInfo lastAlarm = lastAnnouncedAlarms.get(t); if (lastAlarm != null) { double dist = MapUtils.getDistance(lastAlarm.getLatitude(), lastAlarm.getLongitude(), alarm.getLatitude(), alarm.getLongitude()); - if (dist < ALARMS_SHORT_ANNOUNCE_RADIUS) { + if (atd.isTurnStateActive(atdSpeed, dist, STATE_SHORT_ALARM_ANNOUNCE)) { locationPointsStates.put(point, ANNOUNCED_DONE); proceed = false; } diff --git a/OsmAnd/src/net/osmand/plus/routing/CurrentStreetName.java b/OsmAnd/src/net/osmand/plus/routing/CurrentStreetName.java index c21679ead3..9876bc9854 100644 --- a/OsmAnd/src/net/osmand/plus/routing/CurrentStreetName.java +++ b/OsmAnd/src/net/osmand/plus/routing/CurrentStreetName.java @@ -5,6 +5,7 @@ import androidx.annotation.NonNull; import net.osmand.Location; import net.osmand.binary.RouteDataObject; import net.osmand.plus.routing.RouteCalculationResult.NextDirectionInfo; +import net.osmand.plus.routing.data.AnnounceTimeDistances; import net.osmand.plus.settings.backend.OsmandSettings; import net.osmand.router.RouteSegmentResult; import net.osmand.router.TurnType; @@ -35,10 +36,11 @@ public class CurrentStreetName { if (l != null && l.hasSpeed()) { speed = l.getSpeed(); } + AnnounceTimeDistances adt = routingHelper.getVoiceRouter().getAnnounceTimeDistances(); boolean isSet = false; // 1. turn is imminent if (n.distanceTo > 0 && n.directionInfo != null && !n.directionInfo.getTurnType().isSkipToSpeak() && - routingHelper.getVoiceRouter().isDistanceLess(speed, n.distanceTo, routingHelper.getVoiceRouter().PREPARE_DISTANCE * 0.75f)) { + adt.isTurnStateActive(adt.getSpeed(l), n.distanceTo * 1.3, AnnounceTimeDistances.STATE_PREPARE_TURN)) { String nm = n.directionInfo.getStreetName(); String rf = n.directionInfo.getRef(); String dn = n.directionInfo.getDestinationName(); diff --git a/OsmAnd/src/net/osmand/plus/routing/VoiceRouter.java b/OsmAnd/src/net/osmand/plus/routing/VoiceRouter.java index 58d9572aad..3f7c5db83a 100644 --- a/OsmAnd/src/net/osmand/plus/routing/VoiceRouter.java +++ b/OsmAnd/src/net/osmand/plus/routing/VoiceRouter.java @@ -13,6 +13,7 @@ import net.osmand.plus.OsmandApplication; import net.osmand.plus.helpers.WaypointHelper.LocationPointWrapper; import net.osmand.plus.routing.AlarmInfo.AlarmInfoType; import net.osmand.plus.routing.RouteCalculationResult.NextDirectionInfo; +import net.osmand.plus.routing.data.AnnounceTimeDistances; import net.osmand.plus.routing.data.StreetName; import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.plus.settings.backend.OsmAndAppCustomization.OsmAndAppCustomizationListener; @@ -35,6 +36,11 @@ import java.util.Iterator; import java.util.List; import java.util.Map; +import static net.osmand.plus.routing.data.AnnounceTimeDistances.STATE_LONG_PREPARE_TURN; +import static net.osmand.plus.routing.data.AnnounceTimeDistances.STATE_PREPARE_TURN; +import static net.osmand.plus.routing.data.AnnounceTimeDistances.STATE_TURN_IN_TURN; +import static net.osmand.plus.routing.data.AnnounceTimeDistances.STATE_TURN_NOW; + public class VoiceRouter { private static final int STATUS_UTWP_TOLD = -1; @@ -52,16 +58,13 @@ public class VoiceRouter { public static final String FROM_STREET_NAME = "fromStreetName"; public static final String FROM_DEST = "fromDest"; - // TODO combine into helper class - private static final int DEFAULT_GPS_TOLERANCE = 12; - private static float ARRIVAL_DISTANCE_FACTOR = 1; - protected CommandPlayer player; protected final OsmandApplication app; protected final RoutingHelper router; protected OsmandSettings settings; private ApplicationMode appMode; + private AnnounceTimeDistances atd; private int currentStatus = STATUS_UNKNOWN; private boolean playedAndArriveAtTarget = false; @@ -74,20 +77,8 @@ public class VoiceRouter { private boolean announceBackOnRoute = false; // private long lastTimeRouteRecalcAnnounced = 0; // Remember when last announcement was made - private long lastAnnouncement = 0; + private long lastAnnouncement = 0; - // Default speed to have comfortable announcements (Speed in m/s) - // initial value is updated from default speed settings anyway - private float DEFAULT_SPEED = 10; - private float TURN_NOW_SPEED; - - private int PREPARE_LONG_DISTANCE; - private int PREPARE_LONG_DISTANCE_END; - protected int PREPARE_DISTANCE; - private int PREPARE_DISTANCE_END; - private int TURN_IN_DISTANCE; - private int TURN_IN_DISTANCE_END; - private int TURN_NOW_DISTANCE; private SoundPool soundPool; private int soundClick = -1; @@ -187,101 +178,11 @@ public class VoiceRouter { public void updateAppMode() { appMode = router.getAppMode() == null ? settings.getApplicationMode() : router.getAppMode(); - ARRIVAL_DISTANCE_FACTOR = Math.max(settings.ARRIVAL_DISTANCE_FACTOR.getModeValue(appMode), 0.1f); - if (appMode.isDerivedRoutingFrom(ApplicationMode.CAR)) { - // keep it as minimum 30 kmh for voice announcement - DEFAULT_SPEED = (float) Math.max(8, appMode.getDefaultSpeed()); - } else { - // minimal is 1 meter for turn now - DEFAULT_SPEED = (float) Math.max(0.3, appMode.getDefaultSpeed()); - } - // Calculate minimal distance / time to announce turns, so time to turn is always >= ETALON_TIME - // Distance < ETALON_DIST or TIME_WITH_CURRENT_SPEED < ETALON_TIME_DEFAULT_SPEED - - // 300 sec: 4 200 - 3 500 m - car [ 115 - 95 sec @ 120 km/h] - PREPARE_LONG_DISTANCE = (int) (DEFAULT_SPEED * 300); - PREPARE_LONG_DISTANCE_END = (int) (DEFAULT_SPEED * 250) ; - if (DEFAULT_SPEED < 30) { - // Play only for high speed vehicle with speed > 110 km/h - // [issue 1411] - used only for goAhead prompt - PREPARE_LONG_DISTANCE_END = PREPARE_LONG_DISTANCE * 2; - } - - // 115 sec: 1 500 m - car [45 sec @ 120 km/h], 320 m - bicycle [45 sec @ 25 km/h], 230 m - pedestrian - PREPARE_DISTANCE = (int) (DEFAULT_SPEED * 115); - // 90 sec: 1 200 m - car, 250 m - bicycle [36 sec @ 25 km/h], - PREPARE_DISTANCE_END = (int) (DEFAULT_SPEED * 90); - - // 22 sec: 310 m - car, 60 m - bicycle, 50m - pedestrian - TURN_IN_DISTANCE = (int) (DEFAULT_SPEED * 22); - // 15 sec: 210 m - car, 40 m - bicycle, 30 m - pedestrian - TURN_IN_DISTANCE_END = (int) (DEFAULT_SPEED * 15); - - // Do not play prepare: for pedestrian and slow transport - // same check as speed < 150/(90-22) m/s = 2.2 m/s = 8 km/h - // if (DEFAULT_SPEED < 2.3) { - if (PREPARE_DISTANCE_END - TURN_IN_DISTANCE < 150) { - PREPARE_DISTANCE_END = PREPARE_DISTANCE * 2; - } - - // Turn now: 3.5 sec normal speed, 7 second for halfspeed (default) - // float TURN_NOW_TIME = 7; - - // ** #8749 to keep 1m / 1 sec precision (GPS_TOLERANCE - 12 m) - // 1 kmh - 1 sec, 4 kmh - 2 sec (pedestrian), 10 kmh - 3 sec (*bicycle), 50 kmh - 7 sec (car) - float TURN_NOW_TIME = (float) Math.min(Math.sqrt(DEFAULT_SPEED * 3.6), 8); - - // test new: 50 kmh - 50 m (car), 10 kmh - 10 m (bike), 4 kmh - 4 m - // TURN_NOW_DISTANCE = (int) (TURN_NOW_TIME * DEFAULT_SPEED / 2); - // old value - // 1 kmh - 1 m, 4 kmh - 4 m (pedestrian), 10 kmh - 10 m (bicycle), 50 kmh - 50 m (car) - // TURN_NOW_DISTANCE = (int) (DEFAULT_SPEED * 3.6); // 3.6 sec - // 50 kmh - 48 m (car), 10 kmh - 20 m, 4 kmh - 15 m, 1 kmh - 12 m - float factor = Math.max(settings.ARRIVAL_DISTANCE_FACTOR.getModeValue(appMode), 0.1f); - TURN_NOW_DISTANCE = (int) ((DEFAULT_GPS_TOLERANCE + DEFAULT_SPEED * 2.5) * factor); // 3.6 sec - TURN_NOW_SPEED = TURN_NOW_DISTANCE / TURN_NOW_TIME; - } - - private double voicePromptDelayDistance = 0; - - public boolean isDistanceLess(float currentSpeed, double dist, double etalon) { - return isDistanceLess(currentSpeed, dist, etalon, DEFAULT_SPEED); - } - - - private boolean isDistanceLess(float currentSpeed, double dist, double etalon, float defSpeed) { - if (currentSpeed <= 0) { - currentSpeed = DEFAULT_SPEED; - } - // Trigger close prompts earlier to allow BT SCO link being established, or when VOICE_PROMPT_DELAY is set >0 for the other stream types - int ams = settings.AUDIO_MANAGER_STREAM.getModeValue(router.getAppMode()); - if ((ams == 0 && !AbstractPrologCommandPlayer.btScoStatus) || ams > 0) { - if (settings.VOICE_PROMPT_DELAY[ams] != null) { - voicePromptDelayDistance = currentSpeed * (double) settings.VOICE_PROMPT_DELAY[ams].get() / 1000; - } - } - - if (dist - voicePromptDelayDistance < etalon || - (dist - voicePromptDelayDistance) / currentSpeed < etalon / defSpeed) { - return true; - } - return false; + atd = new AnnounceTimeDistances(appMode, settings); } public int calculateImminent(float dist, Location loc) { - float speed = DEFAULT_SPEED; - if (loc != null && loc.hasSpeed()) { - speed = loc.getSpeed(); - } - if (isDistanceLess(speed, dist, TURN_NOW_DISTANCE)) { - return 0; - } else if (dist <= PREPARE_DISTANCE) { - return 1; - } else if (dist <= PREPARE_LONG_DISTANCE) { - return 2; - } else { - return -1; - } + return atd.getImminentTurnStatus(dist, loc); } private void nextStatusAfter(int previousStatus) { @@ -297,19 +198,16 @@ public class VoiceRouter { return currentStatus <= statusToCheck; } - public float getArrivalDistance() { - ApplicationMode m = appMode; - float defaultSpeed = Math.max(0.3f, m.getDefaultSpeed()); + public AnnounceTimeDistances getAnnounceTimeDistances() { + return atd; + } - /// Used to be: car - 90 m, bicycle - 50 m, pedestrian - 20 m - // return ((float)settings.getApplicationMode().getArrivalDistance()) * settings.ARRIVAL_DISTANCE_FACTOR.getModeValue(m); - // GPS_TOLERANCE - 12 m - // 5 seconds: car - 80 m @ 50 kmh, bicycle - 45 m @ 25 km/h, bicycle - 25 m @ 10 km/h, pedestrian - 18 m @ 4 km/h, - return (DEFAULT_GPS_TOLERANCE + defaultSpeed * 5) * ARRIVAL_DISTANCE_FACTOR; + public float getArrivalDistance() { + return atd.getArrivalDistance(); } public void announceOffRoute(double dist) { - if (dist > appMode.getOffRouteDistance() * ARRIVAL_DISTANCE_FACTOR && !settings.DISABLE_OFFROUTE_RECALC.get()) { + if (dist > atd.getOffRouteDistance() && !settings.DISABLE_OFFROUTE_RECALC.get()) { long ms = System.currentTimeMillis(); if (waitAnnouncedOffRoute == 0 || ms - lastAnnouncedOffRoute > waitAnnouncedOffRoute) { CommandBuilder p = getNewCommandPlayerToPlay(); @@ -505,15 +403,7 @@ public class VoiceRouter { * @param currentLocation */ protected void updateStatus(Location currentLocation, boolean repeat) { - // Directly after turn: goAhead (dist), unless: - // < PREPARE_LONG_DISTANCE (e.g. 3500m): playPrepareTurn (-not played any more-) - // < PREPARE_DISTANCE (e.g. 1500m): playPrepareTurn ("Turn after ...") - // < TURN_IN_DISTANCE (e.g. 390m or 30sec): playMakeTurnIn ("Turn in ...") - // < TURN_NOW_DISTANCE (e.g. 50m or 7sec): playMakeTurn ("Turn ...") - float speed = DEFAULT_SPEED; - if (currentLocation != null && currentLocation.hasSpeed()) { - speed = Math.max(currentLocation.getSpeed(), speed); - } + float speed = atd.getSpeed(currentLocation); NextDirectionInfo nextInfo = router.getNextRouteDirectionInfo(new NextDirectionInfo(), true); RouteSegmentResult currentSegment = router.getCurrentSegmentResult(); @@ -550,23 +440,24 @@ public class VoiceRouter { if (currentStatus == STATUS_UNKNOWN) { // Play "Continue for ..." if (1) after route calculation if no other prompt is due, or (2) after a turn if next turn is more than PREPARE_LONG_DISTANCE away - if ((playGoAheadDist == -1) || (dist > PREPARE_LONG_DISTANCE)) { - playGoAheadDist = dist - 3 * TURN_NOW_DISTANCE; + if ((playGoAheadDist == -1) || !atd.isTurnStateActive(0, dist, STATE_LONG_PREPARE_TURN)) { + // 10 seconds + playGoAheadDist = dist - 10 * speed; } } NextDirectionInfo nextNextInfo = router.getNextRouteDirectionInfoAfter(nextInfo, new NextDirectionInfo(), true); //I think "true" is correct here, not "!repeat" // Note: getNextRouteDirectionInfoAfter(nextInfo, x, y).distanceTo is distance from nextInfo, not from current position! - // STATUS_TURN = "Turn (now)" - if ((repeat || statusNotPassed(STATUS_TURN)) && isDistanceLess(speed, dist, TURN_NOW_DISTANCE, TURN_NOW_SPEED)) { - if (nextNextInfo.distanceTo < TURN_IN_DISTANCE_END && nextNextInfo != null) { + if ((repeat || statusNotPassed(STATUS_TURN)) && atd.isTurnStateActive(speed, dist, STATE_TURN_NOW)) { + if (nextNextInfo != null && !atd.isTurnStateNotPassed(0, nextNextInfo.distanceTo, STATE_TURN_IN_TURN )) { playMakeTurn(currentSegment, next, nextNextInfo); } else { playMakeTurn(currentSegment, next, null); } - if (!next.getTurnType().goAhead() && isTargetPoint(nextNextInfo)) { // !goAhead() avoids isolated "and arrive.." prompt, as goAhead() is not pronounced - if (nextNextInfo.distanceTo < TURN_IN_DISTANCE_END) { + if (!next.getTurnType().goAhead() && isTargetPoint(nextNextInfo) && nextNextInfo != null) { + // !goAhead() avoids isolated "and arrive.." prompt, as goAhead() is not pronounced + if (!atd.isTurnStateNotPassed(0, nextNextInfo.distanceTo, STATE_TURN_IN_TURN )) { // Issue #2865: Ensure a distance associated with the destination arrival is always announced, either here, or in subsequent "Turn in" prompt // Distance fon non-straights already announced in "Turn (now)"'s nextnext code above if ((nextNextInfo != null) && (nextNextInfo.directionInfo != null) && nextNextInfo.directionInfo.getTurnType().goAhead()) { @@ -574,7 +465,7 @@ public class VoiceRouter { playGoAhead(nextNextInfo.distanceTo, new StreetName()); } playAndArriveAtDestination(nextNextInfo); - } else if (nextNextInfo.distanceTo < 1.2f * TURN_IN_DISTANCE_END) { + } else if (!atd.isTurnStateNotPassed(0, nextNextInfo.distanceTo / 1.2f, STATE_TURN_IN_TURN )) { // 1.2 is safety margin should the subsequent "Turn in" prompt not fit in amy more playThen(); playGoAhead(nextNextInfo.distanceTo, new StreetName()); @@ -584,33 +475,33 @@ public class VoiceRouter { nextStatusAfter(STATUS_TURN); // STATUS_TURN_IN = "Turn in ..." - } else if ((repeat || statusNotPassed(STATUS_TURN_IN)) && isDistanceLess(speed, dist, TURN_IN_DISTANCE)) { - if (repeat || dist >= TURN_IN_DISTANCE_END) { - if ((isDistanceLess(speed, nextNextInfo.distanceTo, TURN_NOW_DISTANCE) || nextNextInfo.distanceTo < TURN_IN_DISTANCE_END) && - nextNextInfo != null) { - playMakeTurnIn(currentSegment, next, dist - (int) voicePromptDelayDistance, nextNextInfo.directionInfo); + } else if ((repeat || statusNotPassed(STATUS_TURN_IN)) && atd.isTurnStateActive(speed, dist, STATE_TURN_IN_TURN)) { + if (repeat || atd.isTurnStateNotPassed(0, dist, STATE_TURN_IN_TURN)) { + if (nextNextInfo != null && (atd.isTurnStateActive(speed, nextNextInfo.distanceTo, STATE_TURN_NOW) + || !atd.isTurnStateNotPassed(speed, nextNextInfo.distanceTo, STATE_TURN_IN_TURN))) { + playMakeTurnIn(currentSegment, next, atd.calcDistanceWithoutDelay(speed, dist), nextNextInfo.directionInfo); } else { - playMakeTurnIn(currentSegment, next, dist - (int) voicePromptDelayDistance, null); + playMakeTurnIn(currentSegment, next, atd.calcDistanceWithoutDelay(speed, dist), null); } playGoAndArriveAtDestination(repeat, nextInfo, currentSegment); } nextStatusAfter(STATUS_TURN_IN); // STATUS_PREPARE = "Turn after ..." - } else if ((repeat || statusNotPassed(STATUS_PREPARE)) && (dist <= PREPARE_DISTANCE)) { - if (repeat || dist >= PREPARE_DISTANCE_END) { + } else if ((repeat || statusNotPassed(STATUS_PREPARE)) && atd.isTurnStateActive(0, dist, STATE_PREPARE_TURN)) { + if (repeat || atd.isTurnStateNotPassed(0, dist, STATE_PREPARE_TURN)) { if (!repeat && (next.getTurnType().keepLeft() || next.getTurnType().keepRight())) { // Do not play prepare for keep left/right } else { - playPrepareTurn(currentSegment, next, dist); + playPrepareTurn(currentSegment, next, atd.calcDistanceWithoutDelay(speed, dist)); playGoAndArriveAtDestination(repeat, nextInfo, currentSegment); } } nextStatusAfter(STATUS_PREPARE); // STATUS_LONG_PREPARE = also "Turn after ...", we skip this now, users said this is obsolete - } else if ((repeat || statusNotPassed(STATUS_LONG_PREPARE)) && (dist <= PREPARE_LONG_DISTANCE)) { - if (repeat || dist >= PREPARE_LONG_DISTANCE_END) { + } else if ((repeat || statusNotPassed(STATUS_LONG_PREPARE)) && atd.isTurnStateActive(0, dist, STATE_LONG_PREPARE_TURN)) { + if (repeat || atd.isTurnStateNotPassed(0, dist, STATE_LONG_PREPARE_TURN)) { playPrepareTurn(currentSegment, next, dist); playGoAndArriveAtDestination(repeat, nextInfo, currentSegment); } @@ -854,7 +745,8 @@ public class VoiceRouter { playGoAhead(nextInfo.distanceTo, getSpeakableStreetName(currentSegment, next, false)); playAndArriveAtDestination(nextInfo); playedAndArriveAtTarget = true; - } else if (nextInfo.distanceTo <= 2 * TURN_IN_DISTANCE) { + } else if (nextInfo != null && + atd.isTurnStateActive(0, nextInfo.distanceTo / 2, STATE_TURN_IN_TURN)) { playAndArriveAtDestination(nextInfo); playedAndArriveAtTarget = true; } diff --git a/OsmAnd/src/net/osmand/plus/routing/data/AnnounceTimeDistances.java b/OsmAnd/src/net/osmand/plus/routing/data/AnnounceTimeDistances.java new file mode 100644 index 0000000000..1b6586ed8e --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/routing/data/AnnounceTimeDistances.java @@ -0,0 +1,196 @@ +package net.osmand.plus.routing.data; + +import net.osmand.Location; +import net.osmand.plus.settings.backend.ApplicationMode; +import net.osmand.plus.settings.backend.OsmandSettings; +import net.osmand.plus.voice.AbstractPrologCommandPlayer; + +public class AnnounceTimeDistances { + private static final int DEFAULT_GPS_TOLERANCE = 12; + public final static int STATE_TURN_NOW = 0; + public final static int STATE_PREPARE_TURN = 1; + public final static int STATE_LONG_PREPARE_TURN = 2; + public final static int STATE_TURN_IN_TURN = 3; + public final static int STATE_LONG_PNT_ANNOUNCE = 4; + public final static int STATE_SHORT_PNT_ANNOUNCE = 5; + public final static int STATE_LONG_ALARM_ANNOUNCE = 6; + public final static int STATE_SHORT_ALARM_ANNOUNCE = 7; + + + // Default speed to have comfortable announcements (Speed in m/s) + // initial value is updated from default speed settings anyway + private float DEFAULT_SPEED = 10; + private float ARRIVAL_DISTANCE_FACTOR = 1; + private double voicePromptDelayTimeSec = 0; + + private float ARRIVAL_DISTANCE; + private float OFF_ROUTE_DISTANCE; + + private float TURN_NOW_SPEED; + private int PREPARE_LONG_DISTANCE; + private int PREPARE_LONG_DISTANCE_END; + protected int PREPARE_DISTANCE; + private int PREPARE_DISTANCE_END; + private int TURN_IN_DISTANCE; + private int TURN_IN_DISTANCE_END; + private int TURN_NOW_DISTANCE; + + // TODO + private static final int LONG_PNT_ANNOUNCE_RADIUS = 700; + private static final int SHORT_PNT_ANNOUNCE_RADIUS = 150; + private static final int LONG_ALARM_ANNOUNCE_RADIUS = 150; + private static final int SHORT_ALARM_ANNOUNCE_RADIUS = 100; + + public AnnounceTimeDistances(ApplicationMode appMode, OsmandSettings settings) { + if (appMode.isDerivedRoutingFrom(ApplicationMode.CAR)) { + // keep it as minimum 30 kmh for voice announcement + DEFAULT_SPEED = (float) Math.max(8, appMode.getDefaultSpeed()); + } else { + // minimal is 1 meter for turn now + DEFAULT_SPEED = (float) Math.max(0.3, appMode.getDefaultSpeed()); + } + // Calculate minimal distance / time to announce turns, so time to turn is always >= ETALON_TIME + // Distance < ETALON_DIST or TIME_WITH_CURRENT_SPEED < ETALON_TIME_DEFAULT_SPEED + + // 300 sec: 4 200 - 3 500 m - car [ 115 - 95 sec @ 120 km/h] + PREPARE_LONG_DISTANCE = (int) (DEFAULT_SPEED * 300); + PREPARE_LONG_DISTANCE_END = (int) (DEFAULT_SPEED * 250) ; + if (DEFAULT_SPEED < 30) { + // Play only for high speed vehicle with speed > 110 km/h + // [issue 1411] - used only for goAhead prompt + PREPARE_LONG_DISTANCE_END = PREPARE_LONG_DISTANCE * 2; + } + + // 115 sec: 1 500 m - car [45 sec @ 120 km/h], 320 m - bicycle [45 sec @ 25 km/h], 230 m - pedestrian + PREPARE_DISTANCE = (int) (DEFAULT_SPEED * 115); + // 90 sec: 1 200 m - car, 250 m - bicycle [36 sec @ 25 km/h], + PREPARE_DISTANCE_END = (int) (DEFAULT_SPEED * 90); + + // 22 sec: 310 m - car, 60 m - bicycle, 50m - pedestrian + TURN_IN_DISTANCE = (int) (DEFAULT_SPEED * 22); + // 15 sec: 210 m - car, 40 m - bicycle, 30 m - pedestrian + TURN_IN_DISTANCE_END = (int) (DEFAULT_SPEED * 15); + + // Do not play prepare: for pedestrian and slow transport + // same check as speed < 150/(90-22) m/s = 2.2 m/s = 8 km/h + // if (DEFAULT_SPEED < 2.3) { + if (PREPARE_DISTANCE_END - TURN_IN_DISTANCE < 150) { + PREPARE_DISTANCE_END = PREPARE_DISTANCE * 2; + } + + // Turn now: 3.5 sec normal speed, 7 second for halfspeed (default) + // float TURN_NOW_TIME = 7; + + // ** #8749 to keep 1m / 1 sec precision (GPS_TOLERANCE - 12 m) + // 1 kmh - 1 sec, 4 kmh - 2 sec (pedestrian), 10 kmh - 3 sec (*bicycle), 50 kmh - 7 sec (car) + float TURN_NOW_TIME = (float) Math.min(Math.sqrt(DEFAULT_SPEED * 3.6), 8); + + // test new: 50 kmh - 50 m (car), 10 kmh - 10 m (bike), 4 kmh - 4 m + // TURN_NOW_DISTANCE = (int) (TURN_NOW_TIME * DEFAULT_SPEED / 2); + // old value + // 1 kmh - 1 m, 4 kmh - 4 m (pedestrian), 10 kmh - 10 m (bicycle), 50 kmh - 50 m (car) + // TURN_NOW_DISTANCE = (int) (DEFAULT_SPEED * 3.6); // 3.6 sec + // 50 kmh - 48 m (car), 10 kmh - 20 m, 4 kmh - 15 m, 1 kmh - 12 m + float factor = Math.max(settings.ARRIVAL_DISTANCE_FACTOR.getModeValue(appMode), 0.1f); + TURN_NOW_DISTANCE = (int) ((DEFAULT_GPS_TOLERANCE + DEFAULT_SPEED * 2.5) * factor); // 3.6 sec + TURN_NOW_SPEED = TURN_NOW_DISTANCE / TURN_NOW_TIME; + + // Trigger close prompts earlier to allow BT SCO link being established, or when VOICE_PROMPT_DELAY is set >0 for the other stream types + int ams = settings.AUDIO_MANAGER_STREAM.getModeValue(appMode); + if ((ams == 0 && !AbstractPrologCommandPlayer.btScoStatus) || ams > 0) { + if (settings.VOICE_PROMPT_DELAY[ams] != null) { + voicePromptDelayTimeSec = (double) settings.VOICE_PROMPT_DELAY[ams].get() / 1000; + } + } + + // 5 seconds: car - 80 m @ 50 kmh, bicycle - 45 m @ 25 km/h, bicycle - 25 m @ 10 km/h, pedestrian - 18 m @ 4 km/h, + ARRIVAL_DISTANCE_FACTOR = Math.max(settings.ARRIVAL_DISTANCE_FACTOR.getModeValue(appMode), 0.1f); + ARRIVAL_DISTANCE = (DEFAULT_GPS_TOLERANCE + DEFAULT_SPEED * 5) * ARRIVAL_DISTANCE_FACTOR; + + // 50 kmh - 280 m, 10 kmh - 55 m, 4 kmh - 22 m + OFF_ROUTE_DISTANCE = DEFAULT_SPEED * 20 * ARRIVAL_DISTANCE_FACTOR; // 20 seconds + } + + public int getImminentTurnStatus(float dist, Location loc) { + float speed = getSpeed(loc); + if (isTurnStateActive(speed, dist, STATE_TURN_NOW)) { + return 0; + } else if (isTurnStateActive(speed, dist, STATE_PREPARE_TURN)) { + // STATE_TURN_IN_TURN included + return 1; + } else { + return -1; + } + } + + public boolean isTurnStateActive(float currentSpeed, double dist, int turnType) { + switch (turnType) { + case STATE_TURN_IN_TURN: + return isDistanceLess(currentSpeed, dist, TURN_IN_DISTANCE); + case STATE_PREPARE_TURN: + return isDistanceLess(currentSpeed, dist, PREPARE_DISTANCE); + case STATE_LONG_PREPARE_TURN: + return isDistanceLess(currentSpeed, dist, PREPARE_LONG_DISTANCE); + case STATE_TURN_NOW: + return isDistanceLess(currentSpeed, dist, TURN_NOW_DISTANCE, TURN_NOW_SPEED); + case STATE_LONG_PNT_ANNOUNCE: + return isDistanceLess(currentSpeed, dist, LONG_PNT_ANNOUNCE_RADIUS); + case STATE_SHORT_PNT_ANNOUNCE: + return isDistanceLess(currentSpeed, dist, SHORT_PNT_ANNOUNCE_RADIUS); + case STATE_LONG_ALARM_ANNOUNCE: + return isDistanceLess(currentSpeed, dist, LONG_ALARM_ANNOUNCE_RADIUS); + case STATE_SHORT_ALARM_ANNOUNCE: + return isDistanceLess(currentSpeed, dist, SHORT_ALARM_ANNOUNCE_RADIUS); + } + return false; + } + + public boolean isTurnStateNotPassed(float currentSpeed, double dist, int turnType) { + switch (turnType) { + case STATE_TURN_IN_TURN: + return !isDistanceLess(currentSpeed, dist, TURN_IN_DISTANCE_END); + case STATE_PREPARE_TURN: + return !isDistanceLess(currentSpeed, dist, PREPARE_DISTANCE_END); + case STATE_LONG_PREPARE_TURN: + return !isDistanceLess(currentSpeed, dist, PREPARE_LONG_DISTANCE_END); + case STATE_LONG_PNT_ANNOUNCE: + return !isDistanceLess(currentSpeed, dist, LONG_PNT_ANNOUNCE_RADIUS * 0.5); + } + return true; + } + + private boolean isDistanceLess(float currentSpeed, double dist, double etalon) { + return isDistanceLess(currentSpeed, dist, etalon, DEFAULT_SPEED); + } + + private boolean isDistanceLess(float currentSpeed, double dist, double etalon, float defSpeed) { + if (dist - voicePromptDelayTimeSec * currentSpeed <= etalon) { + return true; + } + // check only if speed > 0 + if (currentSpeed > 0 && (dist / currentSpeed - voicePromptDelayTimeSec) <= etalon / defSpeed) { + return true; + } + return false; + } + + public float getSpeed(Location loc) { + float speed = DEFAULT_SPEED; + if (loc != null && loc.hasSpeed()) { + speed = Math.max(loc.getSpeed(), speed); + } + return speed; + } + + public float getOffRouteDistance() { + return OFF_ROUTE_DISTANCE; + } + + public float getArrivalDistance() { + return ARRIVAL_DISTANCE; + } + + public int calcDistanceWithoutDelay(float speed, int dist) { + return (int) (dist - voicePromptDelayTimeSec * speed); + } +} \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/settings/backend/ApplicationMode.java b/OsmAnd/src/net/osmand/plus/settings/backend/ApplicationMode.java index 9a5cdb7d79..59d8172bb1 100644 --- a/OsmAnd/src/net/osmand/plus/settings/backend/ApplicationMode.java +++ b/OsmAnd/src/net/osmand/plus/settings/backend/ApplicationMode.java @@ -374,13 +374,6 @@ public class ApplicationMode { } - public int getOffRouteDistance() { - // used to be: 50/14 - 350 m, 10/2.7 - 50 m, 4/1.11 - 20 m - float speed = Math.max(getDefaultSpeed(), 0.3f); - // become: 50 kmh - 280 m, 10 kmh - 55 m, 4 kmh - 22 m - return (int) (speed * 20); - } - public boolean hasFastSpeed() { return getDefaultSpeed() > 10; } From 55facdbfc506bce49c8cbdf2760c0a6b8497a539 Mon Sep 17 00:00:00 2001 From: Victor Shcherb Date: Sat, 2 Jan 2021 02:48:47 +0100 Subject: [PATCH 21/37] Apply constants for announce time distances --- .../routing/data/AnnounceTimeDistances.java | 42 +++++++++---------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/routing/data/AnnounceTimeDistances.java b/OsmAnd/src/net/osmand/plus/routing/data/AnnounceTimeDistances.java index 1b6586ed8e..7f79ce539b 100644 --- a/OsmAnd/src/net/osmand/plus/routing/data/AnnounceTimeDistances.java +++ b/OsmAnd/src/net/osmand/plus/routing/data/AnnounceTimeDistances.java @@ -16,11 +16,12 @@ public class AnnounceTimeDistances { public final static int STATE_LONG_ALARM_ANNOUNCE = 6; public final static int STATE_SHORT_ALARM_ANNOUNCE = 7; + public final static int STATE_ARRIVAL_DISTANCE = 10; + public final static int STATE_OFF_ROUTE_DISTANCE = 11; // Default speed to have comfortable announcements (Speed in m/s) // initial value is updated from default speed settings anyway private float DEFAULT_SPEED = 10; - private float ARRIVAL_DISTANCE_FACTOR = 1; private double voicePromptDelayTimeSec = 0; private float ARRIVAL_DISTANCE; @@ -29,17 +30,15 @@ public class AnnounceTimeDistances { private float TURN_NOW_SPEED; private int PREPARE_LONG_DISTANCE; private int PREPARE_LONG_DISTANCE_END; - protected int PREPARE_DISTANCE; + private int PREPARE_DISTANCE; private int PREPARE_DISTANCE_END; private int TURN_IN_DISTANCE; private int TURN_IN_DISTANCE_END; private int TURN_NOW_DISTANCE; - - // TODO - private static final int LONG_PNT_ANNOUNCE_RADIUS = 700; - private static final int SHORT_PNT_ANNOUNCE_RADIUS = 150; - private static final int LONG_ALARM_ANNOUNCE_RADIUS = 150; - private static final int SHORT_ALARM_ANNOUNCE_RADIUS = 100; + private int LONG_PNT_ANNOUNCE_RADIUS; + private int SHORT_PNT_ANNOUNCE_RADIUS; + private int LONG_ALARM_ANNOUNCE_RADIUS; + private int SHORT_ALARM_ANNOUNCE_RADIUS; public AnnounceTimeDistances(ApplicationMode appMode, OsmandSettings settings) { if (appMode.isDerivedRoutingFrom(ApplicationMode.CAR)) { @@ -85,16 +84,22 @@ public class AnnounceTimeDistances { // 1 kmh - 1 sec, 4 kmh - 2 sec (pedestrian), 10 kmh - 3 sec (*bicycle), 50 kmh - 7 sec (car) float TURN_NOW_TIME = (float) Math.min(Math.sqrt(DEFAULT_SPEED * 3.6), 8); - // test new: 50 kmh - 50 m (car), 10 kmh - 10 m (bike), 4 kmh - 4 m - // TURN_NOW_DISTANCE = (int) (TURN_NOW_TIME * DEFAULT_SPEED / 2); - // old value - // 1 kmh - 1 m, 4 kmh - 4 m (pedestrian), 10 kmh - 10 m (bicycle), 50 kmh - 50 m (car) + float ARRIVAL_DISTANCE_FACTOR = Math.max(settings.ARRIVAL_DISTANCE_FACTOR.getModeValue(appMode), 0.1f); // TURN_NOW_DISTANCE = (int) (DEFAULT_SPEED * 3.6); // 3.6 sec // 50 kmh - 48 m (car), 10 kmh - 20 m, 4 kmh - 15 m, 1 kmh - 12 m - float factor = Math.max(settings.ARRIVAL_DISTANCE_FACTOR.getModeValue(appMode), 0.1f); - TURN_NOW_DISTANCE = (int) ((DEFAULT_GPS_TOLERANCE + DEFAULT_SPEED * 2.5) * factor); // 3.6 sec + TURN_NOW_DISTANCE = (int) ((DEFAULT_GPS_TOLERANCE + DEFAULT_SPEED * 2.5) * ARRIVAL_DISTANCE_FACTOR); // 3.6 sec TURN_NOW_SPEED = TURN_NOW_DISTANCE / TURN_NOW_TIME; + // 5 seconds: car - 80 m @ 50 kmh, bicycle - 45 m @ 25 km/h, bicycle - 25 m @ 10 km/h, pedestrian - 18 m @ 4 km/h, + ARRIVAL_DISTANCE = (DEFAULT_GPS_TOLERANCE + DEFAULT_SPEED * 5) * ARRIVAL_DISTANCE_FACTOR; + // 50 kmh - 280 m, 10 kmh - 55 m, 4 kmh - 22 m + OFF_ROUTE_DISTANCE = DEFAULT_SPEED * 20 * ARRIVAL_DISTANCE_FACTOR; // 20 seconds + // assume for backward compatibility speed - 10 m/s + LONG_PNT_ANNOUNCE_RADIUS = (int) (60 * DEFAULT_SPEED * ARRIVAL_DISTANCE_FACTOR); // 700m + SHORT_PNT_ANNOUNCE_RADIUS = (int) (15 * DEFAULT_SPEED * ARRIVAL_DISTANCE_FACTOR); // 150m + LONG_ALARM_ANNOUNCE_RADIUS = (int) (12 * DEFAULT_SPEED * ARRIVAL_DISTANCE_FACTOR); // 150m + SHORT_ALARM_ANNOUNCE_RADIUS = (int) (7 * DEFAULT_SPEED * ARRIVAL_DISTANCE_FACTOR); // 100m + // Trigger close prompts earlier to allow BT SCO link being established, or when VOICE_PROMPT_DELAY is set >0 for the other stream types int ams = settings.AUDIO_MANAGER_STREAM.getModeValue(appMode); if ((ams == 0 && !AbstractPrologCommandPlayer.btScoStatus) || ams > 0) { @@ -102,13 +107,6 @@ public class AnnounceTimeDistances { voicePromptDelayTimeSec = (double) settings.VOICE_PROMPT_DELAY[ams].get() / 1000; } } - - // 5 seconds: car - 80 m @ 50 kmh, bicycle - 45 m @ 25 km/h, bicycle - 25 m @ 10 km/h, pedestrian - 18 m @ 4 km/h, - ARRIVAL_DISTANCE_FACTOR = Math.max(settings.ARRIVAL_DISTANCE_FACTOR.getModeValue(appMode), 0.1f); - ARRIVAL_DISTANCE = (DEFAULT_GPS_TOLERANCE + DEFAULT_SPEED * 5) * ARRIVAL_DISTANCE_FACTOR; - - // 50 kmh - 280 m, 10 kmh - 55 m, 4 kmh - 22 m - OFF_ROUTE_DISTANCE = DEFAULT_SPEED * 20 * ARRIVAL_DISTANCE_FACTOR; // 20 seconds } public int getImminentTurnStatus(float dist, Location loc) { @@ -155,6 +153,8 @@ public class AnnounceTimeDistances { return !isDistanceLess(currentSpeed, dist, PREPARE_LONG_DISTANCE_END); case STATE_LONG_PNT_ANNOUNCE: return !isDistanceLess(currentSpeed, dist, LONG_PNT_ANNOUNCE_RADIUS * 0.5); + case STATE_LONG_ALARM_ANNOUNCE: + return !isDistanceLess(currentSpeed, dist, LONG_ALARM_ANNOUNCE_RADIUS * 0.5); } return true; } From 666427f9ebe2c1b57968c29db0f87c782c57b7b2 Mon Sep 17 00:00:00 2001 From: Hardy Date: Sat, 2 Jan 2021 12:24:06 +0100 Subject: [PATCH 22/37] Explain the concept of POSITIONING_TOLERANCE --- .../net/osmand/plus/routing/data/AnnounceTimeDistances.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/OsmAnd/src/net/osmand/plus/routing/data/AnnounceTimeDistances.java b/OsmAnd/src/net/osmand/plus/routing/data/AnnounceTimeDistances.java index 7f79ce539b..80c5d1e785 100644 --- a/OsmAnd/src/net/osmand/plus/routing/data/AnnounceTimeDistances.java +++ b/OsmAnd/src/net/osmand/plus/routing/data/AnnounceTimeDistances.java @@ -6,7 +6,11 @@ import net.osmand.plus.settings.backend.OsmandSettings; import net.osmand.plus.voice.AbstractPrologCommandPlayer; public class AnnounceTimeDistances { + // Avoids false negatives: Pre-pone close announcements by this distance to allow for the possible over-estimation of the 'true' lead distance due to positioning error. + // A smaller value will increase the timing precision, but at the risk of missing prompts which do not meet the precision limit. + // We can research if a flexible value like min(12, x * gps-hdop) has advantages over a constant (x could be 2 or so). private static final int DEFAULT_GPS_TOLERANCE = 12; + public final static int STATE_TURN_NOW = 0; public final static int STATE_PREPARE_TURN = 1; public final static int STATE_LONG_PREPARE_TURN = 2; @@ -193,4 +197,4 @@ public class AnnounceTimeDistances { public int calcDistanceWithoutDelay(float speed, int dist) { return (int) (dist - voicePromptDelayTimeSec * speed); } -} \ No newline at end of file +} From 86379dd3b779a51e968ca9b8052174f9a75b3b4c Mon Sep 17 00:00:00 2001 From: sonora Date: Sat, 2 Jan 2021 12:47:20 +0100 Subject: [PATCH 23/37] resort/rename some constants --- .../osmand/plus/helpers/WaypointHelper.java | 14 ++++---- .../net/osmand/plus/routing/VoiceRouter.java | 16 +++++----- .../routing/data/AnnounceTimeDistances.java | 32 +++++++++---------- 3 files changed, 31 insertions(+), 31 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/helpers/WaypointHelper.java b/OsmAnd/src/net/osmand/plus/helpers/WaypointHelper.java index 26855ad129..90c1c7da97 100644 --- a/OsmAnd/src/net/osmand/plus/helpers/WaypointHelper.java +++ b/OsmAnd/src/net/osmand/plus/helpers/WaypointHelper.java @@ -48,9 +48,9 @@ import java.util.concurrent.ConcurrentHashMap; import gnu.trove.list.array.TIntArrayList; import static net.osmand.plus.routing.data.AnnounceTimeDistances.STATE_LONG_ALARM_ANNOUNCE; -import static net.osmand.plus.routing.data.AnnounceTimeDistances.STATE_LONG_PNT_ANNOUNCE; +import static net.osmand.plus.routing.data.AnnounceTimeDistances.STATE_LONG_PNT_APPROACH; import static net.osmand.plus.routing.data.AnnounceTimeDistances.STATE_SHORT_ALARM_ANNOUNCE; -import static net.osmand.plus.routing.data.AnnounceTimeDistances.STATE_SHORT_PNT_ANNOUNCE; +import static net.osmand.plus.routing.data.AnnounceTimeDistances.STATE_SHORT_PNT_APPROACH; // import android.widget.Toast; @@ -182,7 +182,7 @@ public class WaypointHelper { // skip } else { if (atd.isTurnStateActive(0, - route.getDistanceToPoint(lwp.routeIndex), STATE_LONG_PNT_ANNOUNCE)) { + route.getDistanceToPoint(lwp.routeIndex), STATE_LONG_PNT_APPROACH)) { if (found == null || found.routeIndex < lwp.routeIndex) { found = lwp; if (list != null) { @@ -226,7 +226,7 @@ public class WaypointHelper { inf.setFloatValue(route.getDistanceToPoint(inf.getLastLocationIndex())); } int d = route.getDistanceToPoint(inf.getLocationIndex()); - if (!atd.isTurnStateActive(0, d, STATE_LONG_PNT_ANNOUNCE)) { + if (!atd.isTurnStateActive(0, d, STATE_LONG_PNT_APPROACH)) { break; } float time = speed > 0 ? d / speed : Integer.MAX_VALUE; @@ -386,7 +386,7 @@ public class WaypointHelper { } if (lwp.announce) { if (!atd.isTurnStateActive(atdSpeed, - route.getDistanceToPoint(lwp.routeIndex) / 2, STATE_LONG_PNT_ANNOUNCE)) { + route.getDistanceToPoint(lwp.routeIndex) / 2, STATE_LONG_PNT_APPROACH)) { break; } LocationPoint point = lwp.point; @@ -394,11 +394,11 @@ public class WaypointHelper { point.getLatitude(), point.getLongitude()) - lwp.getDeviationDistance()); Integer state = locationPointsStates.get(point); if (state != null && state == ANNOUNCED_ONCE - && atd.isTurnStateActive(atdSpeed, d1, STATE_SHORT_PNT_ANNOUNCE)) { + && atd.isTurnStateActive(atdSpeed, d1, STATE_SHORT_PNT_APPROACH)) { locationPointsStates.put(point, ANNOUNCED_DONE); announcePoints.add(lwp); } else if (type != ALARMS && (state == null || state == NOT_ANNOUNCED) - && atd.isTurnStateActive(atdSpeed, d1, STATE_LONG_PNT_ANNOUNCE)) { + && atd.isTurnStateActive(atdSpeed, d1, STATE_LONG_PNT_APPROACH)) { locationPointsStates.put(point, ANNOUNCED_ONCE); approachPoints.add(lwp); } else if (type == ALARMS && (state == null || state == NOT_ANNOUNCED)) { diff --git a/OsmAnd/src/net/osmand/plus/routing/VoiceRouter.java b/OsmAnd/src/net/osmand/plus/routing/VoiceRouter.java index 3f7c5db83a..b9032e26e4 100644 --- a/OsmAnd/src/net/osmand/plus/routing/VoiceRouter.java +++ b/OsmAnd/src/net/osmand/plus/routing/VoiceRouter.java @@ -38,7 +38,7 @@ import java.util.Map; import static net.osmand.plus.routing.data.AnnounceTimeDistances.STATE_LONG_PREPARE_TURN; import static net.osmand.plus.routing.data.AnnounceTimeDistances.STATE_PREPARE_TURN; -import static net.osmand.plus.routing.data.AnnounceTimeDistances.STATE_TURN_IN_TURN; +import static net.osmand.plus.routing.data.AnnounceTimeDistances.STATE_TURN_IN; import static net.osmand.plus.routing.data.AnnounceTimeDistances.STATE_TURN_NOW; @@ -450,14 +450,14 @@ public class VoiceRouter { // Note: getNextRouteDirectionInfoAfter(nextInfo, x, y).distanceTo is distance from nextInfo, not from current position! // STATUS_TURN = "Turn (now)" if ((repeat || statusNotPassed(STATUS_TURN)) && atd.isTurnStateActive(speed, dist, STATE_TURN_NOW)) { - if (nextNextInfo != null && !atd.isTurnStateNotPassed(0, nextNextInfo.distanceTo, STATE_TURN_IN_TURN )) { + if (nextNextInfo != null && !atd.isTurnStateNotPassed(0, nextNextInfo.distanceTo, STATE_TURN_IN )) { playMakeTurn(currentSegment, next, nextNextInfo); } else { playMakeTurn(currentSegment, next, null); } if (!next.getTurnType().goAhead() && isTargetPoint(nextNextInfo) && nextNextInfo != null) { // !goAhead() avoids isolated "and arrive.." prompt, as goAhead() is not pronounced - if (!atd.isTurnStateNotPassed(0, nextNextInfo.distanceTo, STATE_TURN_IN_TURN )) { + if (!atd.isTurnStateNotPassed(0, nextNextInfo.distanceTo, STATE_TURN_IN )) { // Issue #2865: Ensure a distance associated with the destination arrival is always announced, either here, or in subsequent "Turn in" prompt // Distance fon non-straights already announced in "Turn (now)"'s nextnext code above if ((nextNextInfo != null) && (nextNextInfo.directionInfo != null) && nextNextInfo.directionInfo.getTurnType().goAhead()) { @@ -465,7 +465,7 @@ public class VoiceRouter { playGoAhead(nextNextInfo.distanceTo, new StreetName()); } playAndArriveAtDestination(nextNextInfo); - } else if (!atd.isTurnStateNotPassed(0, nextNextInfo.distanceTo / 1.2f, STATE_TURN_IN_TURN )) { + } else if (!atd.isTurnStateNotPassed(0, nextNextInfo.distanceTo / 1.2f, STATE_TURN_IN )) { // 1.2 is safety margin should the subsequent "Turn in" prompt not fit in amy more playThen(); playGoAhead(nextNextInfo.distanceTo, new StreetName()); @@ -475,10 +475,10 @@ public class VoiceRouter { nextStatusAfter(STATUS_TURN); // STATUS_TURN_IN = "Turn in ..." - } else if ((repeat || statusNotPassed(STATUS_TURN_IN)) && atd.isTurnStateActive(speed, dist, STATE_TURN_IN_TURN)) { - if (repeat || atd.isTurnStateNotPassed(0, dist, STATE_TURN_IN_TURN)) { + } else if ((repeat || statusNotPassed(STATUS_TURN_IN)) && atd.isTurnStateActive(speed, dist, STATE_TURN_IN)) { + if (repeat || atd.isTurnStateNotPassed(0, dist, STATE_TURN_IN)) { if (nextNextInfo != null && (atd.isTurnStateActive(speed, nextNextInfo.distanceTo, STATE_TURN_NOW) - || !atd.isTurnStateNotPassed(speed, nextNextInfo.distanceTo, STATE_TURN_IN_TURN))) { + || !atd.isTurnStateNotPassed(speed, nextNextInfo.distanceTo, STATE_TURN_IN))) { playMakeTurnIn(currentSegment, next, atd.calcDistanceWithoutDelay(speed, dist), nextNextInfo.directionInfo); } else { playMakeTurnIn(currentSegment, next, atd.calcDistanceWithoutDelay(speed, dist), null); @@ -746,7 +746,7 @@ public class VoiceRouter { playAndArriveAtDestination(nextInfo); playedAndArriveAtTarget = true; } else if (nextInfo != null && - atd.isTurnStateActive(0, nextInfo.distanceTo / 2, STATE_TURN_IN_TURN)) { + atd.isTurnStateActive(0, nextInfo.distanceTo / 2, STATE_TURN_IN)) { playAndArriveAtDestination(nextInfo); playedAndArriveAtTarget = true; } diff --git a/OsmAnd/src/net/osmand/plus/routing/data/AnnounceTimeDistances.java b/OsmAnd/src/net/osmand/plus/routing/data/AnnounceTimeDistances.java index 80c5d1e785..27b6aa3c61 100644 --- a/OsmAnd/src/net/osmand/plus/routing/data/AnnounceTimeDistances.java +++ b/OsmAnd/src/net/osmand/plus/routing/data/AnnounceTimeDistances.java @@ -9,16 +9,16 @@ public class AnnounceTimeDistances { // Avoids false negatives: Pre-pone close announcements by this distance to allow for the possible over-estimation of the 'true' lead distance due to positioning error. // A smaller value will increase the timing precision, but at the risk of missing prompts which do not meet the precision limit. // We can research if a flexible value like min(12, x * gps-hdop) has advantages over a constant (x could be 2 or so). - private static final int DEFAULT_GPS_TOLERANCE = 12; + private static final int POSITIONING_TOLERANCE = 12; public final static int STATE_TURN_NOW = 0; - public final static int STATE_PREPARE_TURN = 1; - public final static int STATE_LONG_PREPARE_TURN = 2; - public final static int STATE_TURN_IN_TURN = 3; - public final static int STATE_LONG_PNT_ANNOUNCE = 4; - public final static int STATE_SHORT_PNT_ANNOUNCE = 5; - public final static int STATE_LONG_ALARM_ANNOUNCE = 6; - public final static int STATE_SHORT_ALARM_ANNOUNCE = 7; + public final static int STATE_TURN_IN = 1; + public final static int STATE_PREPARE_TURN = 2; + public final static int STATE_LONG_PREPARE_TURN = 3; + public final static int STATE_SHORT_ALARM_ANNOUNCE = 4; + public final static int STATE_LONG_ALARM_ANNOUNCE = 5; + public final static int STATE_SHORT_PNT_APPROACH = 6; + public final static int STATE_LONG_PNT_APPROACH = 7; public final static int STATE_ARRIVAL_DISTANCE = 10; public final static int STATE_OFF_ROUTE_DISTANCE = 11; @@ -91,11 +91,11 @@ public class AnnounceTimeDistances { float ARRIVAL_DISTANCE_FACTOR = Math.max(settings.ARRIVAL_DISTANCE_FACTOR.getModeValue(appMode), 0.1f); // TURN_NOW_DISTANCE = (int) (DEFAULT_SPEED * 3.6); // 3.6 sec // 50 kmh - 48 m (car), 10 kmh - 20 m, 4 kmh - 15 m, 1 kmh - 12 m - TURN_NOW_DISTANCE = (int) ((DEFAULT_GPS_TOLERANCE + DEFAULT_SPEED * 2.5) * ARRIVAL_DISTANCE_FACTOR); // 3.6 sec + TURN_NOW_DISTANCE = (int) ((POSITIONING_TOLERANCE + DEFAULT_SPEED * 2.5) * ARRIVAL_DISTANCE_FACTOR); // 3.6 sec TURN_NOW_SPEED = TURN_NOW_DISTANCE / TURN_NOW_TIME; // 5 seconds: car - 80 m @ 50 kmh, bicycle - 45 m @ 25 km/h, bicycle - 25 m @ 10 km/h, pedestrian - 18 m @ 4 km/h, - ARRIVAL_DISTANCE = (DEFAULT_GPS_TOLERANCE + DEFAULT_SPEED * 5) * ARRIVAL_DISTANCE_FACTOR; + ARRIVAL_DISTANCE = (POSITIONING_TOLERANCE + DEFAULT_SPEED * 5) * ARRIVAL_DISTANCE_FACTOR; // 50 kmh - 280 m, 10 kmh - 55 m, 4 kmh - 22 m OFF_ROUTE_DISTANCE = DEFAULT_SPEED * 20 * ARRIVAL_DISTANCE_FACTOR; // 20 seconds // assume for backward compatibility speed - 10 m/s @@ -118,7 +118,7 @@ public class AnnounceTimeDistances { if (isTurnStateActive(speed, dist, STATE_TURN_NOW)) { return 0; } else if (isTurnStateActive(speed, dist, STATE_PREPARE_TURN)) { - // STATE_TURN_IN_TURN included + // STATE_TURN_IN included return 1; } else { return -1; @@ -127,7 +127,7 @@ public class AnnounceTimeDistances { public boolean isTurnStateActive(float currentSpeed, double dist, int turnType) { switch (turnType) { - case STATE_TURN_IN_TURN: + case STATE_TURN_IN: return isDistanceLess(currentSpeed, dist, TURN_IN_DISTANCE); case STATE_PREPARE_TURN: return isDistanceLess(currentSpeed, dist, PREPARE_DISTANCE); @@ -135,9 +135,9 @@ public class AnnounceTimeDistances { return isDistanceLess(currentSpeed, dist, PREPARE_LONG_DISTANCE); case STATE_TURN_NOW: return isDistanceLess(currentSpeed, dist, TURN_NOW_DISTANCE, TURN_NOW_SPEED); - case STATE_LONG_PNT_ANNOUNCE: + case STATE_LONG_PNT_APPROACH: return isDistanceLess(currentSpeed, dist, LONG_PNT_ANNOUNCE_RADIUS); - case STATE_SHORT_PNT_ANNOUNCE: + case STATE_SHORT_PNT_APPROACH: return isDistanceLess(currentSpeed, dist, SHORT_PNT_ANNOUNCE_RADIUS); case STATE_LONG_ALARM_ANNOUNCE: return isDistanceLess(currentSpeed, dist, LONG_ALARM_ANNOUNCE_RADIUS); @@ -149,13 +149,13 @@ public class AnnounceTimeDistances { public boolean isTurnStateNotPassed(float currentSpeed, double dist, int turnType) { switch (turnType) { - case STATE_TURN_IN_TURN: + case STATE_TURN_IN: return !isDistanceLess(currentSpeed, dist, TURN_IN_DISTANCE_END); case STATE_PREPARE_TURN: return !isDistanceLess(currentSpeed, dist, PREPARE_DISTANCE_END); case STATE_LONG_PREPARE_TURN: return !isDistanceLess(currentSpeed, dist, PREPARE_LONG_DISTANCE_END); - case STATE_LONG_PNT_ANNOUNCE: + case STATE_LONG_PNT_APPROACH: return !isDistanceLess(currentSpeed, dist, LONG_PNT_ANNOUNCE_RADIUS * 0.5); case STATE_LONG_ALARM_ANNOUNCE: return !isDistanceLess(currentSpeed, dist, LONG_ALARM_ANNOUNCE_RADIUS * 0.5); From 5e5a6518adda14e43d822a6ca0b8d8b840369e25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jind=C5=99ich=20Makovi=C4=8Dka?= Date: Sat, 2 Jan 2021 13:48:37 +0100 Subject: [PATCH 24/37] Switch the remaining builder URLs to https --- plugins/Osmand-Nautical/build.gradle | 2 +- plugins/Osmand-ParkingPlugin/build.gradle | 2 +- plugins/Osmand-SRTMPlugin/build.gradle | 2 +- plugins/Osmand-Skimaps/build.gradle | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/Osmand-Nautical/build.gradle b/plugins/Osmand-Nautical/build.gradle index bc8e716c47..f11e776269 100644 --- a/plugins/Osmand-Nautical/build.gradle +++ b/plugins/Osmand-Nautical/build.gradle @@ -55,7 +55,7 @@ android { repositories { ivy { name = "OsmAndBinariesIvy" - url = "http://builder.osmand.net" + url = "https://builder.osmand.net" layout "pattern", { artifact "ivy/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]" } diff --git a/plugins/Osmand-ParkingPlugin/build.gradle b/plugins/Osmand-ParkingPlugin/build.gradle index 5253c0e52a..ea6a811527 100644 --- a/plugins/Osmand-ParkingPlugin/build.gradle +++ b/plugins/Osmand-ParkingPlugin/build.gradle @@ -55,7 +55,7 @@ android { repositories { ivy { name = "OsmAndBinariesIvy" - url = "http://builder.osmand.net" + url = "https://builder.osmand.net" layout "pattern", { artifact "ivy/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]" } diff --git a/plugins/Osmand-SRTMPlugin/build.gradle b/plugins/Osmand-SRTMPlugin/build.gradle index 589776252a..53465a5ab6 100644 --- a/plugins/Osmand-SRTMPlugin/build.gradle +++ b/plugins/Osmand-SRTMPlugin/build.gradle @@ -55,7 +55,7 @@ android { repositories { ivy { name = "OsmAndBinariesIvy" - url = "http://builder.osmand.net" + url = "https://builder.osmand.net" layout "pattern", { artifact "ivy/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]" } diff --git a/plugins/Osmand-Skimaps/build.gradle b/plugins/Osmand-Skimaps/build.gradle index dcf39f487f..49c7c31c57 100644 --- a/plugins/Osmand-Skimaps/build.gradle +++ b/plugins/Osmand-Skimaps/build.gradle @@ -56,7 +56,7 @@ android { repositories { ivy { name = "OsmAndBinariesIvy" - url = "http://builder.osmand.net" + url = "https://builder.osmand.net" layout "pattern", { artifact "ivy/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]" } From cdbd37f1cad75c5a11156ddc034505d1e82c6db0 Mon Sep 17 00:00:00 2001 From: sonora Date: Sat, 2 Jan 2021 16:40:47 +0100 Subject: [PATCH 25/37] get the math right before we fine-tune --- .../plus/routing/data/AnnounceTimeDistances.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/routing/data/AnnounceTimeDistances.java b/OsmAnd/src/net/osmand/plus/routing/data/AnnounceTimeDistances.java index 27b6aa3c61..355857e10c 100644 --- a/OsmAnd/src/net/osmand/plus/routing/data/AnnounceTimeDistances.java +++ b/OsmAnd/src/net/osmand/plus/routing/data/AnnounceTimeDistances.java @@ -84,18 +84,20 @@ public class AnnounceTimeDistances { // Turn now: 3.5 sec normal speed, 7 second for halfspeed (default) // float TURN_NOW_TIME = 7; - // ** #8749 to keep 1m / 1 sec precision (GPS_TOLERANCE - 12 m) + // ** #8749 to keep 1m / 1 sec precision (POSITIONING_TOLERANCE = 12 m) // 1 kmh - 1 sec, 4 kmh - 2 sec (pedestrian), 10 kmh - 3 sec (*bicycle), 50 kmh - 7 sec (car) float TURN_NOW_TIME = (float) Math.min(Math.sqrt(DEFAULT_SPEED * 3.6), 8); float ARRIVAL_DISTANCE_FACTOR = Math.max(settings.ARRIVAL_DISTANCE_FACTOR.getModeValue(appMode), 0.1f); + // TURN_NOW_DISTANCE = (int) (DEFAULT_SPEED * 3.6); // 3.6 sec // 50 kmh - 48 m (car), 10 kmh - 20 m, 4 kmh - 15 m, 1 kmh - 12 m - TURN_NOW_DISTANCE = (int) ((POSITIONING_TOLERANCE + DEFAULT_SPEED * 2.5) * ARRIVAL_DISTANCE_FACTOR); // 3.6 sec + // 3.6 sec: 43 m (car), 18 m (bicycle), 12 m (walking, capped by POSITIONING_TOLERANCE) + TURN_NOW_DISTANCE = (int) ((POSITIONING_TOLERANCE + Math.max(0., DEFAULT_SPEED * (3.6 - POSITIONING_TOLERANCE / DEFAULT_SPEED))) * ARRIVAL_DISTANCE_FACTOR); TURN_NOW_SPEED = TURN_NOW_DISTANCE / TURN_NOW_TIME; - // 5 seconds: car - 80 m @ 50 kmh, bicycle - 45 m @ 25 km/h, bicycle - 25 m @ 10 km/h, pedestrian - 18 m @ 4 km/h, - ARRIVAL_DISTANCE = (POSITIONING_TOLERANCE + DEFAULT_SPEED * 5) * ARRIVAL_DISTANCE_FACTOR; + // 5 sec: 60 m (car), 25 m (bicycle), 12 m (walking) + ARRIVAL_DISTANCE = (int) ((POSITIONING_TOLERANCE + Math.max(0., DEFAULT_SPEED * (5. - POSITIONING_TOLERANCE / DEFAULT_SPEED))) * ARRIVAL_DISTANCE_FACTOR); // 50 kmh - 280 m, 10 kmh - 55 m, 4 kmh - 22 m OFF_ROUTE_DISTANCE = DEFAULT_SPEED * 20 * ARRIVAL_DISTANCE_FACTOR; // 20 seconds // assume for backward compatibility speed - 10 m/s From 60c521aad501f46338b2ac649f394f1b5ec9c4d1 Mon Sep 17 00:00:00 2001 From: Victor Shcherb Date: Sat, 2 Jan 2021 17:18:21 +0100 Subject: [PATCH 26/37] Add information about turn announcements --- OsmAnd/res/values/strings.xml | 1 + OsmAnd/res/xml/voice_announces.xml | 8 +++++ .../routing/data/AnnounceTimeDistances.java | 35 +++++++++++++++++-- .../fragments/VoiceAnnouncesFragment.java | 16 +++++++++ 4 files changed, 58 insertions(+), 2 deletions(-) diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml index a78818557b..71f91520b5 100644 --- a/OsmAnd/res/values/strings.xml +++ b/OsmAnd/res/values/strings.xml @@ -4010,6 +4010,7 @@ Prefer routes of this difficulty, although routing over harder or easier pistes is still possible if shorter. Off-piste \'Freeride\' and \'Off-piste\' are unofficial routes and passages. Typically ungroomed, unmaintained and not checked in the evening. Enter at your own risk. + Voice prompts times diff --git a/OsmAnd/res/xml/voice_announces.xml b/OsmAnd/res/xml/voice_announces.xml index df7d47b8c3..ee864c0dee 100644 --- a/OsmAnd/res/xml/voice_announces.xml +++ b/OsmAnd/res/xml/voice_announces.xml @@ -91,6 +91,14 @@ android:layout="@layout/preference_with_descr" android:title="@string/arrival_distance" /> + + + diff --git a/OsmAnd/src/net/osmand/plus/routing/data/AnnounceTimeDistances.java b/OsmAnd/src/net/osmand/plus/routing/data/AnnounceTimeDistances.java index 355857e10c..b9129e0d10 100644 --- a/OsmAnd/src/net/osmand/plus/routing/data/AnnounceTimeDistances.java +++ b/OsmAnd/src/net/osmand/plus/routing/data/AnnounceTimeDistances.java @@ -1,6 +1,7 @@ package net.osmand.plus.routing.data; import net.osmand.Location; +import net.osmand.plus.OsmandApplication; import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.plus.settings.backend.OsmandSettings; import net.osmand.plus.voice.AbstractPrologCommandPlayer; @@ -20,8 +21,6 @@ public class AnnounceTimeDistances { public final static int STATE_SHORT_PNT_APPROACH = 6; public final static int STATE_LONG_PNT_APPROACH = 7; - public final static int STATE_ARRIVAL_DISTANCE = 10; - public final static int STATE_OFF_ROUTE_DISTANCE = 11; // Default speed to have comfortable announcements (Speed in m/s) // initial value is updated from default speed settings anyway @@ -199,4 +198,36 @@ public class AnnounceTimeDistances { public int calcDistanceWithoutDelay(float speed, int dist) { return (int) (dist - voicePromptDelayTimeSec * speed); } + + public String getTurnsDescription() { + StringBuilder turnDescriptions = new StringBuilder(); + turnDescriptions.append(String.format("Turn (now): %d m, %d seconds\n", TURN_NOW_DISTANCE, + (int) (TURN_NOW_DISTANCE / TURN_NOW_SPEED))); + turnDescriptions.append(String.format("Turn (approach): %d m, %d seconds\n", TURN_IN_DISTANCE, + (int) (TURN_IN_DISTANCE / DEFAULT_SPEED))); + if (PREPARE_DISTANCE_END <= PREPARE_DISTANCE) { + turnDescriptions.append(String.format("Turn (prepare): %d m, %d seconds\n", PREPARE_DISTANCE, + (int) (PREPARE_DISTANCE / DEFAULT_SPEED))); + } + if (PREPARE_LONG_DISTANCE_END <= PREPARE_LONG_DISTANCE) { + turnDescriptions.append(String.format("Turn (early prepare): %d m, %d seconds\n", PREPARE_LONG_DISTANCE, + (int) (PREPARE_LONG_DISTANCE / DEFAULT_SPEED))); + } + turnDescriptions.append(String.format("Finish: %d m, %d seconds\n", (int) getArrivalDistance(), + (int) (getArrivalDistance() / DEFAULT_SPEED))); + if(getOffRouteDistance() > 0) { + turnDescriptions.append(String.format("Off-route (prepare): %d m, %d seconds\n", (int) getOffRouteDistance(), + (int) (getOffRouteDistance() / DEFAULT_SPEED))); + } + turnDescriptions.append(String.format("Alarm (now): %d m, %d seconds\n", SHORT_ALARM_ANNOUNCE_RADIUS, + (int) (SHORT_ALARM_ANNOUNCE_RADIUS / DEFAULT_SPEED))); + turnDescriptions.append(String.format("Alarm (prepare): %d m, %d seconds\n", LONG_ALARM_ANNOUNCE_RADIUS, + (int) (LONG_ALARM_ANNOUNCE_RADIUS / DEFAULT_SPEED))); + turnDescriptions.append(String.format("POI/Waypoint (now): %d m, %d seconds\n", SHORT_PNT_ANNOUNCE_RADIUS, + (int) (SHORT_PNT_ANNOUNCE_RADIUS / DEFAULT_SPEED))); + turnDescriptions.append(String.format("POI/Waypoint (prepare): %d m, %d seconds\n", LONG_PNT_ANNOUNCE_RADIUS, + (int) (LONG_PNT_ANNOUNCE_RADIUS / DEFAULT_SPEED))); + + return turnDescriptions.toString(); + } } diff --git a/OsmAnd/src/net/osmand/plus/settings/fragments/VoiceAnnouncesFragment.java b/OsmAnd/src/net/osmand/plus/settings/fragments/VoiceAnnouncesFragment.java index e1cd1f5d39..5ed061928d 100644 --- a/OsmAnd/src/net/osmand/plus/settings/fragments/VoiceAnnouncesFragment.java +++ b/OsmAnd/src/net/osmand/plus/settings/fragments/VoiceAnnouncesFragment.java @@ -17,6 +17,7 @@ import androidx.preference.PreferenceViewHolder; import androidx.preference.SwitchPreferenceCompat; import net.osmand.AndroidUtils; +import net.osmand.plus.OsmandPlugin; import net.osmand.plus.R; import net.osmand.plus.UiUtilities; import net.osmand.plus.Version; @@ -26,6 +27,7 @@ import net.osmand.plus.download.DownloadActivity; import net.osmand.plus.download.DownloadActivityType; import net.osmand.plus.helpers.FileNameTranslationHelper; import net.osmand.plus.helpers.enums.MetricsConstants; +import net.osmand.plus.routing.data.AnnounceTimeDistances; import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.plus.settings.backend.OsmandSettings; import net.osmand.plus.settings.preferences.ListPreferenceEx; @@ -93,6 +95,7 @@ public class VoiceAnnouncesFragment extends BaseSettingsFragment implements OnPr setupKeepInformingPref(); setupArrivalAnnouncementPref(); + updateVoicePromptsTimes(); setupVoiceProviderPref(); if (!Version.isBlackberry(app)) { @@ -104,6 +107,16 @@ public class VoiceAnnouncesFragment extends BaseSettingsFragment implements OnPr setupSpeedCamerasAlert(); } + private void updateVoicePromptsTimes() { + Preference pref = findPreference("voice_prompts_timetable"); + if (OsmandPlugin.isDevelopment()) { + AnnounceTimeDistances atd = new AnnounceTimeDistances(getSelectedAppMode(), settings); + pref.setSummary(atd.getTurnsDescription().trim()); + } else { + pref.setVisible(false); + } + } + private void setupSpeedLimitExceedPref() { //array size must be equal! Float[] valuesKmh = new Float[] {-10f, -7f, -5f, 0f, 5f, 7f, 10f, 15f, 20f}; @@ -259,6 +272,9 @@ public class VoiceAnnouncesFragment extends BaseSettingsFragment implements OnPr settings.SPEAK_SPEED_CAMERA.getId(), false, ApplyQueryType.SNACK_BAR); } } + if (prefId.equals(settings.ARRIVAL_DISTANCE_FACTOR.getId())) { + updateVoicePromptsTimes(); + } if (prefId.equals(settings.AUDIO_MANAGER_STREAM.getId())) { return onConfirmPreferenceChange( settings.AUDIO_MANAGER_STREAM.getId(), newValue, ApplyQueryType.SNACK_BAR); From bbd7edf2a6f25ebe4cf8b6d34f9b76cec69f2a6d Mon Sep 17 00:00:00 2001 From: Victor Shcherb Date: Sat, 2 Jan 2021 17:29:16 +0100 Subject: [PATCH 27/37] Add toast on click --- .../settings/fragments/VoiceAnnouncesFragment.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/OsmAnd/src/net/osmand/plus/settings/fragments/VoiceAnnouncesFragment.java b/OsmAnd/src/net/osmand/plus/settings/fragments/VoiceAnnouncesFragment.java index 5ed061928d..156cbd9d90 100644 --- a/OsmAnd/src/net/osmand/plus/settings/fragments/VoiceAnnouncesFragment.java +++ b/OsmAnd/src/net/osmand/plus/settings/fragments/VoiceAnnouncesFragment.java @@ -9,6 +9,7 @@ import android.view.LayoutInflater; import android.view.View; import android.widget.ImageView; import android.widget.TextView; +import android.widget.Toast; import androidx.appcompat.widget.SwitchCompat; import androidx.core.content.ContextCompat; @@ -110,8 +111,16 @@ public class VoiceAnnouncesFragment extends BaseSettingsFragment implements OnPr private void updateVoicePromptsTimes() { Preference pref = findPreference("voice_prompts_timetable"); if (OsmandPlugin.isDevelopment()) { - AnnounceTimeDistances atd = new AnnounceTimeDistances(getSelectedAppMode(), settings); + final AnnounceTimeDistances atd = new AnnounceTimeDistances(getSelectedAppMode(), settings); pref.setSummary(atd.getTurnsDescription().trim()); + pref.setEnabled(true); + pref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + app.showToastMessage(atd.getTurnsDescription().trim()); + return true; + } + }); } else { pref.setVisible(false); } From a14921fb0a2fbab03cb24cd69b05d203b7b99614 Mon Sep 17 00:00:00 2001 From: Vitaliy Date: Sat, 2 Jan 2021 18:40:22 +0200 Subject: [PATCH 28/37] Minor UI fixes with voice_prompts_timetable --- OsmAnd/res/layout/preference_with_descr.xml | 1 + OsmAnd/res/xml/voice_announces.xml | 2 -- .../fragments/VoiceAnnouncesFragment.java | 20 ++++++++----------- 3 files changed, 9 insertions(+), 14 deletions(-) diff --git a/OsmAnd/res/layout/preference_with_descr.xml b/OsmAnd/res/layout/preference_with_descr.xml index 1cbe632f2c..ca4938a51d 100644 --- a/OsmAnd/res/layout/preference_with_descr.xml +++ b/OsmAnd/res/layout/preference_with_descr.xml @@ -56,6 +56,7 @@ android:layout_height="wrap_content" android:letterSpacing="@dimen/description_letter_spacing" android:maxLines="4" + android:scrollbars="none" android:textColor="?android:textColorSecondary" android:textSize="@dimen/default_desc_text_size" osmand:typeface="@string/font_roboto_regular" /> diff --git a/OsmAnd/res/xml/voice_announces.xml b/OsmAnd/res/xml/voice_announces.xml index ee864c0dee..154574399c 100644 --- a/OsmAnd/res/xml/voice_announces.xml +++ b/OsmAnd/res/xml/voice_announces.xml @@ -91,12 +91,10 @@ android:layout="@layout/preference_with_descr" android:title="@string/arrival_distance" /> - Date: Sat, 2 Jan 2021 19:36:34 +0100 Subject: [PATCH 29/37] Improve readability --- .../routing/data/AnnounceTimeDistances.java | 47 ++++++++++--------- 1 file changed, 25 insertions(+), 22 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/routing/data/AnnounceTimeDistances.java b/OsmAnd/src/net/osmand/plus/routing/data/AnnounceTimeDistances.java index b9129e0d10..63278e4bb0 100644 --- a/OsmAnd/src/net/osmand/plus/routing/data/AnnounceTimeDistances.java +++ b/OsmAnd/src/net/osmand/plus/routing/data/AnnounceTimeDistances.java @@ -199,35 +199,38 @@ public class AnnounceTimeDistances { return (int) (dist - voicePromptDelayTimeSec * speed); } + private void appendTurnDesc(StringBuilder s, String name, int dist) { + appendTurnDesc(s, name, dist, DEFAULT_SPEED); + } + + private void appendTurnDesc(StringBuilder s, String name, int dist, float speed) { + int minDist = (dist / 5) * 5; + int time = (int) (dist / speed); + if(time > 15) { + // round to 5 + time = (time / 5) * 5; + } + s.append(String.format("%s: %d - %d m, %d sec\n", name, minDist, minDist + 5, time)); + } + public String getTurnsDescription() { StringBuilder turnDescriptions = new StringBuilder(); - turnDescriptions.append(String.format("Turn (now): %d m, %d seconds\n", TURN_NOW_DISTANCE, - (int) (TURN_NOW_DISTANCE / TURN_NOW_SPEED))); - turnDescriptions.append(String.format("Turn (approach): %d m, %d seconds\n", TURN_IN_DISTANCE, - (int) (TURN_IN_DISTANCE / DEFAULT_SPEED))); + appendTurnDesc(turnDescriptions, "Turn (now)", TURN_NOW_DISTANCE, TURN_NOW_SPEED); + appendTurnDesc(turnDescriptions, "Turn (approach)", TURN_IN_DISTANCE); if (PREPARE_DISTANCE_END <= PREPARE_DISTANCE) { - turnDescriptions.append(String.format("Turn (prepare): %d m, %d seconds\n", PREPARE_DISTANCE, - (int) (PREPARE_DISTANCE / DEFAULT_SPEED))); + appendTurnDesc(turnDescriptions, "Turn (prepare)", PREPARE_DISTANCE); } if (PREPARE_LONG_DISTANCE_END <= PREPARE_LONG_DISTANCE) { - turnDescriptions.append(String.format("Turn (early prepare): %d m, %d seconds\n", PREPARE_LONG_DISTANCE, - (int) (PREPARE_LONG_DISTANCE / DEFAULT_SPEED))); + appendTurnDesc(turnDescriptions, "Turn (early prepare)", PREPARE_LONG_DISTANCE); } - turnDescriptions.append(String.format("Finish: %d m, %d seconds\n", (int) getArrivalDistance(), - (int) (getArrivalDistance() / DEFAULT_SPEED))); - if(getOffRouteDistance() > 0) { - turnDescriptions.append(String.format("Off-route (prepare): %d m, %d seconds\n", (int) getOffRouteDistance(), - (int) (getOffRouteDistance() / DEFAULT_SPEED))); + appendTurnDesc(turnDescriptions, "Finish", (int) getArrivalDistance()); + if (getOffRouteDistance() > 0) { + appendTurnDesc(turnDescriptions, "Off-route", (int) getOffRouteDistance()); } - turnDescriptions.append(String.format("Alarm (now): %d m, %d seconds\n", SHORT_ALARM_ANNOUNCE_RADIUS, - (int) (SHORT_ALARM_ANNOUNCE_RADIUS / DEFAULT_SPEED))); - turnDescriptions.append(String.format("Alarm (prepare): %d m, %d seconds\n", LONG_ALARM_ANNOUNCE_RADIUS, - (int) (LONG_ALARM_ANNOUNCE_RADIUS / DEFAULT_SPEED))); - turnDescriptions.append(String.format("POI/Waypoint (now): %d m, %d seconds\n", SHORT_PNT_ANNOUNCE_RADIUS, - (int) (SHORT_PNT_ANNOUNCE_RADIUS / DEFAULT_SPEED))); - turnDescriptions.append(String.format("POI/Waypoint (prepare): %d m, %d seconds\n", LONG_PNT_ANNOUNCE_RADIUS, - (int) (LONG_PNT_ANNOUNCE_RADIUS / DEFAULT_SPEED))); - + appendTurnDesc(turnDescriptions, "Alarm (now)", SHORT_ALARM_ANNOUNCE_RADIUS); + appendTurnDesc(turnDescriptions, "Alarm (prepare)", LONG_ALARM_ANNOUNCE_RADIUS); + appendTurnDesc(turnDescriptions, "POI/Waypoint (now)", SHORT_PNT_ANNOUNCE_RADIUS); + appendTurnDesc(turnDescriptions, "POI/Waypoint (prepare)", LONG_PNT_ANNOUNCE_RADIUS); return turnDescriptions.toString(); } } From c9707537637b483034890c535535109c50dfef02 Mon Sep 17 00:00:00 2001 From: Victor Shcherb Date: Sat, 2 Jan 2021 20:23:16 +0100 Subject: [PATCH 30/37] Simplify math but keep result the same --- .../net/osmand/plus/routing/data/AnnounceTimeDistances.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/routing/data/AnnounceTimeDistances.java b/OsmAnd/src/net/osmand/plus/routing/data/AnnounceTimeDistances.java index 63278e4bb0..682a7d8430 100644 --- a/OsmAnd/src/net/osmand/plus/routing/data/AnnounceTimeDistances.java +++ b/OsmAnd/src/net/osmand/plus/routing/data/AnnounceTimeDistances.java @@ -92,11 +92,11 @@ public class AnnounceTimeDistances { // TURN_NOW_DISTANCE = (int) (DEFAULT_SPEED * 3.6); // 3.6 sec // 50 kmh - 48 m (car), 10 kmh - 20 m, 4 kmh - 15 m, 1 kmh - 12 m // 3.6 sec: 43 m (car), 18 m (bicycle), 12 m (walking, capped by POSITIONING_TOLERANCE) - TURN_NOW_DISTANCE = (int) ((POSITIONING_TOLERANCE + Math.max(0., DEFAULT_SPEED * (3.6 - POSITIONING_TOLERANCE / DEFAULT_SPEED))) * ARRIVAL_DISTANCE_FACTOR); + TURN_NOW_DISTANCE = (int) (Math.max(POSITIONING_TOLERANCE, DEFAULT_SPEED * 3.6) * ARRIVAL_DISTANCE_FACTOR); TURN_NOW_SPEED = TURN_NOW_DISTANCE / TURN_NOW_TIME; // 5 sec: 60 m (car), 25 m (bicycle), 12 m (walking) - ARRIVAL_DISTANCE = (int) ((POSITIONING_TOLERANCE + Math.max(0., DEFAULT_SPEED * (5. - POSITIONING_TOLERANCE / DEFAULT_SPEED))) * ARRIVAL_DISTANCE_FACTOR); + ARRIVAL_DISTANCE = (int) (Math.max(POSITIONING_TOLERANCE, DEFAULT_SPEED * 5.) * ARRIVAL_DISTANCE_FACTOR); // 50 kmh - 280 m, 10 kmh - 55 m, 4 kmh - 22 m OFF_ROUTE_DISTANCE = DEFAULT_SPEED * 20 * ARRIVAL_DISTANCE_FACTOR; // 20 seconds // assume for backward compatibility speed - 10 m/s From efc09271e01d88887dc3ad9c190c3f40fa90bf57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20H=C3=A5ll?= Date: Sat, 2 Jan 2021 21:33:05 +0000 Subject: [PATCH 31/37] Translated using Weblate (Swedish) Currently translated at 64.9% (2333 of 3590 strings) --- OsmAnd/res/values-sv/strings.xml | 86 +++++++++++++++++++++++++++----- 1 file changed, 73 insertions(+), 13 deletions(-) diff --git a/OsmAnd/res/values-sv/strings.xml b/OsmAnd/res/values-sv/strings.xml index 982528dcd2..a76b8f97b3 100644 --- a/OsmAnd/res/values-sv/strings.xml +++ b/OsmAnd/res/values-sv/strings.xml @@ -805,7 +805,7 @@ Nyttjat utrymme är {1} MB. Ett fel uppstod vid ruttberäkningen Fel: Den beräknade rutten är tom Ny rutt beräknad, avstånd - Koordinaterna är ogiltiga! + Ogiltiga koordinater Tillbaka till OsmAnd-kartan Den senaste körningen av OsmAnd kraschade. Loggen finns i {0}. Rapportera felet och bifoga gärna loggfilen. Sparar GPX-spår till SD-kortet … @@ -857,8 +857,8 @@ Nyttjat utrymme är {1} MB. Latitud Longitud DDD.DD - DDD MM.MM - DDD MM SS.SS + DDD MM.MMM + DDD MM SS.S Vägvisning Aktivera exakt ruttning för beräkning utan småfel. Mycket begränsad av avståndet samt långsam. Lat %1$.3f, long %2$.3f @@ -902,7 +902,7 @@ Nyttjat utrymme är {1} MB. Gatunamn Husnummer Konfigurera inspelningen av dina resor. - Trippinspelning + Inspelning av resa Minskar kompassmissvisningen men blir trögare. Använd Kalman-filter App-tema @@ -1153,8 +1153,7 @@ Nyttjat utrymme är {1} MB. Sortera efter namn Ankomstmeddelande Hur tidigt vill du höra ankomstmeddelandet? - - Online OSM-kartklassificering med bilder. + Online OSM-kartklassificering med bilder. Spara data som GPX-fil eller importera waypoints till \"Favoriter\"? Favoriter utdelade via OsmAnd Skickar nod… @@ -1225,7 +1224,7 @@ Nyttjat utrymme är {1} MB. "Denna modul aktiverar funktionen att antingen spela in och spara dina spår genom att du trycker på widgeten GPX-loggning på kartskärmen eller att alla dina rutter sparas automatiskt i en GPX-fil. \n \nInspelade spår kan delas ut till vänner eller användas som bidrag till OSM. Idrottsmän kan använda inspelade spår för att följa sin träning. Viss grundläggande spåranalys kan göras direkt i OsmAnd, såsom varvtider, genomsnittshastighet o.s.v. och spår kan givetvis också analyseras i efterhand i speciella analysverktyg från tredje part. " - Inspelning av resor + Inspelning av resa h Längd Sträcka @@ -1402,7 +1401,7 @@ Nyttjat utrymme är {1} MB. Kom ihåg mitt val Uppdatera Hämta - Laddar ner + Laddar ner… Hämtningen lyckades Ett oväntat fel uppstod Åtgärd {0} @@ -1616,7 +1615,7 @@ Long %2$s Minuter per kilometer Minuter per engelsk mil Sjömil i timmen (knop) - Trippinspelning + Inspelning av resa Navigering Körs i bakgrunden Lägg till ny @@ -1835,7 +1834,8 @@ Tillgängligt utrymme är blott {2} MB. Inaktiv Ange en giltig e-postadress Ange publikt namn - Tack för att du prenumererar på live-uppdateringar! + Tack för att du stödjer OsmAnd! +\nFör att aktivera alla nya funktioner behöver du starta om OsmAnd. Delar av din donation kommer att skickas till OSM-användare som skickar in kartändringar i det området. Prenumerationsinställningar Köp en OsmAnd Live-prenumeration först @@ -2055,7 +2055,7 @@ Om du tycker om OsmAnd och OSM och vill stödja dem så är detta ett utmärkt s Fin Öppna platskod Ogiltig OLC - +\n Kort OLC Vänligen tillhandahåll fullständig kod Filen kan inte flyttas. @@ -2439,7 +2439,18 @@ Vänligen tillhandahåll fullständig kod Min/Max Denna väg kan vara för lång tid att beräkna. Lägg till mellanliggande destinationer om inget resultat finns inom 10 minuter. "OsmAnd (OSM Automated Navigation Directions) är en kartnavigationsapp med tillgång till gratis, världsomfattande OpenStreetMap (OSM)-data av hög kvalitet. Njut av röstnavigation eller visuell navigation, visning av POI (points of interest - nyttoplatser), att skapa och hantera GPX-spår, visa höjdkurvor och höjdinfo (via plugin), val mellan bil-, cykel-, fotgängar-lägen, OSM-redigering och mycket mer." - GPS-navigering • Du kan välja mellan offline (inga roaming-avgifter när du är utomlands) eller på online(snabbare)-läge • Turn-by-Turn röstguidning leder dig längs vägen (inspelade och genererade röster) • Rutten uppdateras om du avviker från den. • Filval och beräknad ankomsttid hjälper dig längs vägen • För att göra din resa säkrare, dag/natt-läge växlar automatiskt • Du kan välja att visa hastighetsbegränsningar och få påminnelser om du överskrider den • Kartzoomen anpassar sig till din hastighet. • Du kan söka destinationer efter adress eller efter typ (t.ex.: parkering, restaurang, hotell, bensinstation, museum), eller av geografiska koordinater • Stödjer mellanliggande punkter på din rutt • Du kan spela in dina egna eller ladda upp en GPX-spår och följa dem + GPS-navigering +\n• Välj mellan offline- (inga roaming-avgifter när du är utomlands) eller online-läge a(snabbare) +\n• Steg-för-steg röstguidning leder dig längs vägen (inspelade och genererade röster) +\n• Färdvägen uppdateras närhellst du avviker från den. +\n• Guidning vid val av filer, gatunamn och beräknad ankomsttid hjälper dig längs vägen +\n• Dag-/natt-läge för appen växlas automatiskt för att göra din resa säkrare +\n• Visa hastighetsbegränsningar och få påminnelser om du överskrider den +\n• Kartzoomen anpassar sig till din hastighet +\n• Sök destinationer genom adress, typ (t.ex.: parkering, restaurang, hotell, bensinstation, museum), eller geografiska koordinater +\n• Stödjer användande av delmål på din resväg +\n• Spela in dina egna, eller ladda upp en GPX-spår och följa dem +\n Karta \n • Visar Poi (point of interests) runt omkring dig \n • Justera kartan baserat på riktning (eller kompass) @@ -2601,7 +2612,12 @@ Vänligen tillhandahåll fullständig kod \n• Kompakta offline vektorkartor som uppdateras minst en gång i månaden \n \n• Val mellan data för hela regionen och bara vägnätet (Exempel: Hela Japan är 700 MB eller endast vägnätet för 200 MB) - Säkerhetsfunktioner • Valfri växling mellan dag-/nattläge • Valfri visning av hastighet, med en påminnelse om du överskrider den • Valfri hastighetsbaserad zoomning • Dela din position så att dina vänner kan hitta dig + Säkerhetsfunktioner +\n• Valfri växling mellan dag-/nattläge +\n• Valfri visning av hastighet, med en påminnelse om du överskrider den +\n• Valfri hastighetsbaserad zoomning +\n• Dela din position så att dina vänner kan hitta dig +\n Funktioner för cykel och gående • Se vägar för gående och cyklande samt vandringsstigar, utmärkta för utomhusaktiviteter • Speciella ruttval och visningsläge för cykel och gående • Valfria kollektivtrafiksplatser (buss, spårvagn, tåg) inklusive linjenamn • Valfri reseinspelning till lokal GPX-fil eller onlinetjänst • Valfri visning av hastighet och höjd • Visa konturlinjer och höjdreliefer (via separat plugin) Bidra direkt till OSM \n• Rapportera databuggar @@ -3038,4 +3054,48 @@ Vänligen tillhandahåll fullständig kod Prenumerationen på OsmAnd Live är Skicka GPX fil till OpenStreetMap Ange taggar sepparerade med komma (,). + Välj + Anpassad + Dirigeringspilar + Senast ändrad + Klar + Nästa segment + Navigationsprofil + Bilder på gatunivå + Är du säker på att du vill avfärda alla ändringar i den plannerade färdvägen\? + Inspelning av resa + Följ färdväg + välj en annan färdväg + Början på färdvägen + Närmaste punkt + Ta bort adress + Lägg till adress + Ange adress + Korta ner innan + Korta ner efter + Ändra typ av färdväg innan + Ändra typ av färdväg efter + Förenklad färdväg + Bara färdvägens linje kommer sparas, delmålen tas bort. + %s GPX filer valda + Filnamn + Spela in + Systemstandard + Alla efterföljande delar + Tidigare delar + Alla tidigare delar + Bara valda delar kommer bli omräknad med vald profil. + Alla kommande delar kommer bli omräknad med den valda profilen. + Alla tidigare delar kommer bli omräknade med den valda profilen. + Öppna sparad färdväg + är sparad + Upprepa + Vänligen lägg till minst två punkter. + Senast ändrad + Namn: A – Ö + Namn: Ö – A + Ikoner för start och mål + Betalningen för prenumerationen är i enlighet med vad som valts. Du kan avbryta den i AppGallery när som hellst. + Undvik resor till fots + Undvik resor till \ No newline at end of file From d612786254e7b26f7505b2d7ebba009bf12244db Mon Sep 17 00:00:00 2001 From: Jorge Sanz Sanfructuoso Date: Sat, 2 Jan 2021 20:03:46 +0000 Subject: [PATCH 32/37] Translated using Weblate (Spanish) Currently translated at 100.0% (3590 of 3590 strings) --- OsmAnd/res/values-es/strings.xml | 165 ++++++++++++++++++++++--------- 1 file changed, 117 insertions(+), 48 deletions(-) diff --git a/OsmAnd/res/values-es/strings.xml b/OsmAnd/res/values-es/strings.xml index e8bec4e6ef..484933e2aa 100644 --- a/OsmAnd/res/values-es/strings.xml +++ b/OsmAnd/res/values-es/strings.xml @@ -14,7 +14,7 @@ Usar superpuestos fluorescentes Usa colores fluorescentes para mostrar trazas y rutas. Edición sin conexión - Usa siempre edición sin conexión. + Si la edición sin conexión está habilitada, los cambios se guardarán primero localmente y se cargarán a pedido; de lo contrario, los cambios se cargarán inmediatamente. Los cambios de PDI dentro de la aplicación no afectan a los archivos de mapa descargados; en su lugar, los cambios se guardan como un archivo en el dispositivo. Subiendo… {0} PDI/Notas de OSM subidos @@ -64,7 +64,7 @@ Ajustes globales de la aplicación Usuario de OSM Necesario para envíos a openstreetmap.org. - Contraseña de OSM + Contraseña Modo reposo OsmAnd se ejecuta en modo reposo con la pantalla apagada. Descargar un mapa vectorial sin conexión de esta ubicación en «Ajustes → Gestionar mapas», o cambiar al complemento «Mapas en línea». @@ -616,7 +616,7 @@ \nDescarga los mapas de teselas directamente a través de fuentes en línea, o prepararlos para tu uso sin conexión (copiándolos manualmente en la carpeta de datos OsmAnd) como una base de datos SQLite que puede generarse con varias herramientas de preparación de mapas de terceros. Muestra los ajustes para activar en modo reposo el seguimiento y la navegación, activando periódicamente el dispositivo GPS (con la pantalla apagada). Activa las funciones de accesibilidad del dispositivo directamente en OsmAnd. Facilita por ejemplo, el ajuste de la velocidad de la voz para voces de texto a voz, la configuración de navegación de pantalla con el panel direccional, usando la rueda de desplazamiento para el control del zoom, o la retroalimentación de texto a voz, por ejemplo, para anunciar la ubicación automáticamente. - Este complemento muestra los ajustes de funciones de desarrollo y depuración para probar la simulación de rutas, el rendimiento del renderizado, o las indicaciones por voz. Estos ajustes están destinados para los desarrolladores y no son necesarios para el usuario general. + Ajustes de funciones de desarrollo y depuración, como simulación de navegación, el rendimiento del renderizado, o las indicaciones por voz. Destinados a desarrolladores y no son necesarios para el uso normal de la aplicación. Complementos Los complementos activan ajustes avanzados y funcionalidades adicionales. Complementos @@ -976,7 +976,7 @@ Quedan %1$d archivos %1$d archivos para descargar Versión completa - Descartar ruta + ¿Descartar ruta\? Parar navegación Limpiar destino No está conectado a una red Wi-Fi. ¿Usar la conexión actual a Internet para descargar? @@ -1054,15 +1054,15 @@ Región de conducción: EEUU, Europa, Reino Unido, Asia u otras. Región de conducción Zoom mínimo - Expira (minutos) + Tiempo expirado (minutos) Fuente de teselas «%1$s» guardada Datos de teselas: %1$s - Expira (minutos): %1$s + Tiempo de expiración (minutos): %1$s Información Información de la versión, licencias, miembros del proyecto Elegir existente… - Zooms descargados: %1$s - Mercator elíptica + Niveles de zooms descargados: %1$s + Proyección Mercator elíptica Información de FPS Mapa base mundial Ampliar mapa @@ -1537,7 +1537,7 @@ Límite de altura Indica la altura permitida del vehículo en rutas. Recálculo inteligente de ruta - Para viajes largos, recalcula sólo la parte inicial de la ruta. + Recalcula solo la parte inicial de la ruta, útil para viajes largos. Desactivado Color por red de afiliación Color por símbolo de senderismo OSMC @@ -1728,7 +1728,7 @@ Preguntas Frecuentes Preguntas Frecuentes Vista del mapa - Búsqueda en el mapa + Buscando en el mapa Planificación de viaje Instalación y solución de problemas Artículos técnicos @@ -1919,7 +1919,7 @@ Informe Añade marcadores a través del mapa No se encontraron puntos de referencia - El nombre del archivo contiene caracteres ilegales + Carácter ilegal en el nombre del archivo Modo del mapa Fino Medio @@ -1955,7 +1955,7 @@ Indica la dirección del destino mediante vibración. Activa la navegación para cambios en vivo de OsmAnd. Navegación con OsmAnd Live - Destino indefinido + Complemento de accesibilidad: sin destino definido Rumbo magnético Rumbo relativo Traza actual @@ -2368,19 +2368,19 @@ \n • (Opcional) Grabación del viaje en modo reposo (mientras el dispositivo está bloqueado) \n OsmAnd es un software de código abierto, activamente desarrollado. Cualquiera puede contribuir con la aplicación informando sobre errores, mejorando las traducciones o desarrollando nuevas funciones. Además, el proyecto también depende de contribuciones financieras para desarrollar y probar nuevas funcionalidades. \n - Cobertura y calidad aproximada del mapa: -\n • Europa Occidental: **** -\n • Europa Oriental: *** -\n • Rusia: *** -\n • Norteamérica: *** -\n • Sudamérica: ** -\n • Asia: ** -\n • Japón y Corea: *** -\n • Medio Oriente: ** -\n • África: ** -\n • Antártida: * -\n -\n ¡Más países alrededor del globo están disponibles para descargar! Desde Afganistán a Zimbabue, desde Australia a Estados Unidos. Argentina, Brasil, Canadá, Francia, Alemania, México, Reino Unido, España, … + Cobertura y calidad aproximada del mapa: +\n • Europa Occidental: **** +\n • Europa Oriental: *** +\n • Rusia: *** +\n • Norteamérica: *** +\n • Sudamérica: ** +\n • Asia: ** +\n • Japón y Corea: *** +\n • Medio Oriente: ** +\n • África: ** +\n • Antártida: * +\n ¡Más países alrededor del globo están disponibles para descargar! +\n Desde Afganistán a Zimbabue, desde Australia a Estados Unidos. Argentina, Brasil, Canadá, Francia, Alemania, México, Reino Unido, España, … \n El nombre contiene demasiadas mayúsculas. ¿Continuar? Descarga el mapa de «Curvas de nivel» para usarlas en esta región. @@ -2516,7 +2516,7 @@ Usar ubicación Añade la ubicación como punto de partida para planificar la ruta perfecta. Mi ubicación - Finalizar + Terminar Planificar ruta Ordenar Ingresar coordenadas @@ -2644,7 +2644,7 @@ Copiar nombre de ubicación/PDI Ubicación sin nombre Mostrar notas de OSM cerradas - Mostrar/ocultar notas de OSM en el mapa. + Mostrar u ocultar notas de OSM en el mapa. Túnel adelante Túneles Actual @@ -3118,9 +3118,9 @@ Cambia el zoom del mapa desplazando la rueda hacia arriba y hacia abajo. Salir te devuelve a la aplicación WunderLINQ. Usa WunderLINQ para controlar Añadir al menos un elemento a la lista en los ajustes de «Acción rápida» - Esquí alpino/de descenso + Esquí alpino y de descenso Pistas de esquí alpino o de descenso y acceso a remontes mecánicos. - Esquí de travesía/nórdico + Esquí de travesía y nórdico Senderos para esquí nórdico o de travesía. Esquí de travesía Rutas para el esquí de montaña. @@ -3358,7 +3358,7 @@ Estima la hora de llegada para tipos de vías desconocidos y límites de velocidad en todas las vías (puede afectar al enrutado) Esquí de travesía Simular la ubicación usando una traza GPX grabada. - El nombre de archivo está vacío + Nombre de archivo vacío Traza guardada Revertir Un botón que añade el centro de la pantalla como punto de partida. Pedirá luego que se fije el destino o iniciará el cálculo de la ruta. @@ -3424,9 +3424,9 @@ Recálculo de la ruta Anunciar Nombre de usuario y clave - La configuración se aplica a todos los perfiles. + Esta configuración de complementos es global, y se aplica a todos los perfiles Edición de OSM - Puedes ver todas las ediciones y errores de osm no enviadas en %1$s. Los puntos enviados no se muestran en OsmAnd. + Puedes ver todas las ediciones y errores de osm no subidos en %1$s. Los puntos ya subidos no se muestrarán más. OSM El icono se muestra mientras navega o mientras te estés moviendo. Icono que se muestra en reposo. @@ -3520,7 +3520,7 @@ Mapa de sombreado utilizando tonos oscuros para mostrar pendientes, picos y tierras bajas. Pendiente utiliza colores para visualizar la inclinación del terreno. Establezca los niveles de zoom mínimo y máximo en los que se mostrará la capa. - Se necesitan mapas adicionales para ver Sombreado en el mapa. + Se necesitan mapas adicionales para ver sombreado en el mapa. Se necesitan mapas adicionales para ver Pendientes en el mapa. Puede leer más sobre Pendientes en %1$s. Transparencia @@ -3542,7 +3542,7 @@ Recalcular ruta en caso de desvío %1$s de %2$s Cuestas - Mostrar / esconder terreno + Mostrar o esconder terreno Esconder terreno Mostrar terreno Un botón para mostrar o esconder una capa de terreno en el mapa. @@ -3591,11 +3591,11 @@ Marcadores de mapa Favoritos Perfiles de navegación - Mostrar/ocultar transporte público + Mostrar u ocultar transporte público Ocultar transporte público Mostrar transporte público - Crear / Editar POI - Agregar / Editar Favorito + Crear o editar POI + Agregar o editar Favorito Agregar perfil Aragones Color personalizado @@ -3787,7 +3787,7 @@ Proporcione la longitud de su vehículo, se pueden aplicar algunas restricciones de rutas para vehículos largos. Eliminar el punto de destino más cercano 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á. + Elimina el próximo destino de su ruta. Si se trata del destino, la navegación se detendrá. Descargar mapas de Wikipedia Abrir la pista existente Crea una nueva ruta @@ -3802,7 +3802,7 @@ Nombre de archivo %s archivos de traza seleccionados GRABAR - Especifica el intervalo de grabación general para trazas (habilitado a través del widget de grabación en el mapa). + Especifica el intervalo de grabación general para trazas (activado a través del widget de grabación en el mapa). Pausar grabación del viaje Seguir grabando el viaje Predeterminado del sistema @@ -3817,7 +3817,7 @@ Añade al menos dos puntos. Seleccionar anchura Grabar automáticamente la traza durante la navegación - Consigue información sobre puntos de interés en Wikipedia. Es tu guía de bolsillo sin conexión. Sólo tienes que activar el complemento de Wikipedia y disfrutar de los artículos sobre los objetos que te rodean. + Consigue información sobre puntos de interés en Wikipedia, una guía de bolsillo sin conexión con artículos sobre lugares y destinos. El punto agregado no será visible en el mapa, ya que el grupo seleccionado está oculto, puedes encontrarlo en \"%s\". Motocicleta de enduro Moto scooter @@ -3850,7 +3850,7 @@ Perfil de navegación Selecciona un archivo de traza al que agregar el nuevo segmento. Fotos a pie de calle - ¿Estás seguro de que quieres descartar todos los cambios en la ruta planeada cerrándola\? + ¿Estás seguro de que quieres descartar todos los cambios en la ruta planeada\? En caso de dirección contraria Guardar como nuevo archivo de traza Añadir a un archivo de traza @@ -3877,11 +3877,11 @@ Recortar antes de Recortar después de Cambiar el tipo de ruta después de - Pausará el registro de trazas cuando se mate la aplicación (a través de aplicaciones recientes). (La indicación OsmAnd de fondo desaparece de la barra de notificaciones de Android.) + El registro de trazas se detendrá cuando se mate la aplicación (a través de aplicaciones recientes). (La indicación OsmAnd de fondo desaparece de la barra de notificaciones de Android.) Rehacer - Función actualizada de Planificar una ruta: permite utilizar diferentes tipos de navegación por segmento y la inclusión de trazas \n -\n - Nuevo menú Apariencia para las trazas: selecciona el color, el grosor, muestra las flechas de dirección, los iconos de inicio/fin +\n - Nuevo menú Apariencia para las trazas: selecciona el color, el grosor, muestra las flechas de dirección, los iconos de inicio y fin \n \n - Mejorada la visibilidad de los nodos de bicicleta. \n @@ -3914,9 +3914,9 @@ Deporte Emergencia Viajar - Necesita añadir al menos dos puntos + Añadir al menos dos puntos Cuenta - Nombre de usuario + Login Gestionar suscripción Enviar fichero GPX a OpenStreetMap Introduzca las etiquetas separadas por una coma. @@ -3935,7 +3935,7 @@ OsmAnd muestra fotos de diferentes fuentes: \nOpenPlaceReviews - fotos POI; \nMapillary - imágenes a nivel de calle; -\nWeb / Wikimedia - fotos POI especificadas en los datos de OpenStreetMap. +\nWeb / Wikimedia - fotos POI según los datos de OpenStreetMap. Recursos Tamaño de fichero aproximado Seleccione los datos para exportar al fichero. @@ -3943,11 +3943,80 @@ No hay espacio suficiente • Se ha añadido la opción de exportar e importar todos los datos, incluyendo los ajustes, los recursos y «Mis sitios» \n -\n • Planificar ruta: se añadieron gráficos para los segmentos de trazas con la ruta y capacidad de crear o editar trazas de segmentos múltiples +\n • Planificar ruta: gráficos para los segmentos de trazas con la ruta y añadio capacidad de crear o editar trazas de segmentos múltiples \n \n • Se ha añadido el método de autenticación OAuth para OpenStreetMap y se ha mejorado la interfaz de usuario de los diálogos de OSM \n -\n • Se añadieron colores personalizados para los favoritos y los puntos de referencia de la traza +\n • Admite colores personalizados para los favoritos y los puntos de referencia de la traza \n \n + La suscripción se cobra por el período elegido. Puedes cancelarlo en AppGallery en cualquier momento. + El pago será cargado a la cuenta de AppGallery al confirmar la compra. +\n +\nLa suscripción se renueva automáticamente a menos que se cancele antes de la fecha de renovación. La cuenta será cargada por el período de renovación (mes/trimestre/año) sólo en la fecha de renovación. +\n +\nPuedes administrar y cancelar las suscripciones en los ajustes de AppGallery. + Desarrollo nativo del transporte público + Cambiar al cálculo de ruta Java (seguro) del transporte público + Los datos de %1$s sólo están disponibles con las carreteras, calcula una ruta usando \"Ruta entre puntos\" para ver los gráficos. + Separador + \"Público\" significa que la traza se muestra públicamente en sus trazas de GPS y en listas de trazas de GPS públicas, y en la lista de trazas públicas con marcas de tiempo en forma sin formato. Los datos proporcionados a través de la API no hacen referencia a su página de seguimiento. Las marcas de tiempo de los puntos de seguimiento no están disponibles a través de la API de GPS pública y los puntos de seguimiento no están ordenados cronológicamente. + \"Privado\" significa que la traza no aparece en ninguna lista pública, pero los puntos de la traza en orden no cronológico están disponibles a través de la API de GPS pública sin marcas de tiempo. + \"Identificable\" significa que la traza se mostrará públicamente en sus trazas GPS y en listas de trazas GPS públicas, es decir, otros usuarios podrán descargar la traza sin procesar y asociarla con su nombre de usuario. Los datos de puntos de seguimiento públicos con marca de tiempo de la API de GPS que se proporcionan a través de la API de puntos de seguimiento harán referencia a su página de seguimiento original. + \"Rastreable\" significa que el rastreo no aparece en ningún listado público, pero los trackpoints son procesados con marcas de tiempo (que no se pueden asociar con usted directamente) lo hacen mediante descargas de la API de GPS pública. + Alemán (casual) + Para conducción de motos de nieve con carreteras y pistas exclusivas. + Gracias por comprar \'Contour lines\' + Evite las aceras + Evite las aceras + Datos OsmAnd Live + Datos OsmAnd Live + Enrutamiento de dos fases para la navegación del automóvil. + Inicie sesión con OAuth para usar las funciones de osmedit + Iniciar sesión a través de OAuth + Borrar token de OpenStreetMap OAuth + Desconectado + Utilice un algoritmo de enrutamiento de 2-fases A * + Deberas iniciar sesión para subir cambios nuevos o modificados. +\n +\nPuede iniciar sesión utilizando el método seguro OAuth o utilizar su nombre de usuario y contraseña. + %1$s * %2$s + Permitir vías de agua intermitentes + Gráfico + Por favor espera. +\nEl gráfico estará disponible después del nuevo cálculo de la ruta. + Inicie sesión en OpenStreetMap + Inicie sesión en OpenStreetMap.org + Iniciar sesión con OpenStreetMap + Usar nombre de usuario y contraseña + Toque el botón para configurar un método de pago en Google Play para corregir su suscripción. + La suscripción a OsmAnd Live ha caducado + La suscripción a OsmAnd Live ha sido pausada + La suscripción a OsmAnd Live está en espera + Historial de marcadores + Puede iniciar sesión utilizando el método seguro OAuth o utilizar su nombre de usuario y contraseña. + Las fotos son proporcionadas por el proyecto de datos abiertos OpenPlaceReviews.org. Para cargar sus fotos, debe registrarse en su sitio web. + No se puede cargar la imagen. Vuelve a intentarlo más tarde + Seleccionar imagen + Tu dispositivo solo tiene %1$s libres. Libere espacio o anule la selección de algunos elementos para exportar. + Seleccione los grupos que se importarán. + Seleccione los elementos que se importarán. + Cambie para usar dev.openstreetmap.org en lugar de openstreetmap.org para probar la carga de OSM Note / POI / GPX. + Usar dev.openstreetmap.org + Puede utilizar los datos de elevación para tener en cuenta el ascenso/descenso de su viaje + Aeronave ligera + Unir segmentos + Dividir antes + Dividir después + Añadir un nuevo segmento + Perfil de OsmAnd + Perfil de usuario + Invertir todos los puntos + Seleccione el perfil que se utilizará al iniciar la aplicación. + Utilizado por última vez + Prefiero rutas de senderismo + Prefiero rutas de senderismo + Permitir arroyos y desagües + Permitir arroyos y desagües + Permitir vías de agua intermitentes \ No newline at end of file From 77beca7b34d94c9bac578af88acb9b577111cc37 Mon Sep 17 00:00:00 2001 From: Temuri Doghonadze Date: Sat, 2 Jan 2021 10:57:50 +0000 Subject: [PATCH 33/37] Translated using Weblate (Georgian) Currently translated at 43.2% (1551 of 3590 strings) --- OsmAnd/res/values-ka/strings.xml | 925 ++++++++++++++++++++++++------- 1 file changed, 739 insertions(+), 186 deletions(-) diff --git a/OsmAnd/res/values-ka/strings.xml b/OsmAnd/res/values-ka/strings.xml index f0f96c138e..a3f8153e60 100644 --- a/OsmAnd/res/values-ka/strings.xml +++ b/OsmAnd/res/values-ka/strings.xml @@ -2,32 +2,32 @@ OsmAnd-ით ნავიგაცია გათიშულ რეჟიმში დროებით მიუწვდომელია. მარცხენა ხელით ტარება - აირჩიეთ მარცხენა მხარეს საჭის გამომყენებელი ქვეყნებისათვის - საწყისი პოზიცია ნაპოვნი ჯერ არაა - პოზიცია უცნობია + მარცხენა მხარეს საჭის გამომყენებელი ქვეყნებისათვის. + საწყისი პოზიცია ნაპოვნი ჯერ არაა. + პოზიცია უცნობია. გამჭირვალობის შეცვლა (0 - გამჭირვალე, 255 - გაუმჭირვალე) გნებავთ ჩამოტვირთვის შეწყვეტა? პროგრამის მთავარი თვისებების გამოსაყენებლად თქვენ გჭირდებათ მონაცემები რომლებიც გამოიყენება გათიშულ რეჟიმში, რომელიც შეგიძლიათ ჩამოტვირთოთ (პარამეტრები->მონაცემები გათიშვისას). ამის შემდეგ თქვენ შეგეძლებათ ძებნა როგორც მისამართის, ასევე საჯარო ტრანსპორტის მიხედვით. ბაზური რუკა საჭიროა პროგრამის ფუნქციონირებისათვის და არჩეულ იქნა გადმოსაწერად. - არაფერი არ იქნა ნაპოვნი. თუ ვერ პოულობთ თქვენი რეგიონის რუკას, შეგიძლიათ შექმნათ თვითონ. (იხილეთ http://osmand.net). + არაფერი არ იქნა ნაპოვნი. თუ ვერ პოულობთ თქვენი რეგიონის რუკას, შეგიძლიათ შექმნათ თვითონ. (იხილეთ https://osmand.net). მიმდინარე რუკები (ნახაზები) გათიშული რუკები (ვექტორული) - გათიშული რუკების ჩამოტვირთვა, მართვა და დეტალები + გათიშული რუკების ჩამოტვირთვა, მართვა და დეტალები. "ჩართეთ მიმდინარე რუკების დამატება სხვადასხვა წყაროების სანახავად" მიმდინარე რუკები - მიმდინარე რუკების გამოყენება (ჩამოტვირთვა და sdcard-ზე ქეშირება) + მიმდინარე რუკების გამოყენება (ჩამოტვირთვა და მეხსიერების ბარათზე ქეშირება). მიმდინარე რუკები - მიმდინარე და დაქეშირებული ნაწილოვანი რუკების წყაროების გამართვა - "დამატება ამსუბუქებს სხვადასხვა მიმდინარე ან ქეშირებულ ნაწილოვან რუკებს. ისინი შეიძლება მომზადდეს როგორც გათიშული რუკები და შეინახოს OsmAnd-ის დასტაში. " + მიმდინარე და დაქეშირებული ნაწილოვანი რუკების წყაროების გამართვა. + დამატება ამსუბუქებს სხვადასხვა მიმდინარე ან ქეშირებულ ნაწილოვან რუკებს. ისინი შეიძლება მომზადდეს როგორც გათიშული რუკები და შეინახოს OsmAnd-ის დასტაში. დამატება გაძლევთ საშუალებს დევნის ან ნავიგაციის მოწყობილობის ძილის დროს პერიოდულად GPS ჩიპის გააქტიურების საშუალებით. დამატება მართავს სპეციალური წვდომის შესაძლებლობებს. დამატება გაძლევთ საშუალებას განახორციელოთ შეცდომების კონტროლი და განვითარება მახასიათებლებისა როგორიცაა ანიმირებული ნავიგაცია. დამატებათა გამმართველი - დამატება გაძლევთ საშუალებას გამოიყენოთ აპლიკაციისათვის თანმოყოლილი ფუნქციები როგორიცაა ნაწილოვანი რუკები, თვალის დევნება, ძილის დროის ოპერაციები და სხვა + დამატება გაძლევთ საშუალებას გამოიყენოთ აპლიკაციისათვის თანმოყოლილი ფუნქციები როგორიცაა ნაწილოვანი რუკები, თვალის დევნება, ძილის დროის ოპერაციები და სხვა. დამატების მმართველი ეს დამატება გაძლევთ საშუალებას გააცნოთ OSM-ს თქვენი აზრი, გახსნა/დახურვა OSM-ის ხოჭოების შესახებ და მიაწოდოთ პროექტს თქვენი ჩაწერილი GPX ფაილები. ვექტორული რუკები როგორც წესი ჩანს უფრო სწრაფად. შეიძლება არ იმუშაოს ზოგიერთ მოწყობილობაზე. - ხმით არჩეული ბრძანებების შესრულება + ხმით არჩეული ბრძანებების შესრულება: OsmAnd -ის განვითარება და გამართვა ადგილობრივი რენდერი ხმის ტესტირება @@ -44,7 +44,7 @@ ადგილზე დაბრუნება დახმარება წვდომადობის რეჟიმი - რთავს წვდომადობის თვისებებს + რთავს წვდომადობის თვისებებს. ჩართული გამორთული გლობალურ სისტემურ პარამეტრებზე დაყრდნობით @@ -88,15 +88,15 @@ თვითგამოცხადების ჩართვა თვითგამოცხადების გამორთვა აქ ვარ - რუკის გადიდება ტრეკბოლის ჰორიზონტალური მოძრაობით + რუკის გადიდება ტრეკბოლის ჰორიზონტალური მოძრაობით. ტრეკბოლის გამოყენება გასადიდებლად - წვდომადობის პარამეტრები + წვდომადობის პარამეტრები. წვდომა არასაკმარისი მეხსიერება არჩეული ადგილის საჩვენებლად მანათობელი დაფარვები - ბილიკებისა და გზების მანათობელი ფერებით ჩვენება + ბილიკებისა და გზების მანათობელი ფერებით ჩვენება. POI-ს ჩასწორება გათიშულ რეჟიმში - ყოველთვის გამოვიყენოთ POI-ს ჩასწორების გათიშული რეჟიმი + ყოველთვის გამოვიყენოთ POI-ს ჩასწორების გათიშული რეჟიმი. წინააღმდეგ შემთხვევაში ცვლილებები მყისიერად აიტვირთება. აპლიკაციაში POI-ის ცვლილებები არ ეხება ჩამოტვირთულ რუკის ფაილებს. ცვლილებები ინახება ლოკალურ ფაილში. ატვირთვა… {0} POI/Bugs ატვირთულია @@ -105,16 +105,16 @@ ცვლილების წაშლა OSM POI-ის ასინქრონული ჩასწორება: ადგილობრივად შენახული OSM POI-ები/Bugs - ადგილობრივ ბაზაში შენახული OSM POI-ების/Bugs ჩვენება და მართვა - მიუთითეთ მიმდინარე რეჟიმში დევნის ინტერვალი + ადგილობრივ ბაზაში შენახული OSM POI-ების/Bugs ჩვენება და მართვა. + მიუთითეთ მიმდინარე რეჟიმში დევნის ინტერვალი. ცოცხალი დევნის ინტერვალი - მიუთითეთ ვებ მისამართუ შემდეგი პარამეტრების სინტაქსით : lat={0}, lon={1}, timestamp={2}, hdop={3}, altitude={4}, speed={5}, bearing={6} + მიუთითეთ ვებ მისამართუ შემდეგი პარამეტრების სინტაქსით : lat={0}, lon={1}, timestamp={2}, hdop={3}, altitude={4}, speed={5}, bearing={6}. ცოცხალი დევნის ვებ-მისამართი გთხოვთ ჩართოთ \'დევნის GPX ჟურნალში ჩაწერა\' დევნის პარამეტრებში. მიმდინარე დევნის ჩვენება OsmAnd-ის უფასო ვერსია ლიმიტირებულია %1$s ჩამოტვირთვით და არ გააჩნია გათიშული ვიკიპედიის სტატიების მხარდაჭერა. უფასო ვერსია - POI-ის აღწერის ჩვენება + POI-ის აღწერის ჩვენება. ჩრდილო ამერიკა ჩრდილო ამერიკა - შეერთებული შტატები ცენტრალური ამერიკა @@ -137,24 +137,24 @@ მომხმარებლის პროფილი აირჩიეთ მომხმარებლის პროფილი რუკისა და ნავიგაციის პარამეტრებით. ნავიგაცია - მიუთითეთ ნავიგაციის პარამეტრები + მიუთითეთ ნავიგაციის პარამეტრები. გლობალური პარამეტრები - გათიშული მონაცემები\n(გადმოწერა) + რუკების გადმოწერა მთავარი პარამეტრები - მთავარი პარამეტრების გამართვა + მთავარი პარამეტრების გამართვა. აპლიკაციის მთავარი პარამეტრები თქვენი OSM-ს მომხმარებლის სახელი - საჭიროა openstreetmap.org-ზე ოპერაციებისათვის - თქვენი OSM-ს პაროლი + საჭიროა openstreetmap.org-ზე ოპერაციებისათვის. + პაროლი ფონური პარამეტრები - გამოიყენეთ OsmAnd-ის ეკრანის გათიშულობის დროს გამოსაყენებლად + გამოიყენეთ OsmAnd-ის ეკრანის გათიშულობის დროს გამოსაყენებლად. არასაკმარისი ადგილი %1$s მბ-ის გადმოსაწერად (თავისუფალია: %2$s). თავისუფალი ადგილი {2} მბ! გადმოვწერო {0} ფაილი ზომით ({1} მბ)? გამჭირვალე თემა ადგილობრივი ბიბლიოთეკა მოცემულ მოწყობილობაზე მხარდაჭერილი არაა. ადგილობრივი ბიბლიოთეკის ინიციალიზაცია… რუკის ხედვის ცენტრისაკენ ავტომატური გასწორება - დრო, რომელიც გავა სანამ რუკა იქნება მიმდინარე პოზიციის შესაბამისი იქნება + დრო, რომელიც გავა სანამ რუკა იქნება მიმდინარე პოზიციის შესაბამისი იქნება. მხოლოდ ავტოცენტრირებული ნავიგაცია ავტოცენტრირებული რუკის ხედვა მხოლოდ ნავიგაციის დროს. გამოიყენება ავტოცენტრირებული რუკის ხედი. @@ -172,7 +172,7 @@ ანიმაციის დაწყება ფაილისათვის სახელის გადარქმევა შეუძლებელია. ფაილი მოცემული სახელით უკვე არსებობს. - ძებნის შედეგები შეიცავს რამოდენიმე POI კატეგორიას : + ძებნის შედეგები შეიცავს რამოდენიმე POI კატეგორიას. ადგილობრივი მონაცემები POI-ს ძებნისათვის არ არსებობს. სახელით ძებნა POI-ის მონაცემთა ფაილის \'%1$s\', არსებობს ასლი და მისი წაშლა შესაძლებელია. @@ -190,14 +190,14 @@ ძებნა ახლოს : ახლოს ძებნა გზა შეინახა წარმატებით. სახელი \'%1$s\'. - "ფაილის სახელი: " + ფაილის სახელი: ფაილი მოცემული სახელით უკვე არსებობს. შენახვა GPX ფაილების OSM-ში ატვირთვა. ისინი გამოიყენება რუკების გასაუმჯობესებლად. %1$d %2$d -დან წარმატებით აიტვირთა. OSM-ში გაგზავნა მეტი დეტალები რუკის შესახებ - ვექტორული რუკის დეტალების (გზების და ა.შ.) ჩვენება პატარა გადიდებისას + ვექტორული რუკის დეტალების (გზების და ა.შ.) ჩვენება პატარა გადიდებისას. რჩეული წერტილები წარმატებით წაიშალა. თქვენ აპირებთ წაშალოთ %1$d რჩეული და %2$d რჩეულთა ჯგუფი. დარწმუნებული ხართ? საწყისი @@ -215,7 +215,7 @@ %1$d %2$d -დან წარმატებით გააქტიურდა. %1$s არ არსებობს თქვენ აპირებთ %1$s %2$s . გავაგრძელოთ? - გათიშული მონაცემების მმართველი + გათიშული მონაცემების მმართველი. აქტივაცია დეაქტივაცია ჩამოტვირთვა @@ -229,14 +229,14 @@ POI მონაცემები TTS ხმა ახალი ძებნა - აირჩიეთ ტექსტის ზომა რუკაზე დატანილი სახელებისათვის + ტექსტის ზომა რუკაზე დატანილი სახელებისათვის: ტექსტის ზომა რენდერინგის ინფორმაცია - რენდერის სისწრაფის ჩვენება + რენდერის სისწრაფის ჩვენება. ახალი მონაცემების განშლა… არჩეულია მიმდინარე ნავიგაციის სერვისი მაგრამ ინტერნეტთან შეერთება წვდომადი არაა. ენა მხარდაჭერილი არაა - არჩეული ენა არაა მხარდაჭერილი ანდროიდის მიმდინარე ვერსიის TTS ძრავის მიერ. გნებავთ მოვძებნოთ სხვა ძრავი market-ში? წინააღმდეგ შემთხვევაში გამოყენებულ იქნება მიმდინარე TTS ენა. + არჩეული ენა არაა მხარდაჭერილი ანდროიდის მიმდინარე ვერსიის TTS ძრავის მიერ. გნებავთ მოვძებნოთ სხვა ძრავი market-ში\? წინააღმდეგ შემთხვევაში გამოყენებულ იქნება მიმდინარე TTS ენა\? ნაკლული მონაცემები არჩეული ენის შესაბამისი მონაცემების პოვნა შეუძლებელია. გნებავთ მაღაზიაში მათი მოძებნა? GPX-ის უკუღმა მიმართულება @@ -244,14 +244,14 @@ მიმდინარე ბილიკის დევნა ამ ლოკაციისათვის არსებობს გათიშული ვექტორული რუკა.\n\t\n\tაქტივაციისათვის \'მენიუ\' -> \'ხედის გამართვა\' -> \'რუკის წყარო…\' -> \'გათიშული ვექტორული რუკები\'. ხმოვანი ბრძანების შედეგი - აირჩიეთ არხი ხმოვანი ბრძანებებისათვის + აირჩიეთ არხი ხმოვანი ბრძანებებისათვის. ხმოვანი დარეკვა შეტყობინების ხმა მუსიკის ხმა შეუძლებელია %1$s -ის ჩამოტვირთვა, გთხოვთ თავიდან დააყენოთ აპლიკაცია. - გამჭირვალობის შეცვლა + გამჭირვალობის შეცვლა. გამჭირვალობა - ბაზური რუკის გამჭირვალობის შეცვლა + ბაზური რუკის გამჭირვალობის შეცვლა. ბაზური რუკის გამჭირვალობა ქვედა რუკა… ქვედა რუკა @@ -260,21 +260,21 @@ არა ზედა რუკა ზედა რუკის არჩევა - რუკა უკვე დაყენებულია. მიმდინარეობს პარამეტრების განახლება - აირჩიეთ რუკა დასაყენებლად ან განსანახლებლად - ოპერაციისათვის საჭიროა ინტერნეტი, რომელთანაც წვდომა არ არსებობს + რუკა უკვე დაყენებულია. მიმდინარეობს პარამეტრების განახლება. + აირჩიეთ რუკა დასაყენებლად ან განსანახლებლად. + ოპერაციისათვის საჭიროა ინტერნეტი, რომელთანაც წვდომა არ არსებობს. მეტის ჩაყენება… - მინიმალური გადიდება ვექტორული რუკების ჩვენებისათვის + ამ დონის შემდეგ რასტერული რუკების გამოყენება. ვექტორული გადიდების მინ. ზომა - " Online OSM რუკების დალაგება სურათებით" - შეცდომა გათიშული ძებნის დროს + Online OSM რუკების დალაგება სურათებით. + შეცდომა გათიშული ძებნის დროს. მისამართის ძებნა გათიშული რუკების გამოყენებით სისტემა - ენის არჩევა + ენის არჩევა (დაინახავთ OsmAnd-ის გადატვირთვის შემდეგ). ენა შემდეგი წინა - სიგრძისა და სიჩქარის ერთეულები + სიგრძისა და სიჩქარის ერთეულები. გაზომვის ერთეული მილი/ფუტი მილი/იარდი @@ -315,7 +315,7 @@ რუკების ინდექსირება… POI-ის ინდექსირება… ტრანსპორტის ინდექსირება… - მოხდა I/O შეცდომა + I/O შეცდომა კმ კმ/ს @@ -348,7 +348,7 @@ ღამე მზის ჩასვლა/ამოსვლა მზის სენსორი - აირჩიეთ დღეღამის არჩევის წესები + აირჩიეთ დღეღამის არჩევის წესები. დღის/ღამის არჩევა გადმოვიწერო {0} ფაილი(ები) ზომით ({1} მბ)? არჩეულია {0} @@ -356,17 +356,17 @@ ყველაფრის არჩევა განახლება უსწრაფესი გზა - "ჩართეთ უსწრაფესი გზის დასათვლელად ან გამორთეთ უმოკლესისათვის " + ჩართეთ უსწრაფესი გზის დასათვლელად ან გამორთეთ უმოკლესისათვის. გადიდებისას {0} გადმოსაწერია {1} ნაწილი ({2} MB) რუკის გადმოწერა აირჩიეთ მაქსიმალური გადიდება ჩასატვირთად რუკის გადმოწერა შეუძლებელია გაგრძელებადი რენდერი - მიყოლებული რენდერის ჩვენება ცალცალკე სურათების ჩვენების მაგიერ - მონიშნული არეალის რენდერის დროს მოხდა შეცდომა + მიყოლებული რენდერის ჩვენება ცალცალკე სურათების ჩვენების მაგიერ. + მონიშნული არეალის რენდერის დროს მოხდა შეცდომა. მდებარეობის პარამეტრები … რენდერერი წარმატებით ჩაიტვირთა - მოხდა შეცდომა: რენდერერი არ ჩაიტვირთა + მოხდა შეცდომა: რენდერერი არ ჩაიტვირთა. ვექტორული მარენდერებელი რენდერის გარეგნობის არჩევა POI-ს ვებგვერდის ჩვენება @@ -375,7 +375,7 @@ ტელეფონი ფილტრირებისათვის აკრიფეთ მაღალი გარჩევადობის ეკრანი - არ დააპატარაოს (და დაბუროს) რუკის ნაწილები მაღალი გარჩევადობის ეკრანებზე + არ დააპატარავო (და დაბუროს) რუკის ნაწილები მაღალი გარჩევადობის ეკრანებზე. ტრანსპორტის ძებნა ტრანსპორტის ძებნა (არ მოიძებნა): ტრანსპორტის პასუხები ({0} -მდე): @@ -383,7 +383,7 @@ ხმა ვექტორული რუკები ჩატვირთული არ იქნა GPX ფაილები /tracks დასტაში ნაპოვნი არ იქნა - GPX მონაცემების კითხვის შეცდომა + GPX მონაცემების კითხვის შეცდომა. გათიშული ვექტორული რუკები გაჩერებაზე ტრანსპორტის ძებნა POI-ის ჩასწორება @@ -391,7 +391,7 @@ კომპასისაკენ მოძრაობის მიმართულებით არ შეაბრუნო - აირჩიეთ რუკის გასწორება ეკრანის მიმართ + რუკის გასწორება: რუკის ორიენტაცია დეტალები გზის შესახებ რჩეულების იმპორტი წარმატებით დასრულდა @@ -399,7 +399,7 @@ რჩეულები წარმატებით იქნა შენახული {0} -ში არ მოიძებნა შესანახავად მზა რჩეულები იმპორტი - შეცდომა GPX-ის ჩატვირთვისას + შეცდომა GPX-ის ჩატვირთვისას. რეპორტის გაგზავნა გათიშული მონაცემები რაიონისათვის SD card-ზე ნაპოვნი არაა. გთხოვთ გადმოწეროთ ინტერნეტიდან. შეიტანეთ მონაცემები POI-ის მოსაძებნად @@ -413,9 +413,9 @@ რუკის წყარო… ხედის აღწერა POI-ის ძებნა - რუკის სამოძრაოდ გამოიყენეთ ტრეკბოლი + რუკის სამოძრაოდ გამოიყენეთ ტრეკბოლი. გამოიყენეთ ტრეკბოლი - გთხოვთ დააყენოთ ფონური პოზიცირების ჩასასწორებელი მაქსიმალური დრო + გთხოვთ დააყენოთ ფონური პოზიცირების ჩასასწორებელი მაქსიმალური დრო. ჩასწორების მოლოდინის მაქსიმალური დრო სად ვარ? OsmAnd-ის ნავიგაციის სერვისი @@ -423,11 +423,11 @@ GPS წამი წთ. - "ფონური რეჟიმის მიერ გამოყენებული გაღვიძების ინტერვალი " - გაღვიძების ინტერვალი - აირჩიეთ მდებარეობის მომწოდებელი ფონური რეჟიმის დროს + ფონური რეჟიმის მიერ გამოყენებული გაღვიძების ინტერვალი: + GPS-ის გაღვიძების ინტერვალი + აირჩიეთ მდებარეობის მომწოდებელი ფონური რეჟიმის დროს: მდებარეობის მომწოდებელი - როდესაც ეკრანი გამორთულია, OsmAnd დარჩეს გაშვებული ფონურ რეჟიმში + როდესაც ეკრანი გამორთულია, OsmAnd დარჩეს გაშვებული ფონურ რეჟიმში. ფონად გაშვება ფონური ნავიგაციის სერვისი მოითხოვს მდებარეობის მომწოდებლის ჩართვას. ფილტრის დამალვა @@ -435,7 +435,7 @@ ფილტრი ხმა ჩართულია ხმა გამორთულია - აირჩიეთ ხმით წამძღვარება ნავიგაციისათვის + აირჩიეთ ხმით წამძღვარება ნავიგაციისათვის. ხმით წამძღვარება ხმოვანი მონაცემების მომზადება… ხმოვანი მონაცემები მხარდაჭერილი არაა @@ -461,8 +461,8 @@ პორტრეტი ლანდშაფტი ეკრანის ორიენტაცია - პორტრეტი, ლანდშაფტი ან როგორც მოწყობილობა - საათური ფორმატის გახსნა ჩასწორებისათვის მხარდაჭერილი არაა + პორტრეტი, ლანდშაფტი ან როგორც მოწყობილობა. + საათური ფორმატის გახსნა ჩასწორებისათვის მხარდაჭერილი არაა. ახალი წესის დამატება გზები გაჩერება @@ -477,18 +477,18 @@ გზის სიგრძე ტრანსპორტი OK - რუკაზე საზოგადოებრივი ტრანსპორტის გაჩერებების ჩვენება + რუკაზე საზოგადოებრივი ტრანსპორტის გაჩერებების ჩვენება. გაჩერებების ჩვენება OsmAnd - სანავიგაციო აპლიკაცია POI მონაცემები წარმატებით განახლდა (ჩატვირთულ იქნა {0}) - შეცდომა ლოკალური POI სიის განახლებისას - შეცდომა მონაცემების სერვერიდან კითხვისას + შეცდომა ლოკალური POI სიის განახლებისას. + შეცდომა მონაცემების სერვერიდან კითხვისას. გათიშული POI მონაცემები ამ არეალისათვის ხელმიუწვდომელია პატარა ზომის გადიდებისათვის POI-ის განახლება არ შეიძლება POI-ის განახლება განვანახლო ლოკალური მონაცემები ინტერნეტიდან? - ქალაქი:\n {0} - ქუჩა:\n {0}, {1} + ქალაქი: {0} + ქუჩა: {0}, {1} გადაკვეთა: {0} x {1} in {2} შენობა: {0}, {1}, {2} რჩეული @@ -504,15 +504,15 @@ გათიშული ინტერნეტი მაქს. მიმდინარე გადიდება - აირჩიეთ მაქსიმალური გადიდება მიმდინარე რუკების ნაწილის ჩამოტვირთვისას - ჯამური სიშორე %1$s,\n მოგზაურობის დრო %2$d სთ %3$d წთ. - აირჩიეთ მიმდინარე ან გათიშული ნავიგაციის სერვისი + აირჩიეთ მაქსიმალური გადიდება მიმდინარე რუკების ნაწილის ჩამოტვირთვისას. + ჯამური სიშორე %1$s, მოგზაურობის დრო %2$d სთ %3$d წთ. + მიმდინარე ან გათიშული ნავიგაციის სერვისი. ნავიგაციის სერვისი - შენახვის დასტა SDCard-ზე მიუწვდომელია + შენახვის დასტა SDCard-ზე მიუწვდომელია! ჩამოვტვირთო {0} - {1} ? გათიშული მონაცემები {0}-სათვის უკვე არსებობს ({1}). გნებავთ მისი განახლება ({2}) ? მისამართი - ჩამოტვირთვა წარმატებულად დამთავრდა + ჩამოტვირთვა დასრულებულია წვდომადი რაიონების სიის ჩამოტვირთვა… რაიონების ლისტი არ მიღებული არაა osmand.net-იდან. რჩეული წერტილი ჩასწორებულია @@ -536,12 +536,12 @@ ქუჩების ჩატვირთვა… ქალაქების ჩატვირთვა… POI - შეცდომნა GPX-ის შენახვისას - შეცდომა გზის დათვლისას - გზის დათვლისას მოხდა შეცდომა - შეცდომა: დათვლილი გზა ცარიელია + შეცდომა GPX-ის შენახვისას. + შეცდომა გზის დათვლისას. + გზის დათვლის შეცდომა. + დათვლილი გზა ცარიელია. ახალი გზა დათვლილია. დაშორება - თქვენ მიხვედით თქვენს დანიშნულების ადგილას + მიხვედით. კოორდინატები არასწორია! OsmAnd-ის რუკაზე დაბრუნება დახურვა @@ -550,27 +550,27 @@ ბოლოს გაშვებული OsmAnd მოკვდა. ჟურნალის ფაილია {0}. გთხოვთ მოგვწეროთ ჟურნალის ფაილი და როგორ მოხდა ეს. GPX ძიების SD-ზე შენახვა… დამთავრდა - ინტერნეტის გამოყენება გზის დასათვლელად + ინტერნეტის გამოყენება გზის დასათვლელად. მიმდინარე ნავიგაციის გამოყენება - მიუთუთეთ Openstreetmap.org (OSM) პარამეტრები OSM-სთან დასაკავშირებლად - მიუთითეთ ენა, მონაცემების ხელახლა წაკითხვა/ჩამოტვირთვა + მიუთუთეთ Openstreetmap.org (OSM) პარამეტრები OSM-სთან დასაკავშირებლად. + მიუთითეთ ენა, მონაცემების ხელახლა წაკითხვა/ჩამოტვირთვა. მონაცემები - OSM-ის გამართვა - სიჩქარეზე რუკის ავტომატური გადიდება + OpenStreetMap-ის გამართვა + სიჩქარეზე რუკის ავტომატური გადიდება. რუკის ავტომატური გადიდება დამატებითი პარამეტრები პარამეტრები - მიმდინარე ძებნის SDCard-ზე ჩაწერა + მიმდინარე ძებნის SDCard-ზე ჩაწერა. მიმდინარე დევნის დამახსოვრება - ჟურნალირების ინტერვალი + ნავიგაციისას ჟურნალირების ინტერვალი აირჩიეთ პოზიცირების ინტერვალი დევნისათვის - დევნები ჩაიწერება დევნის დასტაში, დალაგდება დღეების მიხედვით + დევნები ჩაიწერება დევნის დასტაში, დალაგდება დღეების მიხედვით. დევნის GPX-ში ჟურნალირება რუკის განახლება ხელახალი ჩატვირთვა მიზანი რჩეულებში დამატება - აირჩიეთ ადგილობრივ და ინგლისურ სახელებს შორის + აირჩიეთ ადგილობრივ და ინგლისურ სახელებს შორის. ინგლისური სახელების გამოყენება აპლიკაციის პარამეტრები ძებნა მისამართით @@ -579,11 +579,11 @@ აირჩიეთ ქალაქი აირჩიეთ ქვეყანა ხედვის კუთხის ჩვენება - რუკის 3D ხედვის ჩართვა + რუკის 3D ხედვის ჩართვა. რუკის 3D ხედვა - POI-ის რუკაზე ჩვენება (ბოლოს არჩეული ფილტრის გამოყენებით) + ბოლოს გამოყენებული POI-ის რუკაზე ჩვენება. POI-ის ჩვენება - აირჩიეთ მიმდინარე ან ქეშირებული რუკის ნაწილის წყარო + აირჩიეთ მიმდინარე ან ქეშირებული რუკის ნაწილის წყარო. რუკის წყარო რუკის წყარო ინტერნეტის გამოყენება @@ -612,8 +612,8 @@ განედი გრძედი DDD.DD - DDD MM.MM - DDD MM SS.SS + DDD MM.MMM + DDD MM SS.S რუკაზე ჩვენება აირჩიეთ მისამართი რაიონი @@ -639,7 +639,7 @@ შეტყობინება ავტორი კომენტარი დამატებულია - მოხდა შეცდომა: კომენტარი არ დაემატა + კომენტარი არ დაემატა. POI-ის ჩასწორება POI-ის შექმნა POI ვერ მოიძებნა @@ -665,19 +665,19 @@ წაიშალა ფილტრი %1$s შეიქმნა ფილტრი %1$s გზის მონაცემები - ფორმატი: + ფორმატი POI - ინტერესის წერტილი მისამართის ძებნა კოორდინატები ტრანსპორტის ძებნა რჩეულებში ძებნა - ყველა მიწისზედა რუკის ობიექტის გამჭირვალედ ჩვენება + ყველა მიწისზედა რუკის ობიექტის გამჭირვალედ ჩვენება. პოლიგონების გარეშე რენდერის რეჟიმი რუკის გაუმჯობესება მომხმარებლის პროფილის მიხედვით აირჩიეთ მინიმალური გადიდების ზომა რუკის საჩვენებლად. შეიძლება საჭირო გახდეს SRTM ფაილი: კონტურის ჩვენება - რუკის მეტი წვრილმანის ჩვენება + რუკის მეტი წვრილმანის ჩვენება. მეტი დეტალები რუკის შესახებ შემობრუნდით : %1$d გეჭიროთ მარცხენა მხარე @@ -705,20 +705,21 @@ AM პარკინგის ადგილი დამატება გაძლევთ საშუალებას შეინახოთ მანქანის პარკინგის მდებარეობა. - პარკინგის მდებარეობის დამატება + პარკინგის მდებარეობა დამატება პარკინგის მდებარეობად პარკინგის მაჩვენებლის წაშლა საწყისი წერტილი მეტისმეტად შორსაა უახლოესი გზისაგან. გაზიარებული მდებარეობა - აირჩიეთ მოძრავი გზის აჩქარება + აირჩიეთ მოძრავი გზის აჩქარება: გამოყოფილი მეხსიერება %1$s მბ (Android-ის ლიმიტი %2$s მბ, Dalvik %3$s მბ). გამოყოფილი მეხსიერება - აპლიკაციის მიერ გამოყენებული ჯამური ადგილობრივი მეხსიერება %1$s მბ (Dalvik %2$s მბ, სხვა %3$s მბ). პროპორციული მეხსიერება %4$s მბ (Android-ის ლიმიტი %5$s მბ, Dalvik %6$s მბ). + აპლიკაციის მიერ გამოყენებული ჯამური ადგილობრივი მეხსიერება %1$s მბ (Dalvik %2$s მბ, სხვა %3$s მბ). +\nპროპორციული მეხსიერება %4$s მბ (Android-ის ლიმიტი %5$s მბ, Dalvik %6$s მბ). ჯამური ადგილობრივი მეხსიერება სთ წთ - მანქანის პარკინგის დროა: - კომპასის გამოყენება მიმართულების დაუდგენლობისას + მანქანის პარკინგის დროა + კომპასის გამოყენება მიმართულების დაუდგენლობისას. კომპასის გამოყენება გზის გადათვლა სასურველი წერტილის პოვნის შემთხვევაში წინა გზა არ დასრულებულა. გნებავთ მისი გაყოლა? (%1$s წმ) @@ -745,18 +746,19 @@ დააყენეთ გაღვიძების ინტერვალი: დააჭირეთ ბოქლომს ეკრანის გასახსნელად ეკრანზე ჩაკეტვის მოხსნა - ძილის რეჟიმის გამორთვა - ძილის რეჟიმის ჩართვა + პროგრამის ფონურ რეჟიმში გაშვება + შეჩერდით +\nგაშვებულია ფონურ რეჟიმში POI ფილტრის შექმნა ინფორმაცია დღეღამის შესახებ - რენდერის ატრიბუტები: + რენდერის ატრიბუტები ეკრანის გამართვა ბილიკების ჩვენება მოუკირწყლავი გზებისათვის თავის არიდება ბორნისათვის თავის არიდება თავის არიდება… გაფრთხილებების ჩვენება… - სიჩქარის ლიმიტის, კამერებისა და საცობების ჩვენება + სიჩქარის ლიმიტის, გვირაბების, კამერებისა და საცობების ჩვენება. მანათობელი გზები სახაზავის ჩვენება ხედვის მიმართულება @@ -767,7 +769,7 @@ რენდერის რეჟიმი აირჩიეთ მხოლოდ გზების საჩვენებლად: რუკები მხოლოდ გზებით - "გზები. " + გზები ჩვეულებრივი რუკები რუკები მხოლოდ გზებით აპლიკაციის დაცულ რეჟიმში გაშვება(ადგილობრივი კოდის მაგიერ ნელი Android-ის რეჟიმის გამოყენება). @@ -794,7 +796,7 @@ გზის ბოლო წერტილის დამატება გზის პირველი წერტილის დამატება დანიშნულების წერტილის შეცვლა - თქვენ უკვე მიუთითეთ დანიშნულების წერტილი. + თქვენ უკვე მიუთითეთ დანიშნულების წერტილი: გზის ნიშნულები გზის ნიშნანი %1$s მეტისმეტად შორსაა უახლოესი გზიდან. თქვენ მიაღწიეთ თქვენს დანიშნულების წერტილს @@ -810,37 +812,37 @@ რესტორნები ღირსშესანიშნაობები მოტოციკლეტის გზებისათვის თავის არიდება - ნავიგაციისას პიზიციის მიბმა გზებისათვის + ნავიგაციისას პიზიციის გზებისათვის მიბმა. გზისთვის მიბმა OsmAnd არის ნავიგაციის აპლიკაცია ღია წყაროთი გათიშული და ონლაინ რუკების მხარდაჭერით გზის წერტილი აუდიო/ვიდეო მონაცემები დარწმუნებული ბრძანდებით რომ გნებავთ ნავიგაციის შეწყვეტა? დარწმუნებული ბრძანდებით რომ გნებავთ გაასუფთაოთ თქვენი დანიშნულების წერტილი? - ჩართეთ ზუსტი გზები მათი მანძილის ზუსტად დასათვლელად. მაგრამ ის ძალიან შეზღუდულია მანძილით და არ იყენებს ადგილობრივ ბიბლიოთეკას. + ზუსტი გზები მათი მანძილის ზუსტად დასათვლელად. მაგრამ ის ძალიან შეზღუდულია მანძილით და არ იყენებს ადგილობრივ ბიბლიოთეკას და ნელია. გზის ზუსტი დათვლა (ალფა) ჩვენება - ფოტო %1$s %2$s-დან + ფოტო %1$s %2$s ფოტოს გადაღება ფოტოს გადაღება Dropbox-ის დამატება საშუალებას გაძლევთ გააკეთოთ სინქრონიზაცია თქვენი გზებისა და აუდიო/ვიდეო შენიშვნებისა თქვენს dropbox-ის ანგარიშთან. Dropbox-ის დამატება წყობის შეცვლა - პროგრამის განვითარების მხარდასაჭერად გთხოვთ შეიძინოთ Contour lines დამატება Market-დან. + პროგრამის განვითარების მხარდასაჭერად გთხოვთ შეიძინოთ Contour lines პლაგინი. დამატება Contour lines ვიდეოს ჩაწერა ხმის ჩაწერა - ღილაკის ნაგულისხმევი ქცევის არჩევა + ღილაკის ნაგულისხმევი ქცევის არჩევა: ღილაკის ნაგულისხმევი ქცევა - აირჩიეთ ვიდეო გამოსახულების ფორმატი + აირჩიეთ ვიდეო გამოსახულების ფორმატი: ვიდეო გამოსახულების ფორმატი - ვიდეოს ჩასაწერად სისტემური ჩამწერის გამოყენება + ვიდეოს ჩასაწერად სისტემური ჩამწერის გამოყენება. გარე ჩამწერის გამოყენება - აუდიო/ვიდეო-ს გამართვა - "აუდიო/ვიდეო პარამეტრები " - "ჩაწერის შეცდომა " + აუდიო/ვიდეო-ს გამართვა. + აუდიო/ვიდეო პარამეტრები + ჩაწერის შეცდომა კამერა მიუწვდომელია - მიმდინარეობს ხმის/ვიდეოს ჩაწერა. შესაწყვეტად დააწირეთ AV ღილაკს. + მიმდინარეობს ხმის/ვიდეოს ჩაწერა. შესაწყვეტად დააჭირეთ AV ღილაკს. მოცემული ჩანაწერიდან იკვრება მხოლოდ ხმა.\n%1$s გარე დამკვრელის გაშვება გნებავთ ჩანაწერის წაშლა? @@ -848,18 +850,18 @@ ხმოვანი შენიშვნის ჩაწერა ვიდეო შენიშვნის ჩაწერა ჩანაწერების დონე - ჩანაწერის დაკვრა შეუძლებელია + ჩანაწერის დაკვრა შეუძლებელია. ჩანაწერის წაშლა დაკვრა ჩანაწერი %1$s %2$s %3$s-დან - ჩანაწერი + მიმდინარეობს ჩაწერა ხმოვანი/ვიდეო შენიშვნები OsmAnd-ის დამატება გათიშული კონტურული ხაზებისათვის - "ეს დამატება უზრუნველყოფს კონტურულ ხაზებს, რომლებიც შეიძლება ნაჩვენები იქნას OsmAnd-ის გათიშულ რუკებზე. გლობალური მონაცემები (70 გრადუს ჩრდილოეთსა და 70 გრადუს სამხრეთს შორის) ემყარება SRTM (Shuttle Radar Topography Mission) და ASTER (Advanced Spaceborne Thermal Emission and Reflection Radiometer)-ის მონაცემებს, რომელიც წარმოადგენს ფოტოკამერას Terra-ზე, NASA-ს წამყვან თანამგზავრზე, რომელიც ემსახურება დედამიწის დათვალიერების სისტემას. ASTER წარმოადგენს ერთობლივ პროექტს NASA-ს, იაპონიის ეკონომიკის სამინისტროს, ვაჭრობისა და ინდუსტრიის (METI), და იაპონიის კოსმოსურ სისტემებს (J-spacesystems) შორის. " + ეს დამატება უზრუნველყოფს კონტურულ ხაზებს, რომლებიც შეიძლება ნაჩვენები იქნას OsmAnd-ის გათიშულ რუკებზე. გლობალური მონაცემები (70 გრადუს ჩრდილოეთსა და 70 გრადუს სამხრეთს შორის) ემყარება SRTM (Shuttle Radar Topography Mission) და ASTER (Advanced Spaceborne Thermal Emission and Reflection Radiometer)-ის მონაცემებს, რომელიც წარმოადგენს ფოტოკამერას Terra-ზე, NASA-ს წამყვან თანამგზავრზე, რომელიც ემსახურება დედამიწის დათვალიერების სისტემას. ASTER წარმოადგენს ერთობლივ პროექტს NASA-ს, იაპონიის ეკონომიკის სამინისტროს, ვაჭრობისა და ინდუსტრიის (METI), და იაპონიის კოსმოსურ სისტემებს (J-spacesystems) შორის. მანძილის გაზომვა - მდებარეობა შენიშვნის მისაბმელად ჯერ განსაზღვრული არაა. გამოიყენეთ \"მდებარეობის გამოყენება…\" შენიშვნის სასურველი მდებარეობისათვის მისანიჭებლად + გამოიყენეთ \"მდებარეობის გამოყენება…\" შენიშვნის სასურველი მდებარეობისათვის მისანიჭებლად. ხმოვანი შენიშვნები - მგზავრობისას ხმოვანი/ვიდეო შენიშვნების ჩაწერა + მგზავრობისას ხმოვანი/ვიდეო შენიშვნების ჩაწერა. ხმოვანი/ვიდეო შენიშვნები მონაკვეთები კონტურული ხაზები @@ -867,18 +869,18 @@ კონტურული ხაზების დამატება სხვა რუკები კოტურული ხაზების მონაცემები - საზღვრების დამალვა - რეგიონალური საზღვრების ჩვენების შეზღუდვა (ადმინისტრირების დონე 5-9) + საზღვრები + რეგიონალური საზღვრების ჩვენების შეზღუდვა (ადმინისტრირების დონე 5-9). შეწყვეტა დაწყება სიჩქარის ლიმიტი გან %1$.3f, გრძ %2$.3f OsmAnd წარმოადგენს აპლიკაციას ღია კოდით გათიშული და მიმდინარე რუკებით ნავიგაციისათვის - აირჩიეთ ტრანსპორტის ტიპი + ტრანსპორტის ტიპი: დაუსრულებელი - აირჩიეთ აპლიკაციის რეჟიმები + აირჩეთ პროფილი. აპლიკაციის პროფილები - რუკის რენდერი: + რუკის რენდერი ფეხით მოგზაურობა მოტოციკლი გემი @@ -888,7 +890,7 @@ გთხოვთ ჯერ გადაითვალოთ გზა სიმულაცია გამოთვლილი გზის გამოყენებით სიმულაცია GPX მიყოლით - ჩემი არჩევნის დამახსოვრება + არჩევნის დამახსოვრება და ან ავტომატური გადიდების გათიშვა @@ -906,7 +908,7 @@ მაქსიმალური გადიდებადობა: %1$s მინიმალური გადიდებადობა: %1$s ინდექსი: %1$s - ინდექსის წყარო %1$s წარმატებით იქნა შენახული + ინდექსის წყარო %1$s შენახულია ზღვის დონიდან მაქს. გადიდება დროის გასვლა (წთ) @@ -915,20 +917,20 @@ აირჩიეთ არსებული… აღწერა/ჩასწორება… FPS გარჩევის ინფორმაცია - აირჩიეთ გზის რეგიონი: აშშ, ევროპა, UK, აზია და სხვა + აირჩიეთ გზის რეგიონი: აშშ, ევროპა, UK, აზია და სხვა. გზის რეგიონი იაპონია აშშ კანადა - ევროპა & აზია + ევროპა & აზია და სხვა UK, ინდოეთია, ავსტრალია & სხვანი გაცხადება… - გაცხადებებში ქუჩის სახელების, სიჩქარის შეზღუდვის (იძულებითი გაჩერებების, სიჩქარის კონტროლის), ჩქაროსნული კამერების, სიჩქარის ლიმიტების მითითების ჩასწორება - ქუჩის სახელების გაცხადება - სიჩქარის ლიმიტის გაცხადება - ჩქაროსნული კამერების გაცხადება - ტრაფიკის შეტყობინებების გაცხადება - გთხოვთ პარამეტრებში მიუთითოთ OSM-ის მომხმარებელი და პაროლი + გაცხადებებში ქუჩის სახელების, სიჩქარის შეზღუდვის (იძულებითი გაჩერებების, სიჩქარის კონტროლის), ჩქაროსნული კამერების, სიჩქარის ლიმიტების მითითების ჩასწორება. + ქუჩის სახელები (TTS) + სიჩქარის ლიმიტი + ჩქაროსნული კამერები + ტრაფიკის შეტყობინებები + გთხოვთ \'პარამეტრებში\' მიუთითოთ OSM-ის მომხმარებელი და პაროლი შუალედური წერტილების გასუფთავება შუალედური წერტილების დატოვება თქვენ უკვე დააყენეთ შუალედური წერტილები. @@ -943,9 +945,9 @@ ჯერ აირჩიეთ ქალაქი ან ქუჩა ქუჩის ახლომდებარე ქალაქებში ძებნა დანიშნულების პუნქტამდე მათი ოპტიმალური განლაგებისათვის შუალედური წერტილები გადალაგებული იქნა. - დალაგება + სახლის ნომრებით დალაგება OSM ცვლილებების ფაილის გენერაცია წარმატებულია %1$s - OSM ცვლილებების მარქაფი წარუმატებლად დასრულდა + OSM ცვლილებების მარქაფი წარუმატებელია. OSM ცვლილებების მარქაფი წერტილის წაშლა დრო @@ -954,36 +956,36 @@ სიმაღლე წერტილი GPX ფაილის სახელი - GPX ფაილი წარმატებით იქნა შენახული {0} + GPX ფაილი შენახულია {0} გზების შექმნა (ან არსებული GPX ფაილების გამოყენება/შეცვლა) წერტილებს შორის მანძილის დასათვლელად. GPX შენახვა შეიძლება გამოყენებულ იქნას GPS გზების დასათვლელად. - მანძილის დასათვლელი & დასაგეგმი ხელსაწყო + მანძილის დასათვლელი და დასაგეგმი ხელსაწყო აღარ მაჩვენო ჩასწორების დაწყება ჩასწორების დამთავრება ახალი ქვეგზის დაწყება ყველა წერტილის გასუფთავება - არსებული GPX-ის გახსნა + არსებული GPX ფაილის გახსნა გთხოვთ მოითმინოთ სანამ დასრულდება მიმდინარე ამოცანა - კომპასის ცდომილებების თავიდან ასაცილებლად გამოიყენეთ კალმანის ფილტრი + კომპასის ცდომილებების თავიდან ასაცილებლად გამოიყენეთ კალმანის ფილტრი. კალმანის ფილტრის გამოყენება - კომპასის მნიშვნელობის გამოსათვლელად ორიენტაციის სენსორის მაგიერ მაგნიტური სენსორის გამოყენება + კომპასის მნიშვნელობის გამოსათვლელად ორიენტაციის სენსორის მაგიერ მაგნიტური სენსორის გამოყენება. მაგნიტური სენსორის გამოყენება სხვა დარჩენილია %1$d ფაილი - ჩამოსატვირთად წვდომადია %1$d ფაილი + ჩამოსატვირთია %1$d ფაილი მთლიანი ვერსია - გზის წაშლა + გნებავთ გზის წაშლა\? ნავიგაციის შეწყვეტა დანიშნულების გასუფთავება - wifi მიწვდომადი არაა. ნამდვილად გნებავთ მიმდინარე კავშირით ფაილის ჩამოტვირთვის გაგრძელება? - ქუჩა + wifi მიუწვდომელია. ნამდვილად გნებავთ მიმდინარე კავშირით ფაილის ჩამოტვირთვის გაგრძელება\? + ქუჩის სახელი სახლის ნომერი - ჟურნალიზაციის სერვისები & ძილის რეჟიმი - მოგზაურობების ჩაწერის გამართვა & ძილის რეჟიმის ჩართვა - აპლიკაციის თემის არჩევა + მოგზაურობის ჩაწერა + მოგზაურობების ჩაწერის გამართვა. + აპლიკაციის თემის არჩევა. აპლიკაციის თემა მაღალი წვდომადობის რეჟიმის გამართვა - მისამართის არჩევა + მისამართის მითითება რჩეულის არჩევა OSM ცვლილებები სხვა საქმიანობები @@ -994,20 +996,20 @@ რუკა მოტოციკლების გზების არჩევა არჩევნის გაკეთება… - მოტოციკლების გზებისათვის უპირატესობის მინიჭება + მოტოციკლების გზებისათვის უპირატესობის მინიჭება. არა OpenMaps EU - კონტურული ხაზების მონაცემები - მოთხოვნისას არჩევა - ფოტოებისათვის სისტემური აპლიკაციის გამოყენება + კონტურული ხაზები + მოთხოვნისას\? + ფოტოებისათვის სისტემური აპლიკაციის გამოყენება. კამერის აპლიკაციის გამოყენება OsmAnd რუკები & ნავიგაცია OsmAnd+ რუკები & ნავიგაცია - შემომწირეთ აპლიკაციაში ახალი მახასიათებლების სანახავად - ჩამოტვირთვა + შემომწირეთ აპლიკაციაში ახალი მახასიათებლების სანახავად. + ჩამოტვირთვა… OSM პაროლი(არასავალდებულო) კამერის ფოკუსის ტიპი - აირჩიეთ შიდა კამერის ფოკუსის ტიპი + კამერის ფოკუსი: ავტოფოკუსი ზემაღალი ფოკუსი ველის გაფართოებული სიღრმავე (EDOF) @@ -1015,7 +1017,7 @@ მაკრო (მიახლოებული) ფოკუსის რეჟიმი კამერა განაგრძობს ფოკუსის დაჭერას ფოტოს გადაღებისას ხმის გამოცემა - აირჩიეთ ფოტოების გადაღებისას ხმის გამოსაცემად + აირჩიეთ ფოტოების გადაღებისას ხმის გამოსაცემად. საშიშროება განახლებები ნაპოვნი არაა ცოცხალი განახლებები @@ -1038,7 +1040,7 @@ გამჭირვალე ლურჯი მუქი წითელი გამჭირვალე მუქლი წითელი - ცვლილებების ძალაში მთლიანად შესასვლელად საჭიროა ხელით გადატვირთოთ აპლიკაცია. + ცვლილებების ძალაში მთლიანად შესასვლელად აპლიკაციის გადატვირთვა. ღია მუქი პიემონტური @@ -1081,12 +1083,12 @@ დაბალი ხარისხი მაღალი ხარისხი ვიდეოს ჩვენების ხარისხი - აირჩიეთ ვიდეოს ჩვენების ხარისხი + აირჩიეთ ვიდეოს ხარისხი. აუდიო ფორმატი - აირჩიეთ ხმის ფორმატი + აირჩიეთ ხმის ფორმატი. ხმის ბიტრეიტი - აირჩიეთ ხმის ბიტრეიტი - გთხოვთ აირჩიოთ სწორი POI-ს ტიპი ან გამოტოვოთ + აირჩიეთ ხმის ბიტრეიტი. + გთხოვთ, აირჩიოთ სწორი POI-ს ტიპი ან გამოტოვოთ. მენიუს ღილაკი უშვებს სამართავ პანელს და არა მენიუს წვდომა რუკიდან გაშვებისას ჩვენება @@ -1099,19 +1101,19 @@ მარკერის შესაცვლელად გაამოძრავეთ რუკა მიმართულებების აუდიოკარნახი - OSM ცოცხალი ნავიგაცია + OsmAnd ცოცხალი ნავიგაცია დანიშნულება მითითებული არაა - ველები - მეტი ველები - სიჩქარე + ნაკლებად გორიანი + ბრტყელი + უფრო მოკლე გზები ბალანსი - უსაფრთხოება - პრიორიტეტის ველების ან ბორცვებისთვის მინიჭება + მირჩევნია შემოვლითი გზები + პრიორიტეტის ველების ან ბორცვებისთვის მინიჭება. დაქანება ახალი დასტის დამატება - წერტილები წარმატებით წაიშალა. + წერტილები წაშლილია. დარწმუნებული ბრძანდებით, რომ აპირებთ წაშალოთ %1$d წერტილ(ებ)ი? - ამ გზის მნიშვნელოვანი წერტილები + გზის მნიშვნელოვანი წერტილები მიდევნება მაქს. სიჩქარე საშუალო სიჩქარე @@ -1120,7 +1122,7 @@ საწყისი დრო დამთავრების დრო ფერი - აირჩეთ მიდევნების დასტა + აირჩეთ GPX ფაილების დასტა ფაილის გადაადგილება შეუძლებელია. გადატანა ბილიკები @@ -1132,14 +1134,14 @@ საშუალო სიმაღლე დრო ჯამური მანძილი - რელიეფის სირბილის ფაქტორი + აირჩიეთ გზის სიმაღლის რყევა სიმაღლის მონაცემების გამოყენება - სიღრმის წერტილებისა და კონტურების ჩვენება + სიღრმის წერტილებისა და კონტურების ჩვენება. სიღრმის კონტურები დაშორება შესწორებულია ჩადგმა ფოტოების დამატება - მოცემული ლოკაციისთვის ფოტოები არ არსებობს + ფოტოები ნაპოვნი ვერ იქნა. თავიდან ძებნა ძებნის რადიუსის გაზრდა ვერაფერი ვიპოვეთ :( @@ -1155,18 +1157,18 @@ ჩაწერეთ საფოსტო კოდი უახლოესი ქალაქები აირჩიეთ ქალაქი - აირჩიეთ საფოსტო კოდი - დანიშნულების წერტილის დამატება + საფოსტო კოდის ძებნა + დანიშნულების წერტილი დანიშნულების წერტილის შეცვლა შეცდომა რუკის ფონტები პარკირების ადგილი გაყვანის დრო დროის შეზღუდვის გარეშე - "მთლიანი სტატიის წაკითხვა" + მთლიანი სტატიის წაკითხვა სტატიის წაკითხვა დამატებითი მოქმედებები - ძებნის შინაარსის შეცვლა. + ძებნის შეცვლა. მოქმედებები სანიშნი წაშლილია @@ -1174,22 +1176,22 @@ დამატებულია მოქმედების სახელი ფასი - თვიური გადასახადი + თვიურად ყოველ 3 თვეში გადახდა წელიწადში ერთხელ გადახდა %1$s თვეში %1$.2f %2$s თვეში დაზოგეთ %1$s - თქვენი მიმდინარე გამოწერა + მიმდინარე გამოწერა თვიური განახლება წლიური განახლება %1$.2f %2$s - აირჩიეთ გადახდის თქვენთვის ხელსაყრელი პერიოდი: + გადახდის ინტერვალი: გადასახადის ნაწილი მიედინება OpenStreetMap-ის ავტორებთან. რუკის სანიშნის ჩასწორება სხვა აპლიკაცია ქუჩის ძებნა - ქალაქის არჩევა + გთხოვთ აირჩიოთ დასახლებული პუნქტი აღდგენა გზის ატვირთვა… ძებნის რადიუსის გაზრდა %1$s-მდე @@ -1245,4 +1247,555 @@ სეგმენტის დამატება OsmAnd-ის პროფილი პროფილი + საჭიროა იმპორტისთვის + აირჩიეთ საიმპორტო პუნქტები. + Mapillary-ში დამატება + OpenPlaceReviews-ში დამატება + + თვალთვალი + გზის ჩაწერა + ჯგუფის ჩასწორება + GPS-ის სტატუსი + ქუჩის განათება + პროქსის პორტი + პროქსის მისამართი + ფეხით მოსიარულეთა გზაჯვარედინები + ფეხით მოსიარულეთა გადასასვლელი + ფეხით მოსიარულეთა გადასასვლელები + რკინიგზასთან კვეთები + რკინიგზის კვეთა + გზის სტილი + ტრანსპორტის გაჩერებები + რუკის ენა + ჩამოწერები + ძებნა + თავიდან ავიცილოთ გზები… + ავტობუსის გზები + ტროლეიბუსის გზები + ტრამვაის გზები + სარკინიგზო გზები + რუკის გამართვა + მარცხენა პანელი + მარჯვენა პანელი + დარჩენილი ელემენტები + ანონიმური მომხმარებელი + გზის დაბეჭდვა + ტექსტის ზომა + სიჩქარის კამერა + შეჩერების ნიშანი + მაღალი კაბინა + სასაზღვრო კონტროლი + სიჩქარის ლიმიტი + ყოველთვის მკითხე + შეტყობინებები საცობის შესახებ + უახლოესი POI + უახლოესი რჩეული ადგილები + ფეხით + რუკის დათვალიერება + ნავიგაციის შეჩერება + ნავიგაციის გაგრძელება + სერბული (კირილიცა) + წვდომის შეზღუდვები + ნაკლები დეტალი + მეტი დეტალი + დანიშნულების წერტილების მითითება + %1$s +\nწერტილი + %1$s -ე წერტილი + %1$s წერტილი + დაღმართი/აღმართი: %1$s + მიმდინარე დრო + იტვირთება %1$s… + ფერი + ჩამოსვლის გამოცხადება + მუსიკის პაუზა + ბრაზილიური პორტუგალიური + ნორვეგიული ბოქმალი + ინფორმაცია გზის შესახებ + გზის პარამეტრები + დანიშნულების წერტილის დაყენება + აირჩიეთ GPX… + წონის ლიმიტი + ავტოსტრადებისთვის თავის არიდება + ავტოსტრადების გარეშე + ბორნების თავიდან აცილება + ბორნების გარეშე + ავტოსტრადებისთვის უპირატესობების მინიჭება + ავტოსტრადებისთვის უპირატესობების მინიჭება + წარმოთქმის სიჩქარე + გზების პარამეტრები + ნავიგაციის პარამეტრები + კაიაკი + მოტორიანი ნავი + გაზიარებული + რუკები + ფილები + გამოთვლა + კავშირი + საჰაერო + განუსაზღვრელი + ექსტრემალური + დაგორება + ექსპერტი + რთული + საშუალო + ადვილი + ახალბედა + სკანდინავიელი + დაღმართი + კავშირი + ლაშქრობა + სლედი + მარხილი + დასტა… + სხვა + ანალიტიკა + მაგალითი + უფასო + წელი + წელი + წელი + თვე + თვე + თვე + კვირა + კვირა + კვირა + დღე + დღე + დღე + ვაგონი + ოქსიტური + ნაგულისხმევი + დამსვენებელი + რბილი + ციცაბო + სიგლუვე + ზედაპირი + Parrot + WunderLINQ + კლავიატურა + არცერთი + სკუტერი + ცალბორბალა + ამო + კრიტიკული შეცდომა + ხატულა + ფუქსინი + თხილამური + სლედი + გეოკოდირება + სრიალი + სრიალი + სრიალი + ვერტმფრენი + ცხენი + მიწისქვეშა გადასასვლელი + ტაქსი + დაშვება + ტარიფი + მილირადიანი + სიარული + გაურკვეველი + ველობილიკი + ბილიკი + ნაბიჯი + საჯირითო გზა + საცალფეხო ქუჩა + მომსახურება + ქუჩა + გზა + საავტომობილო გზა + შეუძლებელი + საშინელი + ცუდი + საშუალო + კარგი + შესანიშნავი + შეფუთული + ხრეში + ხე + ლითონი + ქვა + კენჭები + რიყის ქვა + კოჭი + ცემენტი + მოკირწყლული + ასფალტი + თოვლი + მარილი + ყინული + ტალახი + მიწა + ნიადაგი + ბალახი + ქვიშა + მოუკირწყლავი + სათითაოდ + გაცვლა + სამუშაო + სიმაღლე + სიგანე + ტევადობა + + მ³ + გადარიცხვები + გუარანი + გაშვება + გამოწერები + შავი + გზის წერტილი + გზის წერტილი + წერტილი + ხედი + არ + Wikivoyage + შიგთავსი + წაკითხვა + გამოკვლევა + შედეგი + ჯამში + ჩრდ. + სამხ. + დას. + აღმ. + DD°MM.MMM′ + DD°MM.MMMM′ + DD.DDDDD° + DD.DDDDDD° + DD°MM′SS″ + მიმდინარე + გვირაბები + საზღვაო + გამორთვა + ლაოსური + მეტი + ერთი + ორი + ჩასმა + მარცხნივ + მარჯვნივ + უკან + გზა + სანიშნები + დალაგება + დასრულება + დამატებულია + ა-ჰ + ჰ-ა + გუშინ + დღეს + ჯგუფები + ხაზი + თავიდან + მინ/მაქს + მაქს/მინ + აღმავალი/დაღმავალი + საშუალო + მომხმარებელი + თარიღი + -დან + -მდე + უფლებები + ავტომატური + ბორცვიანი + ბერბერული + შეტყობინება + ნავიგაცია + ადგილი + დაბალი + საშუალო + მაღალი + წყალი + კარგი + ჩაწერა + ჩანაწერი + მოგზაურობა + პაუზა + გაგრძელება + ქვეკატეგორიები + dev.openstreetmap.org-ის გამოყენება + %1$s * %2$s + მსუბუქი თვითმფრინავი + ნაწილების შეერთება + გაყოფა მანამდე + გაყოფა შემდეგ + ბოლოს გამოყენებული + ფილტრები + ქაბული + ავსტრალია + მილები/მეტრები + შეცვლა + კატეგორიები + საფოსტო კოდი + სამეზობლო + ოლქი + -დან + ძებნა + მატარებელი + ავტობუსი + ასტურული + კანნადური + დალაგება + გაშლა + სქელი + საშუალო + თხელი + რეპორტი + არააქტიური + აქტიური + გამოწერა + შემოწირულობები + სტატუსი + ღამე + წაშლა + არჩევა + ტიპი + დილა + ყოველკვირეულად + დღიურად + საათობრივ + ხმა + დრო: + მანძილი: + ყავისფერი + ვარდისფერი + თავიდან გახნა + აღსრულება + მდებარეობა + ფრისკული + მაკედონიური + განახლება + ატვირთვა + უკუკავშირი + კონტაქტი + ვერსიები + კითხვაპასუხი + სხვა + მახასიათებლები + გაგზავნა + geo: + ჩამოწერები + რეგიონები + გვიან + შეძენა + მ/წმ + წთ/კმ + წთ/მილი + კნ + ნმ + სხვა + ნავიგაცია + გზები + Wikipedia + წაშლა + რჩეულები + დამატებით + ძირითადი + მდებარეობები + შემდეგი + OsmAnd + გამოტოვება + გაუქმება + Wikipedia + Wikipedia + გამორთულია + ასლი + ნაგულისხმევი + ყველა + ჩასწორება + მართვა + ადგილები + ძებნა + მისამართი + შეტყობინება + კეთილი იყოს თქვენი მობრძანება + წინ + დარჩა + წთ + სთ + ჩამოშლა + ფოტო + ვიდეო + აუდიო + რჩეულები + რჩეული + ჩვენება + მეტი… + ექსპორტი + გაზიარება + არჩევის მოხსნა + არასდროს + არჩულია + არჩეული + გამორთული + ჩართული + გამორთვა + ჩართვა + მოშორება + გამოშვებულია + ყურება + პირადი მონაცემები + ნაგულისხმევი + მართვა + აღმოსავლეთისკენ + არაფერი + ზონა + განახლებები + კოორდინატები + სახლი + დამალვა + გზები + ტრანსპორტი + დეტალები + მანძილი + ხანგრძლივობა + h + ტური + ველოსიპედი + მანქანა + გვიანი + ნორმალური + ადრეული + სარდინიული + არაბული + ალბანური + გაჩერება + სპარსული + სამუშაო დაფა + გადაგზავნა + ებრაული + სუაჰილური + ტექსტი + შენობები + ნაწილი + დაკავშირება + დღე + ლოკალიზაცია + სხვა + ხმა + ხორვატული + ჩინური + უელსური + უკრაინული + თურქული + შვედური + ესპანური + სლოვენიური + სლოვაკური + რუსული + რუმინული + კორეული + იაპონური + იტალიური + ინდონეზიური + უნგრული + ინდური + ებრაული + ბერძნული + გერმანული + ქართული + ფრანგული + ფინური + ჰოლანდიური + დანიური + ჩეხური + კატალანური + ბულგარული + ბოსნიური + ბელორუსული + ბასკური + სომხური + აფრიკაანსი + ინგლისური + ჩაწერა + დანიშნულების წერტილი + პორტუგალიური + პოლონური + მარათი + ლიეტუვური + ლატვიური + წაშლა + ტონა + მეტრი + ღამის რუკა + ონლაინ წყაროს დამატება + ჭურჭლის სიმაღლის მითითება + სიგრძის ლიმიტი + %1$s წაშლილია + არჩეული სირთულე + %1$s - %2$s + კომფორტი + სპეციალური + ტრანსპორტი + სერვისი + სპორტი + ავარია + მოგზაურობა + ანგარიში + შესვლა + ბორცვები + სატვირთო + MGRS + MGRS + სიმბოლოები + შუალედი + გრაფიკი + განვითარება + თავიდან + ფაილის სახელი + დასრულებულია + ხელნაკეთი + მყარი + გორგოლაჭებიანი სავარძელი + იურიდიული ინფორმაცია + ყოველთვის + გაგრძელება + რჩეული + კანტონური + იორუბული + ვარაული + უზბეკური + ურდუ + თათრული + ტაჯიკური + შოტლანდიური + სიცილიური + პუნჯაბური + ნეპალური + ნეაპოლური + ბირმული + მონღოლური + მინანგკაბაური + მალაიზიური + ყირგიზული + ყაზახური + იავური + გუჯარათული + ჩუვაშური + ჩეჩნური + ბავარიული + ბაშკირული + არაგონიული + ლომბარდი + გამყოფი + დამალული + ენები + ენა + აღწერა + ბორცვი + გარეგნობა + ანტარქტიკა + მიმართულებები + დანიშნულების წერტილამდე + %1$s/%2$s + ხელმისაწვდომია + გაფრთხილება + OSM + გამოცხადება + სქელი + პირადი + შემობრუნება + თეთრი \ No newline at end of file From 1aee1c6d00622f20a5312f340102fae99f3a58f8 Mon Sep 17 00:00:00 2001 From: Yaron Shahrabani Date: Sat, 2 Jan 2021 14:06:33 +0000 Subject: [PATCH 34/37] Translated using Weblate (Hebrew) Currently translated at 99.9% (3589 of 3590 strings) --- OsmAnd/res/values-iw/strings.xml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/OsmAnd/res/values-iw/strings.xml b/OsmAnd/res/values-iw/strings.xml index 97db038f97..90f56acd71 100644 --- a/OsmAnd/res/values-iw/strings.xml +++ b/OsmAnd/res/values-iw/strings.xml @@ -3802,7 +3802,7 @@ נא לספק שם לנקודה מוחק את נקודת היעד הבאה במסלול שלך. אם זו נקודת היעד, הניווט ייפסק. הורדת מפות ויקיפדיה - קבלת מידע על נקודות עניין מוויקיפדיה. מדריך הכיס הפרטי שלך - עליך פשוט להפעיל את התוסף של ויקיפדיה וליהנות מערכים על מה שסביבך. + קבלת מידע על נקודות עניין מוויקיפדיה, מדריך הכיס הפרטי שלך עם ערכים על מקומות ויעדים. אופנוע שטח טוסטוס כסא גלגלים @@ -3982,7 +3982,7 @@ היסטוריית חיפוש קיאק סירת מנוע - + „ניתן לזיהוי” משמעו שהעקבות תופענה באופן ציבורי בעקבות ה־GPS וברישומי עקבות GPS ציבוריים, כלומר שמשתמשים אחרים יוכלו להוריד את העקבות הגולמיים ולשייך אותם עם שם המשתמש שלך. נתוני נקודות מעקב ציבורית עם חתימת זמן מה־API של ה־GPS שמוגשות דרך ה־API של נקודות המעקב יפנו אל עמוד המעקב המקורי שלך. משאבים גודל קובץ משוערך נא לבחור את הנתונים שייוצאו לקובץ. @@ -4029,4 +4029,6 @@ לאפשר נחלים וניקוזים לאפשר מקטעים עם דרכי מים עונתיים לאפשר מקטעים עם דרכי מים עונתיים + „ציבורי” משמעו שהעקבות מופיעים באופן ציבורי בעקבות ה־GPS שלך וברישומי עקבות GPS ציבוריים וברישומי מעקב ציבוריים עם חותמות זמן בתצורה גולמית. הנתונים שמוגשים דרך ה־API אינם מפנים אל עמוד העקבות שלך. חותמות הזמן של נקודות המעקב אינן זמינות דרך ה־API של ה־GPS ונקודות המעקב אינן מסודרות בהתאם לזמן שתועדו. + „פרטי” משמעות שהעקבות לא תופענה ברישומים ציבוריים אך נקודות מעקב ממתוכן תהיינה זמינות בסדר אקראי דרך ה־API הציבורי של ה־GPS ללא חותמות זמן. \ No newline at end of file From 7f711863829203969068c32709167bbfaf444f00 Mon Sep 17 00:00:00 2001 From: Ajeje Brazorf Date: Sat, 2 Jan 2021 17:21:42 +0000 Subject: [PATCH 35/37] Translated using Weblate (Sardinian) Currently translated at 99.7% (3870 of 3881 strings) --- OsmAnd/res/values-sc/phrases.xml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/OsmAnd/res/values-sc/phrases.xml b/OsmAnd/res/values-sc/phrases.xml index 939dd49e0c..7891e73884 100644 --- a/OsmAnd/res/values-sc/phrases.xml +++ b/OsmAnd/res/values-sc/phrases.xml @@ -306,7 +306,7 @@ Funiculare Base militare navale Caserma - Istatzione de carrigamentu + Istatzione de carrigamentu;Istatzione de carrigamentu de veìculos elètricos;Istatzione de càrriga elètrica;Puntu de càrriga;Istatzione de càrriga elètrica;Trastes pro s\'alimentatzione de veìculos elètricos Rampa pro veìculos Àera cumpressa Nolu bitziclètas @@ -3894,4 +3894,8 @@ Istatzione de sos rangers Sabunadòrgiu Istatzione de tramudòngiu de s\'arga + Gallerias pro tzintzimurreddos + Pontes pro tzintzimurreddos + Logu de atraessamentu de sa fàuna areste + Logu pro nadare \ No newline at end of file From e8ff8748dd5a6cd61d289362311495d4843b9919 Mon Sep 17 00:00:00 2001 From: Jorge Sanz Sanfructuoso Date: Sat, 2 Jan 2021 20:09:23 +0000 Subject: [PATCH 36/37] Translated using Weblate (Spanish) Currently translated at 100.0% (3881 of 3881 strings) --- OsmAnd/res/values-es/phrases.xml | 56 ++++++++++++++++++++++++++++++-- 1 file changed, 54 insertions(+), 2 deletions(-) diff --git a/OsmAnd/res/values-es/phrases.xml b/OsmAnd/res/values-es/phrases.xml index 5dec11e335..64bb0ce9c9 100644 --- a/OsmAnd/res/values-es/phrases.xml +++ b/OsmAnd/res/values-es/phrases.xml @@ -124,7 +124,7 @@ Metanol Hidrógeno líquido Electricidad - Estación de carga + Estación de carga;Estación de carga de vehículos eléctricos; Punto de recarga eléctrica; Punto de carga; Estación de carga electrónica; Equipo de suministro de vehículos eléctricos Rampa de vehículos Aire comprimido Aparcamiento @@ -3626,7 +3626,7 @@ Acceso de vehículos: militar Acceso del vehículo: entrega Acceso de vehículos: silvicultura - Acceso a los coches: + Acceso a los coches: si Acceso para automóviles: privado Acceso para automóviles: no Acceso para automóviles: destino @@ -3851,4 +3851,56 @@ Azotea Punto GPX Gas natural licuado + Enlace + Enlace + Túnel para murciélagos + Puente para murciélagos + Cruce de vida silvestre + Área de natación + Lavadero público de ropa + Estación de guardabosques + Pozo + Pozo entubado + Enfermera + Agente de dinero móvil + Cónsul honorario + Oficina consular + Agencia consular + Dirigido por un cónsul + Nunciatura + Servicios al ciudadano + Visas de inmigrante + Visas de no inmigrante + Estación de transferencia de residuos + Báscula + Lago + Río + Bomba accionada + Depósito de agua + Grifo + Planta potabilizadora + Vacunación: COVID 19 + Vacunación + Base de salvavidas + Sirena + No + + No + + No + + Subnacional + Oficina representativa + Oficina + Consulado general + Residencia + Misión + Sección de intereses + Alto comisionado + Delegación + Rama/sucursal + Encabezado por un embajador + Embajada + Consulado + Embajada \ No newline at end of file From 196cf95c479b7045a78948125bcd369ef17a1912 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20H=C3=A5ll?= Date: Sat, 2 Jan 2021 21:33:21 +0000 Subject: [PATCH 37/37] Translated using Weblate (Swedish) Currently translated at 64.9% (2333 of 3590 strings) --- OsmAnd/res/values-sv/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd/res/values-sv/strings.xml b/OsmAnd/res/values-sv/strings.xml index a76b8f97b3..4a7805d1bc 100644 --- a/OsmAnd/res/values-sv/strings.xml +++ b/OsmAnd/res/values-sv/strings.xml @@ -3054,7 +3054,7 @@ Vänligen tillhandahåll fullständig kod Prenumerationen på OsmAnd Live är Skicka GPX fil till OpenStreetMap Ange taggar sepparerade med komma (,). - Välj + Välj bredd Anpassad Dirigeringspilar Senast ändrad