diff --git a/OsmAnd-java/src/main/java/net/osmand/GPXUtilities.java b/OsmAnd-java/src/main/java/net/osmand/GPXUtilities.java index 200dca61dc..4cd237fc66 100644 --- a/OsmAnd-java/src/main/java/net/osmand/GPXUtilities.java +++ b/OsmAnd-java/src/main/java/net/osmand/GPXUtilities.java @@ -936,7 +936,6 @@ public class GPXUtilities { sp = new SplitSegment(segment, k - 1, cf); currentMetricEnd += metricLimit; - prev = sp.get(0); } total += currentSegment; } diff --git a/OsmAnd-java/src/main/java/net/osmand/NativeLibrary.java b/OsmAnd-java/src/main/java/net/osmand/NativeLibrary.java index 25e1a21969..0189d38378 100644 --- a/OsmAnd-java/src/main/java/net/osmand/NativeLibrary.java +++ b/OsmAnd-java/src/main/java/net/osmand/NativeLibrary.java @@ -26,10 +26,9 @@ import net.osmand.data.QuadRect; import net.osmand.render.RenderingRuleSearchRequest; import net.osmand.render.RenderingRulesStorage; import net.osmand.router.NativeTransportRoutingResult; -import net.osmand.router.PrecalculatedRouteDirection; import net.osmand.router.RouteCalculationProgress; import net.osmand.router.RouteSegmentResult; -import net.osmand.router.RoutingConfiguration; +import net.osmand.router.RoutingContext; import net.osmand.router.TransportRoutingConfiguration; import net.osmand.util.Algorithms; @@ -135,12 +134,10 @@ public class NativeLibrary { return nativeTransportRouting(new int[] { sx31, sy31, ex31, ey31 }, cfg, progress); } - public RouteSegmentResult[] runNativeRouting(int sx31, int sy31, int ex31, int ey31, RoutingConfiguration config, - RouteRegion[] regions, RouteCalculationProgress progress, PrecalculatedRouteDirection precalculatedRouteDirection, - boolean basemap, boolean publicTransport, boolean startTransportStop, boolean targetTransportStop) { + public RouteSegmentResult[] runNativeRouting(RoutingContext c, RouteRegion[] regions, boolean basemap) { // config.router.printRules(System.out); - return nativeRouting(new int[] { sx31, sy31, ex31, ey31 }, config, config.initialDirection == null ? -360 : config.initialDirection.floatValue(), - regions, progress, precalculatedRouteDirection, basemap, publicTransport, startTransportStop, targetTransportStop); + return nativeRouting(c, c.config.initialDirection == null ? -360 : c.config.initialDirection.floatValue(), + regions, basemap); } @@ -156,16 +153,15 @@ public class NativeLibrary { protected static native NativeRouteSearchResult loadRoutingData(RouteRegion reg, String regName, int regfp, RouteSubregion subreg, boolean loadObjects); + public static native void deleteNativeRoutingContext(long handle); + protected static native void deleteRenderingContextHandle(long handle); protected static native void deleteRouteSearchResult(long searchResultHandle); protected static native RouteDataObject[] getRouteDataObjects(RouteRegion reg, long rs, int x31, int y31); - protected static native RouteSegmentResult[] nativeRouting(int[] coordinates, RoutingConfiguration r, - float initDirection, RouteRegion[] regions, RouteCalculationProgress progress, - PrecalculatedRouteDirection precalculatedRouteDirection, boolean basemap, - boolean publicTransport, boolean startTransportStop, boolean targetTransportStop); + protected static native RouteSegmentResult[] nativeRouting(RoutingContext c, float initDirection, RouteRegion[] regions, boolean basemap); protected static native NativeTransportRoutingResult[] nativeTransportRouting(int[] coordinates, TransportRoutingConfiguration cfg, RouteCalculationProgress progress); diff --git a/OsmAnd-java/src/main/java/net/osmand/binary/GeocodingUtilities.java b/OsmAnd-java/src/main/java/net/osmand/binary/GeocodingUtilities.java index 1699d749d9..77357bac9b 100644 --- a/OsmAnd-java/src/main/java/net/osmand/binary/GeocodingUtilities.java +++ b/OsmAnd-java/src/main/java/net/osmand/binary/GeocodingUtilities.java @@ -4,6 +4,7 @@ import net.osmand.PlatformUtil; import net.osmand.ResultMatcher; import net.osmand.CollatorStringMatcher.StringMatcherMode; import net.osmand.binary.BinaryMapIndexReader.SearchRequest; +import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteRegion; import net.osmand.data.Building; import net.osmand.data.City; import net.osmand.data.LatLon; @@ -23,9 +24,11 @@ import java.text.Collator; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; +import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.Set; import gnu.trove.set.hash.TLongHashSet; @@ -40,7 +43,7 @@ public class GeocodingUtilities { public static final float STOP_SEARCHING_STREET_WITH_MULTIPLIER_RADIUS = 250; public static final float STOP_SEARCHING_STREET_WITHOUT_MULTIPLIER_RADIUS = 400; - public static final int DISTANCE_STREET_NAME_PROXIMITY_BY_NAME = 15000; + public static final int DISTANCE_STREET_NAME_PROXIMITY_BY_NAME = 45000; public static final float DISTANCE_STREET_FROM_CLOSEST_WITH_SAME_NAME = 1000; public static final float THRESHOLD_MULTIPLIER_SKIP_BUILDINGS_AFTER = 1.5f; @@ -142,15 +145,12 @@ public class GeocodingUtilities { RoutePlannerFrontEnd rp = new RoutePlannerFrontEnd(); List lst = new ArrayList(); List listR = new ArrayList(); - rp.findRouteSegment(lat, lon, ctx, listR); + // we allow duplications to search in both files for boundary regions + rp.findRouteSegment(lat, lon, ctx, listR, false, true); double distSquare = 0; - TLongHashSet set = new TLongHashSet(); - Set streetNames = new HashSet(); + Map> streetNames = new HashMap<>(); for (RouteSegmentPoint p : listR) { RouteDataObject road = p.getRoad(); - if (!set.add(road.getId())) { - continue; - } // System.out.println(road.toString() + " " + Math.sqrt(p.distSquare)); String name = Algorithms.isEmpty(road.getName()) ? road.getRef("", false, true) : road.getName(); if (allowEmptyNames || !Algorithms.isEmpty(name)) { @@ -164,7 +164,13 @@ public class GeocodingUtilities { sr.connectionPoint = new LatLon(MapUtils.get31LatitudeY(p.preciseY), MapUtils.get31LongitudeX(p.preciseX)); sr.regionFP = road.region.getFilePointer(); sr.regionLen = road.region.getLength(); - if (streetNames.add(sr.streetName)) { + List plst = streetNames.get(sr.streetName); + if (plst == null) { + plst = new ArrayList(); + streetNames.put(sr.streetName, plst); + } + if (!plst.contains(road.region)) { + plst.add(road.region); lst.add(sr); } } @@ -308,6 +314,48 @@ public class GeocodingUtilities { return res; } + public void filterDuplicateRegionResults(final List res) { + Collections.sort(res, DISTANCE_COMPARATOR); + // filter duplicate city results (when building is in both regions on boundary) + for (int i = 0; i < res.size() - 1;) { + int cmp = cmpResult(res.get(i), res.get(i + 1)); + if (cmp > 0) { + res.remove(i); + } else if (cmp < 0) { + res.remove(i + 1); + } else { + // nothing to delete + i++; + } + } + } + + private int cmpResult(GeocodingResult gr1, GeocodingResult gr2) { + boolean eqStreet = Algorithms.stringsEqual(gr1.streetName, gr2.streetName); + if (eqStreet) { + boolean sameObj = false; + if (gr1.building != null && gr2.building != null) { + if (Algorithms.stringsEqual(gr1.building.getName(), gr2.building.getName())) { + // same building + sameObj = true; + } + } else if (gr1.building == null && gr2.building == null) { + // same street + sameObj = true; + } + if (sameObj) { + double cityDist1 = MapUtils.getDistance(gr1.searchPoint, gr1.city.getLocation()); + double cityDist2 = MapUtils.getDistance(gr2.searchPoint, gr2.city.getLocation()); + if (cityDist1 < cityDist2) { + return -1; + } else { + return 1; + } + } + } + return 0; + } + private List loadStreetBuildings(final GeocodingResult road, BinaryMapIndexReader reader, GeocodingResult street) throws IOException { final List streetBuildings = new ArrayList(); diff --git a/OsmAnd-java/src/main/java/net/osmand/data/Amenity.java b/OsmAnd-java/src/main/java/net/osmand/data/Amenity.java index a041d6f694..38854cb33b 100644 --- a/OsmAnd-java/src/main/java/net/osmand/data/Amenity.java +++ b/OsmAnd-java/src/main/java/net/osmand/data/Amenity.java @@ -38,6 +38,7 @@ public class Amenity extends MapObject { public static final String COLLECTION_TIMES = "collection_times"; public static final String CONTENT = "content"; public static final String CUISINE = "cuisine"; + public static final String WIKIDATA = "wikidata"; public static final String DISH = "dish"; public static final String REF = "ref"; public static final String OSM_DELETE_VALUE = "delete"; diff --git a/OsmAnd-java/src/main/java/net/osmand/router/BinaryRoutePlanner.java b/OsmAnd-java/src/main/java/net/osmand/router/BinaryRoutePlanner.java index 5c0f38f4a5..6b8926b413 100644 --- a/OsmAnd-java/src/main/java/net/osmand/router/BinaryRoutePlanner.java +++ b/OsmAnd-java/src/main/java/net/osmand/router/BinaryRoutePlanner.java @@ -68,7 +68,6 @@ public class BinaryRoutePlanner { FinalRouteSegment searchRouteInternal(final RoutingContext ctx, RouteSegmentPoint start, RouteSegmentPoint end, RouteSegment recalculationEnd ) throws InterruptedException, IOException { // measure time - ctx.timeToLoad = 0; ctx.memoryOverhead = 1000; // Initializing priority queue to visit way segments @@ -120,7 +119,9 @@ public class BinaryRoutePlanner { if (ctx.memoryOverhead > ctx.config.memoryLimitation * 0.95) { throw new IllegalStateException("There is not enough memory " + ctx.config.memoryLimitation / (1 << 20) + " Mb"); } - ctx.visitedSegments ++; + if (ctx.calculationProgress != null) { + ctx.calculationProgress.visitedSegments++; + } if (forwardSearch) { boolean doNotAddIntersections = onlyBackward; processRouteSegment(ctx, false, graphDirectSegments, visitedDirectSegments, @@ -164,12 +165,14 @@ public class BinaryRoutePlanner { throw new InterruptedException("Route calculation interrupted"); } } - ctx.visitedSegments += visitedDirectSegments.size() + visitedOppositeSegments.size(); - ctx.visitedDirectSegments += visitedDirectSegments.size(); - ctx.visitedOppositeSegments += visitedOppositeSegments.size(); - ctx.directQueueSize = graphDirectSegments.size(); // Math.max(ctx.directQueueSize, graphDirectSegments.size()); - ctx.oppositeQueueSize = graphReverseSegments.size(); - ctx.visitedOppositeSegments += visitedOppositeSegments.size(); + if (ctx.calculationProgress != null) { + ctx.calculationProgress.visitedDirectSegments += visitedDirectSegments.size(); + ctx.calculationProgress.visitedOppositeSegments += visitedOppositeSegments.size(); + ctx.calculationProgress.directQueueSize += graphDirectSegments.size(); // Math.max(ctx.directQueueSize, + // graphDirectSegments.size()); + ctx.calculationProgress.oppositeQueueSize += graphReverseSegments.size(); + ctx.calculationProgress.visitedOppositeSegments += visitedOppositeSegments.size(); + } return finalSegment; } @@ -371,18 +374,21 @@ public class BinaryRoutePlanner { } public static void printDebugMemoryInformation(RoutingContext ctx) { - printInfo(String.format("Time. Total: %.2f, to load: %.2f, to load headers: %.2f, to calc dev: %.2f ", - (System.nanoTime() - ctx.timeToCalculate) / 1e6, ctx.timeToLoad / 1e6, - ctx.timeToLoadHeaders / 1e6, ctx.timeNanoToCalcDeviation / 1e6)); -// GeneralRouter.TIMER = 0; - int maxLoadedTiles = Math.max(ctx.maxLoadedTiles, ctx.getCurrentlyLoadedTiles()); - printInfo("Current loaded tiles : " + ctx.getCurrentlyLoadedTiles() + ", maximum loaded tiles " + maxLoadedTiles); - printInfo("Loaded tiles " + ctx.loadedTiles + " (distinct " + ctx.distinctLoadedTiles + "), unloaded tiles " + ctx.unloadedTiles + - ", loaded more than once same tiles " - + ctx.loadedPrevUnloadedTiles); - printInfo("Visited segments " + ctx.visitedSegments + ", relaxed roads " + ctx.relaxedSegments); - printInfo("Priority queues sizes : " + ctx.directQueueSize + "/" + ctx.oppositeQueueSize); - printInfo("Visited interval sizes: " + ctx.visitedDirectSegments + "/" + ctx.visitedOppositeSegments); + if (ctx.calculationProgress != null) { + RouteCalculationProgress p = ctx.calculationProgress; + printInfo(String.format("Time. Total: %.2f, to load: %.2f, to load headers: %.2f, to find start/end: %.2f, extra: %.2f ", + p.timeToCalculate / 1e6, p.timeToLoad / 1e6, p.timeToLoadHeaders / 1e6, + p.timeToFindInitialSegments / 1e6, p.timeNanoToCalcDeviation / 1e6)); + // GeneralRouter.TIMER = 0; + int maxLoadedTiles = Math.max(p.maxLoadedTiles, ctx.getCurrentlyLoadedTiles()); + printInfo("Current loaded tiles : " + ctx.getCurrentlyLoadedTiles() + ", maximum loaded tiles " + + maxLoadedTiles); + printInfo("Loaded tiles " + p.loadedTiles + " (distinct " + p.distinctLoadedTiles + "), unloaded tiles " + + p.unloadedTiles + ", loaded more than once same tiles " + p.loadedPrevUnloadedTiles); + printInfo("Visited segments: " + ctx.getVisitedSegments() + ", relaxed roads " + p.relaxedSegments); + printInfo("Priority queues sizes : " + p.directQueueSize + "/" + p.oppositeQueueSize); + printInfo("Visited interval sizes: " + p.visitedDirectSegments + "/" + p.visitedOppositeSegments); + } } @@ -849,9 +855,12 @@ public class BinaryRoutePlanner { } public static class RouteSegmentPoint extends RouteSegment { + public RouteSegmentPoint(RouteDataObject road, int segmentStart, double distSquare) { super(road, segmentStart); this.distSquare = distSquare; + this.preciseX = road.getPoint31XTile(segmentStart); + this.preciseY = road.getPoint31YTile(segmentStart); } public RouteSegmentPoint(RouteSegmentPoint pnt) { @@ -871,6 +880,11 @@ public class BinaryRoutePlanner { } + @Override + public String toString() { + return String.format("%d (%s): %s", segStart, getPreciseLatLon(), road); + } + } public static class RouteSegment { diff --git a/OsmAnd-java/src/main/java/net/osmand/router/RouteCalculationProgress.java b/OsmAnd-java/src/main/java/net/osmand/router/RouteCalculationProgress.java index b34c2fd5bb..eb93e95699 100644 --- a/OsmAnd-java/src/main/java/net/osmand/router/RouteCalculationProgress.java +++ b/OsmAnd-java/src/main/java/net/osmand/router/RouteCalculationProgress.java @@ -12,12 +12,29 @@ public class RouteCalculationProgress { public float totalEstimatedDistance = 0; public float routingCalculatedTime = 0; - public int loadedTiles = 0; + + public int relaxedSegments = 0; public int visitedSegments = 0; + public int visitedDirectSegments = 0; + public int visitedOppositeSegments = 0; + public int directQueueSize = 0; + public int oppositeQueueSize = 0; public int totalIterations = 1; public int iteration = -1; + public long timeNanoToCalcDeviation = 0; + public long timeToLoad = 0; + public long timeToLoadHeaders = 0; + public long timeToFindInitialSegments = 0; + public long timeToCalculate = 0; + + public int distinctLoadedTiles = 0; + public int maxLoadedTiles = 0; + public int loadedPrevUnloadedTiles = 0; + public int unloadedTiles = 0; + public int loadedTiles = 0; + public boolean isCancelled; public boolean requestPrivateAccessRouting; diff --git a/OsmAnd-java/src/main/java/net/osmand/router/RoutePlannerFrontEnd.java b/OsmAnd-java/src/main/java/net/osmand/router/RoutePlannerFrontEnd.java index 60dc5add01..826a40dbb8 100644 --- a/OsmAnd-java/src/main/java/net/osmand/router/RoutePlannerFrontEnd.java +++ b/OsmAnd-java/src/main/java/net/osmand/router/RoutePlannerFrontEnd.java @@ -117,15 +117,21 @@ public class RoutePlannerFrontEnd { } public RouteSegmentPoint findRouteSegment(double lat, double lon, RoutingContext ctx, List list, boolean transportStop) throws IOException { + return findRouteSegment(lat, lon, ctx, list, false, false); + } + + public RouteSegmentPoint findRouteSegment(double lat, double lon, RoutingContext ctx, List list, boolean transportStop, + boolean allowDuplications) throws IOException { + long now = System.nanoTime(); int px = MapUtils.get31TileNumberX(lon); int py = MapUtils.get31TileNumberY(lat); ArrayList dataObjects = new ArrayList(); - ctx.loadTileData(px, py, 17, dataObjects); + ctx.loadTileData(px, py, 17, dataObjects, allowDuplications); if (dataObjects.isEmpty()) { - ctx.loadTileData(px, py, 15, dataObjects); + ctx.loadTileData(px, py, 15, dataObjects, allowDuplications); } if (dataObjects.isEmpty()) { - ctx.loadTileData(px, py, 14, dataObjects); + ctx.loadTileData(px, py, 14, dataObjects, allowDuplications); } if (list == null) { list = new ArrayList(); @@ -167,6 +173,9 @@ public class RoutePlannerFrontEnd { return Double.compare(o1.distSquare, o2.distSquare); } }); + if (ctx.calculationProgress != null) { + ctx.calculationProgress.timeToFindInitialSegments += (System.nanoTime() - now); + } if (list.size() > 0) { RouteSegmentPoint ps = null; if (ctx.publicTransport) { @@ -203,12 +212,12 @@ public class RoutePlannerFrontEnd { useSmartRouteRecalculation = use; } - // TODO native matches less roads public GpxRouteApproximation searchGpxRoute(GpxRouteApproximation gctx, List points) throws IOException, InterruptedException { - gctx.ctx.timeToCalculate = System.nanoTime(); + long timeToCalculate = System.nanoTime(); if (gctx.ctx.calculationProgress == null) { gctx.ctx.calculationProgress = new RouteCalculationProgress(); } + gctx.ctx.keepNativeRoutingContext = true; List gpxPoints = generageGpxPoints(points, gctx); GpxPoint start = null; GpxPoint prev = null; @@ -228,6 +237,8 @@ public class RoutePlannerFrontEnd { routeFound = findGpxRouteSegment(gctx, gpxPoints, start, next, prev != null); if (routeFound) { // route is found - cut the end of the route and move to next iteration +// start.stepBackRoute = new ArrayList(); +// boolean stepBack = true; boolean stepBack = stepBackAndFindPrevPointInRoute(gctx, gpxPoints, start, next); if (!stepBack) { // not supported case (workaround increase MAXIMUM_STEP_APPROXIMATION) @@ -268,6 +279,10 @@ public class RoutePlannerFrontEnd { } start = next; } + if(gctx.ctx.calculationProgress != null) { + gctx.ctx.calculationProgress.timeToCalculate = System.nanoTime() - timeToCalculate; + } + gctx.ctx.deleteNativeRoutingContext(); BinaryRoutePlanner.printDebugMemoryInformation(gctx.ctx); calculateGpxRoute(gctx, gpxPoints); if (!gctx.res.isEmpty()) { @@ -336,8 +351,8 @@ public class RoutePlannerFrontEnd { } if (gctx.distFromLastPoint(startPoint) > 1) { gctx.routeGapDistance += gctx.distFromLastPoint(startPoint); - System.out.println(String.format("????? gap of route point = %f, gap of actual gpxPoint = %f ", - gctx.distFromLastPoint(startPoint), gctx.distFromLastPoint(pnt.loc))); + System.out.println(String.format("????? gap of route point = %f, gap of actual gpxPoint = %f, %s ", + gctx.distFromLastPoint(startPoint), gctx.distFromLastPoint(pnt.loc), pnt.loc)); } gctx.res.addAll(pnt.routeToTarget); i = pnt.targetInd; @@ -518,9 +533,16 @@ public class RoutePlannerFrontEnd { // make first position precise makeSegmentPointPrecise(res.get(0), start.loc, true); } else { - assert res.get(0).getObject().getId() == start.pnt.getRoad().getId(); - // start point could shift to +-1 due to direction - res.get(0).setStartPointIndex(start.pnt.getSegmentStart()); + if(res.get(0).getObject().getId() == start.pnt.getRoad().getId()) { + // start point could shift to +-1 due to direction + res.get(0).setStartPointIndex(start.pnt.getSegmentStart()); + } else { + // for native routing this is possible when point lies on intersection of 2 lines + // solution here could be to pass to native routing id of the route + // though it should not create any issue + System.out.println("??? not found " + start.pnt.getRoad().getId() + " instead " + + res.get(0).getObject().getId()); + } } start.routeToTarget = res; start.targetInd = target.ind; @@ -580,7 +602,7 @@ public class RoutePlannerFrontEnd { public List searchRoute(final RoutingContext ctx, LatLon start, LatLon end, List intermediates, PrecalculatedRouteDirection routeDirection) throws IOException, InterruptedException { - ctx.timeToCalculate = System.nanoTime(); + long timeToCalculate = System.nanoTime(); if (ctx.calculationProgress == null) { ctx.calculationProgress = new RouteCalculationProgress(); } @@ -612,6 +634,7 @@ public class RoutePlannerFrontEnd { } routeDirection = PrecalculatedRouteDirection.build(ls, ctx.config.DEVIATION_RADIUS, ctx.getRouter().getMaxSpeed()); } + List res ; if (intermediatesEmpty && ctx.nativeLib != null) { ctx.startX = MapUtils.get31TileNumberX(start.getLongitude()); ctx.startY = MapUtils.get31TileNumberY(start.getLatitude()); @@ -625,31 +648,32 @@ public class RoutePlannerFrontEnd { ctx.precalculatedRouteDirection = routeDirection.adopt(ctx); } ctx.calculationProgress.nextIteration(); - List res = runNativeRouting(ctx, recalculationEnd); - if (res != null) { - new RouteResultPreparation().printResults(ctx, start, end, res); - } + res = runNativeRouting(ctx, recalculationEnd); makeStartEndPointsPrecise(res, start, end, intermediates); - return res; - } - int indexNotFound = 0; - List points = new ArrayList(); - if (!addSegment(start, ctx, indexNotFound++, points, ctx.startTransportStop)) { - return null; - } - if (intermediates != null) { - for (LatLon l : intermediates) { - if (!addSegment(l, ctx, indexNotFound++, points, false)) { - System.out.println(points.get(points.size() - 1).getRoad().toString()); - return null; + } else { + int indexNotFound = 0; + List points = new ArrayList(); + if (!addSegment(start, ctx, indexNotFound++, points, ctx.startTransportStop)) { + return null; + } + if (intermediates != null) { + for (LatLon l : intermediates) { + if (!addSegment(l, ctx, indexNotFound++, points, false)) { + System.out.println(points.get(points.size() - 1).getRoad().toString()); + return null; + } } } + if (!addSegment(end, ctx, indexNotFound++, points, ctx.targetTransportStop)) { + return null; + } + ctx.calculationProgress.nextIteration(); + res = searchRouteImpl(ctx, points, routeDirection); } - if (!addSegment(end, ctx, indexNotFound++, points, ctx.targetTransportStop)) { - return null; + if (ctx.calculationProgress != null) { + ctx.calculationProgress.timeToCalculate += (System.nanoTime() - timeToCalculate); } - ctx.calculationProgress.nextIteration(); - List res = searchRouteImpl(ctx, points, routeDirection); + BinaryRoutePlanner.printDebugMemoryInformation(ctx); if (res != null) { new RouteResultPreparation().printResults(ctx, start, end, res); } @@ -764,8 +788,12 @@ public class RoutePlannerFrontEnd { if (ctx.nativeLib != null) { ctx.startX = start.preciseX; ctx.startY = start.preciseY; + ctx.startRoadId = start.road.id; + ctx.startSegmentInd = start.segStart; ctx.targetX = end.preciseX; ctx.targetY = end.preciseY; + ctx.targetRoadId = end.road.id; + ctx.targetSegmentInd = end.segStart; return runNativeRouting(ctx, recalculationEnd); } else { refreshProgressDistance(ctx); @@ -829,11 +857,9 @@ public class RoutePlannerFrontEnd { ctx.checkOldRoutingFiles(ctx.startX, ctx.startY); ctx.checkOldRoutingFiles(ctx.targetX, ctx.targetY); - long time = System.currentTimeMillis(); - RouteSegmentResult[] res = ctx.nativeLib.runNativeRouting(ctx.startX, ctx.startY, ctx.targetX, ctx.targetY, - ctx.config, regions, ctx.calculationProgress, ctx.precalculatedRouteDirection, ctx.calculationMode == RouteCalculationMode.BASE, - ctx.publicTransport, ctx.startTransportStop, ctx.targetTransportStop); - log.info("Native routing took " + (System.currentTimeMillis() - time) / 1000f + " seconds"); + // long time = System.currentTimeMillis(); + RouteSegmentResult[] res = ctx.nativeLib.runNativeRouting(ctx, regions, ctx.calculationMode == RouteCalculationMode.BASE); + // log.info("Native routing took " + (System.currentTimeMillis() - time) / 1000f + " seconds"); ArrayList result = new ArrayList(Arrays.asList(res)); if (recalculationEnd != null) { log.info("Native routing use precalculated route"); @@ -844,9 +870,7 @@ public class RoutePlannerFrontEnd { current = pr; } } - ctx.routingTime = ctx.calculationProgress.routingCalculatedTime; - ctx.visitedSegments = ctx.calculationProgress.visitedSegments; - ctx.loadedTiles = ctx.calculationProgress.loadedTiles; + ctx.routingTime += ctx.calculationProgress.routingCalculatedTime; return new RouteResultPreparation().prepareResult(ctx, result, recalculationEnd != null); } @@ -860,7 +884,6 @@ public class RoutePlannerFrontEnd { } pringGC(ctx, true); List res = searchRouteInternalPrepare(ctx, points.get(0), points.get(1), routeDirection); - BinaryRoutePlanner.printDebugMemoryInformation(ctx); pringGC(ctx, false); makeStartEndPointsPrecise(res, points.get(0).getPreciseLatLon(), points.get(1).getPreciseLatLon(), null); return res; @@ -907,16 +930,7 @@ public class RoutePlannerFrontEnd { List res = searchRouteInternalPrepare(local, points.get(i), points.get(i + 1), routeDirection); makeStartEndPointsPrecise(res, points.get(i).getPreciseLatLon(), points.get(i + 1).getPreciseLatLon(), null); results.addAll(res); - ctx.distinctLoadedTiles += local.distinctLoadedTiles; - ctx.loadedTiles += local.loadedTiles; - ctx.visitedSegments += local.visitedSegments; - ctx.loadedPrevUnloadedTiles += local.loadedPrevUnloadedTiles; - ctx.timeToCalculate += local.timeToCalculate; - ctx.timeToLoad += local.timeToLoad; - ctx.timeToLoadHeaders += local.timeToLoadHeaders; - ctx.relaxedSegments += local.relaxedSegments; ctx.routingTime += local.routingTime; - // local.unloadAllData(ctx); if (restPartRecalculatedRoute != null) { results.addAll(restPartRecalculatedRoute); diff --git a/OsmAnd-java/src/main/java/net/osmand/router/RouteResultPreparation.java b/OsmAnd-java/src/main/java/net/osmand/router/RouteResultPreparation.java index b0c32de648..d7ebbaba8f 100644 --- a/OsmAnd-java/src/main/java/net/osmand/router/RouteResultPreparation.java +++ b/OsmAnd-java/src/main/java/net/osmand/router/RouteResultPreparation.java @@ -394,8 +394,8 @@ public class RouteResultPreparation { private List convertFinalSegmentToResults(RoutingContext ctx, FinalRouteSegment finalSegment) { List result = new ArrayList(); if (finalSegment != null) { - ctx.routingTime = finalSegment.distanceFromStart; - println("Routing calculated time distance " + finalSegment.distanceFromStart); + ctx.routingTime += finalSegment.distanceFromStart; + // println("Routing calculated time distance " + finalSegment.distanceFromStart); // Get results from opposite direction roads RouteSegment segment = finalSegment.reverseWaySearch ? finalSegment : finalSegment.opposite.getParentRoute(); @@ -496,8 +496,9 @@ public class RouteResultPreparation { String msg = String.format("", - ctx.config.routerName, startLat, startLon, endLat, endLon, ctx.routingTime, ctx.loadedTiles, - ctx.visitedSegments, completeDistance, completeTime); + ctx.config.routerName, startLat, startLon, endLat, endLon, ctx.routingTime, + ctx.getLoadedTiles(), + ctx.getVisitedSegments(), completeDistance, completeTime); // String msg = MessageFormat.format("", // startLat + "", startLon + "", endLat + "", endLon + "", ctx.config.routerName, diff --git a/OsmAnd-java/src/main/java/net/osmand/router/RoutingContext.java b/OsmAnd-java/src/main/java/net/osmand/router/RoutingContext.java index e3c233b4d4..922e225855 100644 --- a/OsmAnd-java/src/main/java/net/osmand/router/RoutingContext.java +++ b/OsmAnd-java/src/main/java/net/osmand/router/RoutingContext.java @@ -40,8 +40,6 @@ public class RoutingContext { private final static Log log = PlatformUtil.getLog(RoutingContext.class); - - // Final context variables public final RoutingConfiguration config; @@ -50,23 +48,31 @@ public class RoutingContext { public final Map> map = new LinkedHashMap>(); public final Map reverseMap = new LinkedHashMap(); + // 0. Reference to native routingcontext for multiple routes + public long nativeRoutingContext; + public boolean keepNativeRoutingContext; + // 1. Initial variables public int startX; public int startY; + public long startRoadId; + public int startSegmentInd; public boolean startTransportStop; public int targetX; public int targetY; + public long targetRoadId; + public int targetSegmentInd; public boolean targetTransportStop; + public boolean publicTransport; - // deprecated - public long firstRoadId; - public int firstRoadDirection; + public RouteCalculationProgress calculationProgress; public boolean leftSideNavigation; public List previouslyCalculatedRoute; public PrecalculatedRouteDirection precalculatedRouteDirection; + // 2. Routing memory cache (big objects) TLongObjectHashMap> indexedSubregions = new TLongObjectHashMap>(); @@ -82,26 +88,8 @@ public class RoutingContext { public TileStatistics global = new TileStatistics(); // updated by route planner in bytes public int memoryOverhead = 0; - - - long timeNanoToCalcDeviation = 0; - long timeToLoad = 0; - long timeToLoadHeaders = 0; - long timeToFindInitialSegments = 0; - public long timeToCalculate = 0; - - int distinctLoadedTiles = 0; - int maxLoadedTiles = 0; - int loadedPrevUnloadedTiles = 0; - int unloadedTiles = 0; public float routingTime = 0; - public int loadedTiles = 0; - public int visitedSegments = 0; - public int relaxedSegments = 0; - public int visitedDirectSegments = 0; - public int visitedOppositeSegments = 0; - public int directQueueSize = 0; - public int oppositeQueueSize = 0; + // callback of processing segments RouteSegmentVisitor visitor = null; @@ -207,12 +195,16 @@ public class RoutingContext { public void initStartAndTargetPoints(RouteSegment start, RouteSegment end) { initTargetPoint(end); startX = start.road.getPoint31XTile(start.getSegmentStart()); - startY = start.road.getPoint31YTile(start.getSegmentStart()); + startY = start.road.getPoint31YTile(start.getSegmentStart()); + startRoadId = start.road.getId(); + startSegmentInd = start.getSegmentStart(); } public void initTargetPoint(RouteSegment end) { targetX = end.road.getPoint31XTile(end.getSegmentStart()); targetY = end.road.getPoint31YTile(end.getSegmentStart()); + targetRoadId = end.road.getId(); + targetSegmentInd = end.getSegmentStart(); } public void unloadAllData() { @@ -224,7 +216,9 @@ public class RoutingContext { if (tl.isLoaded()) { if(except == null || except.searchSubregionTile(tl.subregion) < 0){ tl.unload(); - unloadedTiles ++; + if(calculationProgress != null) { + calculationProgress.unloadedTiles ++; + } global.size -= tl.tileStatistics.size; } } @@ -308,27 +302,37 @@ public class RoutingContext { } catch (IOException e) { throw new RuntimeException("Loading data exception", e); } - - timeToLoad += (System.nanoTime() - now); + if (calculationProgress != null) { + calculationProgress.timeToLoad += (System.nanoTime() - now); + } } else { long now = System.nanoTime(); NativeRouteSearchResult ns = nativeLib.loadRouteRegion(ts.subregion, loadObjectsInMemory); // System.out.println(ts.subregion.shiftToData + " " + Arrays.toString(ns.objects)); ts.setLoadedNative(ns, this); - timeToLoad += (System.nanoTime() - now); + if (calculationProgress != null) { + calculationProgress.timeToLoad += (System.nanoTime() - now); + } } - loadedTiles++; + if (calculationProgress != null) { + calculationProgress.loadedTiles++; + } + if (wasUnloaded) { if(ucount == 1) { - loadedPrevUnloadedTiles++; + if(calculationProgress != null) { + calculationProgress.loadedPrevUnloadedTiles++; + } } } else { if(global != null) { global.allRoutes += ts.tileStatistics.allRoutes; global.coordinates += ts.tileStatistics.coordinates; } - distinctLoadedTiles++; + if (calculationProgress != null) { + calculationProgress.distinctLoadedTiles++; + } } global.size += ts.tileStatistics.size; } @@ -402,7 +406,9 @@ public class RoutingContext { } collection.add(found); } - timeToLoadHeaders += (System.nanoTime() - now); + if (calculationProgress != null) { + calculationProgress.timeToLoadHeaders += (System.nanoTime() - now); + } } } catch (IOException e) { throw new RuntimeException("Loading data exception", e); @@ -412,6 +418,10 @@ public class RoutingContext { } public void loadTileData(int x31, int y31, int zoomAround, final List toFillIn) { + loadTileData(x31, y31, zoomAround, toFillIn, false); + } + + public void loadTileData(int x31, int y31, int zoomAround, final List toFillIn, boolean allowDuplications) { int t = config.ZOOM_TO_LOAD_TILES - zoomAround; int coordinatesShift = (1 << (31 - config.ZOOM_TO_LOAD_TILES)); if(t <= 0) { @@ -422,7 +432,6 @@ public class RoutingContext { } TLongHashSet ts = new TLongHashSet(); - long now = System.nanoTime(); for(int i = -t; i <= t; i++) { for(int j = -t; j <= t; j++) { ts.add(getRoutingTile(x31 +i*coordinatesShift, y31 + j*coordinatesShift, 0)); @@ -432,8 +441,10 @@ public class RoutingContext { TLongObjectHashMap excludeDuplications = new TLongObjectHashMap(); while (it.hasNext()) { getAllObjects(it.next(), toFillIn, excludeDuplications); + if (allowDuplications) { + excludeDuplications.clear(); + } } - timeToFindInitialSegments += (System.nanoTime() - now); } @SuppressWarnings("unused") @@ -516,7 +527,9 @@ public class RoutingContext { loaded++; } } - maxLoadedTiles = Math.max(maxLoadedTiles, getCurrentlyLoadedTiles()); + if(calculationProgress != null) { + calculationProgress.maxLoadedTiles = Math.max(calculationProgress.maxLoadedTiles, getCurrentlyLoadedTiles()); + } Collections.sort(list, new Comparator() { private int pow(int base, int pw) { int r = 1; @@ -538,7 +551,9 @@ public class RoutingContext { i++; // System.out.println("Unload " + unload); unload.unload(); - unloadedTiles ++; + if(calculationProgress != null) { + calculationProgress.unloadedTiles ++; + } global.size -= unload.tileStatistics.size; // tile could be cleaned from routing tiles and deleted from whole list @@ -789,7 +804,31 @@ public class RoutingContext { return map.keySet().toArray(new BinaryMapIndexReader[map.size()]); } - + public int getVisitedSegments() { + if(calculationProgress != null) { + return calculationProgress.visitedSegments; + } + return 0; + } + public int getLoadedTiles() { + if (calculationProgress != null) { + return calculationProgress.loadedTiles; + } + return 0; + } + + public synchronized void deleteNativeRoutingContext() { + if (nativeRoutingContext != 0) { + NativeLibrary.deleteNativeRoutingContext(nativeRoutingContext); + } + nativeRoutingContext = 0; + } + + @Override + protected void finalize() throws Throwable { + deleteNativeRoutingContext(); + super.finalize(); + } } diff --git a/OsmAnd-java/src/main/java/net/osmand/router/TestRouting.java b/OsmAnd-java/src/main/java/net/osmand/router/TestRouting.java index 78222819d9..95e2e0d15c 100644 --- a/OsmAnd-java/src/main/java/net/osmand/router/TestRouting.java +++ b/OsmAnd-java/src/main/java/net/osmand/router/TestRouting.java @@ -236,13 +236,13 @@ public class TestRouting { throw new IllegalArgumentException(MessageFormat.format("Complete routing time (expected) {0} != {1} (original) : {2}", routing_time, calcRoutingTime, testDescription)); } - if (visitedSegments > 0 && !isInOrLess(visitedSegments, ctx.visitedSegments, percent)) { + if (visitedSegments > 0 && !isInOrLess(visitedSegments, ctx.getVisitedSegments(), percent)) { throw new IllegalArgumentException(MessageFormat.format("Visited segments (expected) {0} != {1} (original) : {2}", visitedSegments, - ctx.visitedSegments, testDescription)); + ctx.getVisitedSegments(), testDescription)); } - if (loadedTiles > 0 && !isInOrLess(loadedTiles, ctx.loadedTiles, percent)) { + if (loadedTiles > 0 && !isInOrLess(loadedTiles, ctx.getLoadedTiles(), percent)) { throw new IllegalArgumentException(MessageFormat.format("Loaded tiles (expected) {0} != {1} (original) : {2}", loadedTiles, - ctx.loadedTiles, testDescription)); + ctx.getLoadedTiles(), testDescription)); } if(TEST_BOTH_DIRECTION){ diff --git a/OsmAnd-telegram/res/values-fr/strings.xml b/OsmAnd-telegram/res/values-fr/strings.xml index e010baf46b..9ebff1a4d8 100644 --- a/OsmAnd-telegram/res/values-fr/strings.xml +++ b/OsmAnd-telegram/res/values-fr/strings.xml @@ -248,4 +248,20 @@ Partager la position Afficher sur la carte Vous avez besoin d\'un compte Telegram enregistré et d\'un numéro de téléphone + OsmAnd Online GPS Tracker + Sélectionnez l’un des services de localisation pour partager votre position. + OsmAnd Tracker vous permet de partager votre position et voir celle des autres dans OsmAnd.

Cette application utilise l\'API de Telegram, et donc vous avez besoin d\'un compte Telegram.
+ Vous avez besoin d\'installer la version gratuite ou payante d\'OsmAnd d\'abord + OsmAnd Tracker s\'exécute en arrière-plan, écran éteint. + Merci d\'activer la géolocalisation dans les paramètres du système + Numéro de téléphone au format international + Numéro de téléphone + Recherche : groupe ou contact + Sélectionner les contacts et les groupes avec lesquels vous souhaitez partager votre position. + Définir l\'heure + Heure visible par tous + Rendre l\'heure visible par tous + Définir l\'intervalle minimum pour partager sa position. + La dernière fois qu\'un contact s\'est déplacé. + Cacher les contacts qui ne se sont pas déplacés depuis un temps donné. \ No newline at end of file diff --git a/OsmAnd/AndroidManifest.xml b/OsmAnd/AndroidManifest.xml index 5a0082b792..e1508f6ba2 100644 --- a/OsmAnd/AndroidManifest.xml +++ b/OsmAnd/AndroidManifest.xml @@ -955,6 +955,7 @@ android:process="net.osmand.plus" android:label="@string/process_navigation_service" android:name="net.osmand.plus.NavigationService" + android:foregroundServiceType="location" android:stopWithTask="false"> diff --git a/OsmAnd/build.gradle b/OsmAnd/build.gradle index 79c1027c84..714b85eae8 100644 --- a/OsmAnd/build.gradle +++ b/OsmAnd/build.gradle @@ -22,8 +22,8 @@ task printc { } android { - compileSdkVersion 28 - buildToolsVersion "28.0.3" + compileSdkVersion 29 + buildToolsVersion "29.0.3" // compileNdkVersion "android-ndk-r17b" signingConfigs { diff --git a/OsmAnd/res/drawable/ic_action_enduro_motorcycle.xml b/OsmAnd/res/drawable/ic_action_enduro_motorcycle.xml new file mode 100644 index 0000000000..ce8f40ad06 --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_enduro_motorcycle.xml @@ -0,0 +1,10 @@ + + + diff --git a/OsmAnd/res/drawable/ic_action_go_cart.xml b/OsmAnd/res/drawable/ic_action_go_cart.xml new file mode 100644 index 0000000000..3b3f321cea --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_go_cart.xml @@ -0,0 +1,10 @@ + + + diff --git a/OsmAnd/res/drawable/ic_action_inline_skates.xml b/OsmAnd/res/drawable/ic_action_inline_skates.xml index b86fe84c27..1d597ad389 100644 --- a/OsmAnd/res/drawable/ic_action_inline_skates.xml +++ b/OsmAnd/res/drawable/ic_action_inline_skates.xml @@ -4,7 +4,12 @@ android:viewportWidth="24" android:viewportHeight="24"> + diff --git a/OsmAnd/res/drawable/ic_action_motor_scooter.xml b/OsmAnd/res/drawable/ic_action_motor_scooter.xml new file mode 100644 index 0000000000..a8a0cf4551 --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_motor_scooter.xml @@ -0,0 +1,21 @@ + + + + + diff --git a/OsmAnd/res/drawable/ic_action_motorcycle_dark.xml b/OsmAnd/res/drawable/ic_action_motorcycle_dark.xml index 2bf23aff89..a89713cff8 100644 --- a/OsmAnd/res/drawable/ic_action_motorcycle_dark.xml +++ b/OsmAnd/res/drawable/ic_action_motorcycle_dark.xml @@ -4,7 +4,7 @@ android:viewportWidth="24" android:viewportHeight="24"> diff --git a/OsmAnd/res/drawable/ic_action_wheelchair.xml b/OsmAnd/res/drawable/ic_action_wheelchair.xml new file mode 100644 index 0000000000..de21179bb8 --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_wheelchair.xml @@ -0,0 +1,12 @@ + + + + diff --git a/OsmAnd/res/drawable/ic_action_wheelchair_forward.xml b/OsmAnd/res/drawable/ic_action_wheelchair_forward.xml new file mode 100644 index 0000000000..96bf7169a8 --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_wheelchair_forward.xml @@ -0,0 +1,12 @@ + + + + diff --git a/OsmAnd/res/values-ar/strings.xml b/OsmAnd/res/values-ar/strings.xml index 93c9629d1c..21346619a7 100644 --- a/OsmAnd/res/values-ar/strings.xml +++ b/OsmAnd/res/values-ar/strings.xml @@ -1842,7 +1842,6 @@ عند الإيقاف ستبدأ واجهة الخريطة مباشرة. OSM POI معدل ملاحظة OSM معلق عليها - ملاحظة OSM محذوفة مسار زلق لإظهار خرائط التزلج، يجب تحميل خريطة خاصة محلية. حافلة، ترامواي وغيرها @@ -3170,7 +3169,7 @@ خريطة أثناء التنقل أخرى الوزن ، الارتفاع ، السرعة - معلمات السيارة + معلمات المركبات الإعلامات الصوتية تحدث فقط أثناء التنقل. إرشادات التنقل والإعلامات المطالبات الصوتية @@ -3212,7 +3211,7 @@ السرعة الافتراضية تغيير إعدادات السرعة الافتراضية تعيين حد السرعة الأدنى/الأعلى - وضع جديد + ملف تعريف جديد خروج مفاجئ فشل العملية الأخيرة لأوسماند. الرجاء مساعدتنا في التحسين من خلال مشاركة رسالة الخطأ. • أوضاع التطبيق: قم بإنشاء وضع مخصص لاحتياجاتك الخاصة ، باستخدام رمز ولون مخصصين @@ -3805,4 +3804,10 @@ سيتم حذف نقطة الوجهة الحالية على المسار. إذا كانت هي الوجهة، سوف تتوقف الملاحة. تنزيل بيانات ويكيبيديا الحصول على معلومات حول النقاط المثيرة للاهتمام من ويكيبيديا. إنه دليلك غير المتصل بجيبك - ما عليك سوى تمكين المكون الإضافي ويكبيديا والاستمتاع بمقالات حول الكائنات من حولك. + دراجة نارية + سكوتر موتور + منحدرات للأمام + منحدرات + عربة التسوق + أغلق ملاحظة OSM \ No newline at end of file diff --git a/OsmAnd/res/values-az/strings.xml b/OsmAnd/res/values-az/strings.xml index 56c525fa8f..e162549076 100644 --- a/OsmAnd/res/values-az/strings.xml +++ b/OsmAnd/res/values-az/strings.xml @@ -1578,7 +1578,6 @@ Silinmiş OSM POI Yenidən açılmış OSM qeydi Rəy yazılmış OSM qeydi - Silinmiş OSM qeydi Yaradılmış OSM qeydi Təsdiq et Yaradılmış OSM POI diff --git a/OsmAnd/res/values-b+be+Latn/strings.xml b/OsmAnd/res/values-b+be+Latn/strings.xml index a5a49915b4..68f3cc2d12 100644 --- a/OsmAnd/res/values-b+be+Latn/strings.xml +++ b/OsmAnd/res/values-b+be+Latn/strings.xml @@ -1571,7 +1571,6 @@ Praparcyjnaj pamiacі %4$s MB (Abmiežavańnie Android %5$s MB, Dalvik %6$s MB). Dadać natatku OSM Natatka OSM adkryta znoŭ Da natatkі OSM dadadzieny kamentar - Natatka OSM vydalenaja Natatka OSM stvorana Natatka OSM Stvaryć natatku diff --git a/OsmAnd/res/values-b+hsb/strings.xml b/OsmAnd/res/values-b+hsb/strings.xml index e76a7e56cb..f6eee351c8 100644 --- a/OsmAnd/res/values-b+hsb/strings.xml +++ b/OsmAnd/res/values-b+hsb/strings.xml @@ -73,7 +73,6 @@ Změnjene OSM POI-dypki Wotstronjene OSM POI-dypki Komentowana OSM-notica - Wotstronjena OSM-notica OSM-notica Komentar přidać Noticu začinić diff --git a/OsmAnd/res/values-be/strings.xml b/OsmAnd/res/values-be/strings.xml index dde803e8d7..f02b3d7626 100644 --- a/OsmAnd/res/values-be/strings.xml +++ b/OsmAnd/res/values-be/strings.xml @@ -1808,7 +1808,6 @@ Дадаць нататку OSM Нататка OSM адкрытая зноў Да нататкі OSM дададзены каментар - Нататка OSM выдаленая Нататка OSM створаная Нататка OSM Стварыць нататку diff --git a/OsmAnd/res/values-bg/strings.xml b/OsmAnd/res/values-bg/strings.xml index 907fafd625..1238c5a8b9 100644 --- a/OsmAnd/res/values-bg/strings.xml +++ b/OsmAnd/res/values-bg/strings.xml @@ -1568,7 +1568,6 @@ \"Изкл.\" стартира директно картата. Отворена отново бележка на OSM Бележка на OSM с коментар - Изтрита бележка на OSM Създадена бележка на OSM Бележка на OSM Създайте Бележка diff --git a/OsmAnd/res/values-ca/strings.xml b/OsmAnd/res/values-ca/strings.xml index 3c4e7ee70f..27ec7ebddc 100644 --- a/OsmAnd/res/values-ca/strings.xml +++ b/OsmAnd/res/values-ca/strings.xml @@ -1787,7 +1787,6 @@ Per retornar a l\'estil habitual dels mapes d\'OsmAnd, només cal desactivar aqu Obre una nota d\'OSM S\'ha reobert nota d\'OSM S\'ha comentat nota d\'OSM - S\'ha eliminat nota d\'OSM S\'ha creat nota d\'OSM Nota d\'OSM Crea nota diff --git a/OsmAnd/res/values-cs/strings.xml b/OsmAnd/res/values-cs/strings.xml index 5efebf14f4..f8f7d4196d 100644 --- a/OsmAnd/res/values-cs/strings.xml +++ b/OsmAnd/res/values-cs/strings.xml @@ -1755,7 +1755,6 @@ Délka %2$s Otevřít OSM poznámku Znovuotevřená OSM poznámka Komentovaná OSM poznámka - Smazaná OSM poznámka Vytvořená OSM poznámka OSM poznámka Vytvořit poznámku diff --git a/OsmAnd/res/values-da/strings.xml b/OsmAnd/res/values-da/strings.xml index 4b878e8432..0e4bf01dbe 100644 --- a/OsmAnd/res/values-da/strings.xml +++ b/OsmAnd/res/values-da/strings.xml @@ -1778,7 +1778,6 @@ Åbn OSM-note Genåbnet OSM-note Kommenteret OSM-note - Slettet OSM-note Oprettet OSM-note OSM-note Opret note diff --git a/OsmAnd/res/values-de/phrases.xml b/OsmAnd/res/values-de/phrases.xml index 16dc17d12e..e2ca883769 100644 --- a/OsmAnd/res/values-de/phrases.xml +++ b/OsmAnd/res/values-de/phrases.xml @@ -2766,7 +2766,7 @@ Toilettenspülung: Plumpsklo Wikipedia Gewürzgeschäft - Kraftstoffart + Kraftstoffsorte Zahlungsart Zusätzlich Ladestation: ja @@ -3603,7 +3603,7 @@ Anzahl der Wickeltische Wickeltischgebühr: ja Wickeltischgebühr: nein - Holzkohlestoß + Kohlenmeiler Historischer Panzer Wasserpfeifen-Lounge Energiequelle: Biomasse diff --git a/OsmAnd/res/values-de/strings.xml b/OsmAnd/res/values-de/strings.xml index 752c1b528a..80666c5ffd 100644 --- a/OsmAnd/res/values-de/strings.xml +++ b/OsmAnd/res/values-de/strings.xml @@ -1765,7 +1765,6 @@ OSM-Notiz erstellen Wiedereröffnete OSM-Notiz Kommentierte OSM-Notiz - Gelöschte OSM-Notiz Erstellte OSM-Notiz OSM-Notiz Notiz erstellen @@ -3822,4 +3821,10 @@ Der aktuelle Punkt auf der Route wird gelöscht. Wenn es das Ziel ist, wird die Navigation gestoppt. Wikipedia-Karten herunterladen Informationen über Sehenswürdigkeiten erhalten Sie bei Wikipedia. Es ist Ihr Offline-Wegweiser für die Hosentasche - aktivieren Sie einfach das Wikipedia-Modul und genießen Sie Artikel über Objekte in Ihrer Umgebung. + Enduro + Motorroller + Rollstuhl + Go-Kart + Geschlossene OSM-Notiz + Rollstuhl vorwärts \ No newline at end of file diff --git a/OsmAnd/res/values-el/strings.xml b/OsmAnd/res/values-el/strings.xml index f18342af5d..df52e8653d 100644 --- a/OsmAnd/res/values-el/strings.xml +++ b/OsmAnd/res/values-el/strings.xml @@ -2190,7 +2190,6 @@ Άνοιγμα σημείωσης OSM Ξανανοιγμένη σημείωση OSM Σχολιασμένη Σημείωση OSM - Διαγράφηκε σημείωση OSM Δημιουργήθηκε σημείωση OSM Σημείωση OSM Δημιουργία σημείωσης diff --git a/OsmAnd/res/values-eo/strings.xml b/OsmAnd/res/values-eo/strings.xml index 6d14a73ec3..47ab66dfe5 100644 --- a/OsmAnd/res/values-eo/strings.xml +++ b/OsmAnd/res/values-eo/strings.xml @@ -123,7 +123,6 @@ Krei OSM-rimarkon Remalfermis OSM-rimarkon Komentis OSM-rimarkon - Forigis OSM-rimarkon Kreita OSM-rimarko OSM-rimarko Krei rimarkon @@ -3815,4 +3814,10 @@ La markita celo de la kurso estos forigita. Se tio ĉi estos la fina celo, la navigado ĉesos. Elŝuti vikipediajn mapojn Akiru informojn pri interesaj punktoj el Vikipedio. Gvidilo en via poŝo – aktivigu la kromprogramon Vikipedio por ricevi artikolojn pri proksimaj objektoj. + Motorciklo (enduro) + Motorciklo (skotero) + Rulseĝo + Rulseĝo (klinita) + Gokarto + Fermita OSM‑rimarko \ No newline at end of file diff --git a/OsmAnd/res/values-es-rAR/phrases.xml b/OsmAnd/res/values-es-rAR/phrases.xml index 9e596b6667..5e9d8b5c82 100644 --- a/OsmAnd/res/values-es-rAR/phrases.xml +++ b/OsmAnd/res/values-es-rAR/phrases.xml @@ -1852,7 +1852,7 @@ Monumento técnico Templo piramidal Oficina del campamento - Aeródromo a escala + Pista de aeromodelismo Oficina del guía ONG casi autónoma Oficina de consultoría diff --git a/OsmAnd/res/values-es-rAR/strings.xml b/OsmAnd/res/values-es-rAR/strings.xml index 5de3ca867e..afdc93674d 100644 --- a/OsmAnd/res/values-es-rAR/strings.xml +++ b/OsmAnd/res/values-es-rAR/strings.xml @@ -1772,7 +1772,6 @@ Abrir nota de OSM Nota de OSM reabierta Nota de OSM comentada - Nota de OSM resuelta Nota de OSM creada Nota de OSM Crear nota @@ -3820,4 +3819,9 @@ El punto de destino actual de la ruta será borrado. Si será el destino, la navegación se detendrá. Descargar datos de Wikipedia Obtén información sobre los puntos de interés de Wikipedia. Es tu guía de bolsillo sin conexión - sólo activa el complemento de Wikipedia y disfruta los artículos sobre los objetos de alrededor. + Motocicleta de enduro + Motoneta (motor) + Silla de ruedas + Go-kart + Nota de OSM cerrada \ No newline at end of file diff --git a/OsmAnd/res/values-es-rUS/phrases.xml b/OsmAnd/res/values-es-rUS/phrases.xml index ceb20a440f..7f0a081326 100644 --- a/OsmAnd/res/values-es-rUS/phrases.xml +++ b/OsmAnd/res/values-es-rUS/phrases.xml @@ -1852,7 +1852,7 @@ Monumento técnico Templo piramidal Oficina del campamento - Aeródromo a escala + Pista de aeromodelismo Oficina del guía ONG casi autónoma Oficina de consultoría @@ -3837,4 +3837,6 @@ Flecha Vibración Caja de regalo + Manzana (cuadra) + Municipio \ No newline at end of file diff --git a/OsmAnd/res/values-es-rUS/strings.xml b/OsmAnd/res/values-es-rUS/strings.xml index 504a7a63d2..0f3ef1ff1b 100644 --- a/OsmAnd/res/values-es-rUS/strings.xml +++ b/OsmAnd/res/values-es-rUS/strings.xml @@ -1772,7 +1772,6 @@ Abrir nota de OSM Nota de OSM reabierta Nota de OSM comentada - Nota de OSM resuelta Nota de OSM creada Nota de OSM Crear nota @@ -3803,7 +3802,7 @@ Un botón que alterna la capa de Mapillary en el mapa. Rumbo %1$s borrado - Debes reiniciar para borrar completamente los datos de los radares de velocidad. + Se debe reiniciar para borrar completamente los datos de los radares de velocidad. Desinstalar y reiniciar Indica la longitud permitida del vehículo en rutas. Límite de longitud @@ -3811,4 +3810,12 @@ Patines en línea Permite controlar el nivel de zoom del mapa con los botones de volumen del dispositivo. Botones de volumen como zoom + Descargar datos de Wikipedia + El punto de destino actual de la ruta será borrado. Si será el destino, la navegación se detendrá. + Borrar el siguiente punto de destino + Obtén información sobre los puntos de interés de Wikipedia. Es tu guía de bolsillo sin conexión - sólo activa el complemento de Wikipedia y disfruta los artículos sobre los objetos de alrededor. + Proporciona un nombre para el punto + Proporciona la longitud del vehículo, se pueden aplicar algunas restricciones de rutas para vehículos largos. + Motoneta (motor) + Motocicleta de enduro \ No newline at end of file diff --git a/OsmAnd/res/values-es/strings.xml b/OsmAnd/res/values-es/strings.xml index a0baae1d76..126e6956fa 100644 --- a/OsmAnd/res/values-es/strings.xml +++ b/OsmAnd/res/values-es/strings.xml @@ -1771,7 +1771,6 @@ Abrir nota de OSM Nota de OSM reabierta Nota de OSM comentada - Nota de OSM resuelta Nota de OSM creada Nota de OSM Crear nota diff --git a/OsmAnd/res/values-et/strings.xml b/OsmAnd/res/values-et/strings.xml index 83b9a9ec24..8b422cc796 100644 --- a/OsmAnd/res/values-et/strings.xml +++ b/OsmAnd/res/values-et/strings.xml @@ -2254,7 +2254,6 @@ Ava OSM märge Uuesti avatud OSM märge Kommenteeritud OSM märge - Kustutatud OSM märge Loodud OSM märge OSM märge Loo märge diff --git a/OsmAnd/res/values-eu/strings.xml b/OsmAnd/res/values-eu/strings.xml index 6c92616fcb..7bb968baf9 100644 --- a/OsmAnd/res/values-eu/strings.xml +++ b/OsmAnd/res/values-eu/strings.xml @@ -1374,7 +1374,6 @@ Lorratza %2$s
Ireki OSM oharra OSM oharra berrireki da OSM oharrean iruzkina egin da - OSM oharra ezabatu da OSM oharra sortu da OSM oharra Sortu oharra diff --git a/OsmAnd/res/values-fa/strings.xml b/OsmAnd/res/values-fa/strings.xml index 061c2a10e9..44a95baf83 100644 --- a/OsmAnd/res/values-fa/strings.xml +++ b/OsmAnd/res/values-fa/strings.xml @@ -1963,7 +1963,6 @@ هنگام شروع نشانش بده کپی شد حذف POI - بستن یادداشت OSM یادداشت OSM‏ نوشتن یادداشت افزودن توضیح diff --git a/OsmAnd/res/values-fi/strings.xml b/OsmAnd/res/values-fi/strings.xml index 23bfa2ddf7..ecbbad329f 100644 --- a/OsmAnd/res/values-fi/strings.xml +++ b/OsmAnd/res/values-fi/strings.xml @@ -1078,7 +1078,6 @@ Maailmanlaajuiset tiedot (välillä 70 astetta pohjoista ja 70 astetta eteläist Avaa OSM Huomautus Uudelleen avattu OSM Huomautus Kommentoitu OSM Huomautus - Poistettu OSM Huomautus OSM Huomautus luotu OSM Huomautus Luo huomautus diff --git a/OsmAnd/res/values-fr/phrases.xml b/OsmAnd/res/values-fr/phrases.xml index b220d4eaf1..f26c9279aa 100644 --- a/OsmAnd/res/values-fr/phrases.xml +++ b/OsmAnd/res/values-fr/phrases.xml @@ -3600,7 +3600,7 @@ Nombre de tables à langer Table à langer payante Table à langer gratuite - Pile de charbon + Meule Bar à chicha Balkanique Point de vente diff --git a/OsmAnd/res/values-fr/strings.xml b/OsmAnd/res/values-fr/strings.xml index ca570fd8e3..805fa38ba4 100644 --- a/OsmAnd/res/values-fr/strings.xml +++ b/OsmAnd/res/values-fr/strings.xml @@ -1760,7 +1760,6 @@ Modifier l\'étape GPX Signaler une anomalie OSM Note OSM réouverte - Note OSM supprimée Note OSM créée Note OSM Créer une note @@ -3797,4 +3796,10 @@ Merci de renseigner un nom pour le point Utilisez un guide de poche hors ligne grâce à Wikipédia. Activez le plugin Wikipédia : des points d\'intérêt seront affichés, ils vous permettrons d\'obtenir des informations sur les lieux qui vous entourent. Télécharger les cartes Wikipédia + Scooter + Moto enduro + Kart + Note OSM fermée + Fauteuil roulant + Fauteuil roulant vers l\'avant \ No newline at end of file diff --git a/OsmAnd/res/values-gl/strings.xml b/OsmAnd/res/values-gl/strings.xml index d373b082d4..43bb801860 100644 --- a/OsmAnd/res/values-gl/strings.xml +++ b/OsmAnd/res/values-gl/strings.xml @@ -1763,7 +1763,6 @@ Lon %2$s
Abrir nota do OSM Reabriuse a nota de OSM Nota de OSM comentada - Nota de OSM eliminada Nota de OSM creada Nota de OSM Crear unha nota @@ -3842,4 +3841,10 @@ Lon %2$s O punto de destino actual na ruta será eliminado. Se fora o destino, a navegación sería interrompida. Baixar mapas da Wikipedia Obter información sobre os puntos de interesse da Wikipédia. É o teu guía de peto sen conexión - só activar o complemento da Wikipédia e desfrutar dos artigos sobre os elementos ó teu redor. + Enduro + Scooter + Cadeira de rodas + Cadeira de rodas só cara adiante + Kart + Nota do OSM pechada \ No newline at end of file diff --git a/OsmAnd/res/values-hu/strings.xml b/OsmAnd/res/values-hu/strings.xml index 678c4dda4d..0cf54ee018 100644 --- a/OsmAnd/res/values-hu/strings.xml +++ b/OsmAnd/res/values-hu/strings.xml @@ -1762,7 +1762,6 @@ OSM Jegyzet megnyitása Újranyitott OSM Jegyzet Kommentált OSM Jegyzet - Törölt OSM Jegyzet Létrehozott OSM Jegyzet OSM Jegyzet Jegyzet létrehozása @@ -3768,4 +3767,9 @@ \nAz előfizetéseit a Google Play beállításainál tudja kezelni és lemondani. Törli az útvonal soron következő célpontját. Amennyiben ez a végző célpont, a navigáció megáll. Szerezzen információt az érdekes helyekkel kapcsolatban a Wikipédiáról. Ez az ön offline zseb útikönyve - egyszerűen engedélyezze a Wikipédia bővítményt és élvezze az ön körül lévő objektumokról szóló cikkeket. + Salakmotor + Robogó + Kerekesszék + Gokart + Lezárt OSM-jegyzet \ No newline at end of file diff --git a/OsmAnd/res/values-hy/strings.xml b/OsmAnd/res/values-hy/strings.xml index e41d3c45ed..c8c71b8bb1 100644 --- a/OsmAnd/res/values-hy/strings.xml +++ b/OsmAnd/res/values-hy/strings.xml @@ -642,7 +642,6 @@ Ավելացնել OSM նշումը OSM նշումը կրկին բացված է OSM նշումին ավելացվել է մեկնաբանություն - OSM նշումը հեռացվեց OSM նշում ստեղծվել է OSM նշում Ստեղծել նշում diff --git a/OsmAnd/res/values-is/strings.xml b/OsmAnd/res/values-is/strings.xml index 05205af693..d5619f7a96 100644 --- a/OsmAnd/res/values-is/strings.xml +++ b/OsmAnd/res/values-is/strings.xml @@ -765,7 +765,6 @@ Veldu raddleiðsögn Opna OSM-minnispunkt Enduropnaði OSM-minnispunkt - Eyddi OSM-minnispunkti Bjó til OSM-minnispunkt OSM-minnispunktur Búa til minnispunkt diff --git a/OsmAnd/res/values-it/strings.xml b/OsmAnd/res/values-it/strings.xml index 84112aba40..e96e07e7b5 100644 --- a/OsmAnd/res/values-it/strings.xml +++ b/OsmAnd/res/values-it/strings.xml @@ -1766,7 +1766,6 @@ Apri una nota di OSM Nota di OSM riaperta Nota di OSM commentata - Nota di OSM eliminata Nota di OSM creata Nota di OSM Crea nota diff --git a/OsmAnd/res/values-he/phrases.xml b/OsmAnd/res/values-iw/phrases.xml similarity index 100% rename from OsmAnd/res/values-he/phrases.xml rename to OsmAnd/res/values-iw/phrases.xml diff --git a/OsmAnd/res/values-he/strings.xml b/OsmAnd/res/values-iw/strings.xml similarity index 99% rename from OsmAnd/res/values-he/strings.xml rename to OsmAnd/res/values-iw/strings.xml index 6a93ee035a..ba88963918 100644 --- a/OsmAnd/res/values-he/strings.xml +++ b/OsmAnd/res/values-iw/strings.xml @@ -2390,7 +2390,6 @@ \n כמה לפני המועד ברצונך להיוודע על הגעה ליעד? חוצץ זמן למעקב מקוון - הערת OSM נמחקה נוצרה הערת OSM הערת OSM יצירת הערה @@ -3823,4 +3822,10 @@ נקודת היעד הנוכחית במסלול תימחק. אם זה יהיה היעד, הניווט ייעצר. הורדת מפות ויקיפדיה קבלת מידע על נקודות עניין מוויקיפדיה. מדריך הכיס הפרטי שלך - עליך פשוט להפעיל את התוסף של ויקיפדיה וליהנות מערכים על מה שסביבך. + אופנוע שטח + טוסטוס + כסא גלגלים + כסא גלגלים ספורטיבי + קארטינג + הערת OSM סגורה \ No newline at end of file diff --git a/OsmAnd/res/values-ja/strings.xml b/OsmAnd/res/values-ja/strings.xml index a01259ddc6..d1982ce869 100644 --- a/OsmAnd/res/values-ja/strings.xml +++ b/OsmAnd/res/values-ja/strings.xml @@ -1742,7 +1742,6 @@ POIの更新は利用できません OSMでの注釈を開く OSMでの注釈を開き直す OSMの注釈にコメントを付加しました - OSMの注釈を削除しました OSMに注釈を作成しました OSMでの注釈 注釈の作成 diff --git a/OsmAnd/res/values-kn/strings.xml b/OsmAnd/res/values-kn/strings.xml index bbe6999e0d..0e3884002f 100644 --- a/OsmAnd/res/values-kn/strings.xml +++ b/OsmAnd/res/values-kn/strings.xml @@ -209,7 +209,6 @@ ಲಭ್ಯವಿರುವ ನಕ್ಷೆಗಳು ದೂರ: ಒಎಸ್ಎಂ ಟಿಪ್ಪಣಿಯನ್ನು ತೆರೆಯಿರಿ - ಅಳಿಸಲಾದ ಒಎಸ್ಎಂ ಟಿಪ್ಪಣಿ ಸೃಷ್ಟಿಸಲಾದ ಒಎಸ್ಎಂ ಟಿಪ್ಪಣಿ ಒಎಸ್ಎಂ ಟಿಪ್ಪಣಿ ಟಿಪ್ಪಣಿಯನ್ನು ಹಾಕಿರಿ diff --git a/OsmAnd/res/values-large/sizes.xml b/OsmAnd/res/values-large/sizes.xml index d30012865a..b8c65c032e 100644 --- a/OsmAnd/res/values-large/sizes.xml +++ b/OsmAnd/res/values-large/sizes.xml @@ -22,12 +22,12 @@ 120dp 6dp 84dp - 116dp + 138dp 12dp 35sp 30dp 22sp - 12sp + 18sp 131dp 81dp diff --git a/OsmAnd/res/values-lt/strings.xml b/OsmAnd/res/values-lt/strings.xml index a8f4eee382..1e8c0895ce 100644 --- a/OsmAnd/res/values-lt/strings.xml +++ b/OsmAnd/res/values-lt/strings.xml @@ -1749,7 +1749,6 @@ Ilguma %2$s Pridėti OSM pastabą OSM pastaba iš naujo atidaryta OSM pastaba papildyta komentaru - OSM pastaba ištrinta OSM pastaba sukurta OSM pastaba Iš naujo atidaryti pastabą diff --git a/OsmAnd/res/values-lv/strings.xml b/OsmAnd/res/values-lv/strings.xml index 2ee47646cc..33b8d8415a 100644 --- a/OsmAnd/res/values-lv/strings.xml +++ b/OsmAnd/res/values-lv/strings.xml @@ -1615,7 +1615,6 @@ Atvērt OSM piezīmi Atkārtoti atvērta OSM piezīme OSM Note pievienots komentārs - OSM piezīme ir izdzēsta Izveidota OSM piezīme OSM piezīme Izveidot piezīmi diff --git a/OsmAnd/res/values-ml/strings.xml b/OsmAnd/res/values-ml/strings.xml index 5a7b728ea8..947cb21a92 100644 --- a/OsmAnd/res/values-ml/strings.xml +++ b/OsmAnd/res/values-ml/strings.xml @@ -2058,7 +2058,6 @@ OSM POI ഇല്ലാതാക്കി OSM കുറിപ്പ് വീണ്ടും തുറന്നു OSM കുറിപ്പിൽ അഭിപ്രായമിട്ടു - OSM കുറിപ്പ് ഇല്ലാതാക്കി OSM കുറിപ്പു് സൃഷ്ടിച്ചു കുറിപ്പ് സൃഷ്ടിക്കുക OSM POI സൃഷ്ടിച്ചു diff --git a/OsmAnd/res/values-nb/strings.xml b/OsmAnd/res/values-nb/strings.xml index 1c3c51e2d8..f502cb1dd6 100644 --- a/OsmAnd/res/values-nb/strings.xml +++ b/OsmAnd/res/values-nb/strings.xml @@ -1748,7 +1748,6 @@ Åpne OSM-notat Gjenåpnet OSM-notat Kommentert OSM-notat - Slettet OSM-notat Opprettet OSM-notat OSM-notat Opprett notat diff --git a/OsmAnd/res/values-nl/phrases.xml b/OsmAnd/res/values-nl/phrases.xml index fb9b279343..65a281ce68 100644 --- a/OsmAnd/res/values-nl/phrases.xml +++ b/OsmAnd/res/values-nl/phrases.xml @@ -3612,4 +3612,141 @@ Kinderopvang Tolportaal Atol + Aangegeven + Aangegeven + Bestemmingsverkeer + Aangegeven + Toegestaan + Bestemmingsverkeer + Aangegeven + Aangegeven + Aangegeven + Bestemmingsverkeer + Toegestaan + Aangegeven + Aangegeven + Aangegeven + Aangegeven + Toegestaan + Aangegeven + Toegang voor gehandicapten: nee + Toegang voor taxi’s: nee + Toegang voor taxi’s: aangegeven + Toegang voor taxi’s: ja + Toegang voor landbouwvoertuigen: nee + Toegang voor landbouwvoertuigen: ja + Toegang voor sneeuwscooters: nee + Toegang voor sneeuwscooters: privé + Toegang voor skiërs: nee + Toegang voor skiërs: ja + Toegang voor touringcars: nee + Toegang voor touringcars: aangegeven + Toegang voor lijnbussen: nee + Toegang voor touringcars: ja + Toegang voor touringcars: ja + Toegang voor touringcars: nee + Toegang voor publiek transport of taxi’s: nee + Toegang voor publiek transport of taxi’s: aangegeven + Toegang voor publiek transport of taxi’s: ja + Toegang voor aanhangers: nee + Toegang voor campers: nee + Toegang voor caravans: nee + Toegang voor fietsers: klanten + Toegang voor fietsers: toegestaan + Toegang voor fietsers: bestemmingsverkeer + Toegang voor fietsers: afstappen + Toegang voor fietsers: privé + Toegang voor snorfietsers: nee + Toegang voor bromfietsers: nee + Toegang voor motorbestuurders: nee + Toegang voor motorbestuurders: privé + Toegang voor voetgangers: klanten + Toegang voor voetgangers: toegestaan + Toegang voor voetgangers: bestemmingsverkeer + Toegang voor voetgangers: nee + Toegang voor voetgangers: privé + Toegang voor voetgangers: ja + Toegang voor ruiters: boswachterij + Toegang voor ruiters: toegestaan + Toegang voor ruiters: bestemmingsverkeer + Toegang voor ruiters: privé + Toegang voor bestelwagens: nee + Toegang voor vrachtwagens: ongeschikt + Toegang voor vrachtwagens: ontraden + Toegang voor vrachtwagens: landbouw + Toegang voor vrachtwagens: nee + Toegang voor vrachtwagens: privé + Toegang voor motorvoertuigen: landbouw + Toegang voor motorvoertuigen: boswachterij + Toegang voor motorvoertuigen: bezorging + Toegang voor motorvoertuigen: militair + Toegang voor motorvoertuigen: klanten + Toegang voor motorvoertuigen: toegestaan + Toegang voor motorvoertuigen: bestemmingsverkeer + Toegang voor motorvoertuigen: nee + Toegang voor motorvoertuigen: privé + Toegang voor auto’s: toegestaan + Toegang voor auto’s: bestemmingsverkeer + Toegang voor auto’s: nee + Toegang voor auto’s: privé + Toegang voor auto’s: ja + Toegang voor auto’s: klanten + Toegang voor auto’s: boswachterij + Toegang voor motorvoertuigen: ja + Toegang voor voertuigen: boswachterij + Toegang voor voertuigen: bezorging + Toegang voor voertuigen: militair + Toegang voor voertuigen: klanten + Toegang voor voertuigen: toegestaan + Toegang voor voertuigen: bestemmingsverkeer + Toegang voor voertuigen: nee + Toegang voor voertuigen: privé + Toegang voor voertuigen: ja + Hookah lounge + Meiler + Noodhulpkist + Faciliteiten voor pijpleidingen + Parkeerplaats + Graf + Soort klooster: reguliere orde + Soort klooster: kluizenaars + Soort klooster: kanunniken + Soort klooster: convent + Soort klooster: monniken + Nee + Ja + Voetenbad + Meer + Rivier + Thermisch + Hamam + Onsen + Warmwaterbron + Postbank + Girokaart + Migros bank + Postfinance card + Geldopname: internationaal + Geldopname: minimum aankoopbedrag + Kostenloze geldopname: ja + Kostenloze geldopname: nee + Geldopname: zonder aankoop + Geldopname: bij aankoop + Munteenheid + Opnamelimiet + Geldopname via: zelfbedieningskassa + Geldopname via: kassa + Uitbatende organisatie van geldopname + Geldopname + Geldopname: ja + Huisdierverzorging + Tarief + Meubelmaker + Bakkerij + Vloerenlegger + Schrijnwerker + Destilleerderij + Aannemer + Health food + Kelderingang \ No newline at end of file diff --git a/OsmAnd/res/values-nl/strings.xml b/OsmAnd/res/values-nl/strings.xml index 46c160660b..8823108ba9 100644 --- a/OsmAnd/res/values-nl/strings.xml +++ b/OsmAnd/res/values-nl/strings.xml @@ -1755,7 +1755,6 @@ OSM-notitie aanmaken Heropen OSM-notitie Becommentarieerde OSM-notitie - Verwijderde OSM-notitie Aangemaakte OSM-notitie OSM-notitie Maak OSM-notitie aan @@ -2556,7 +2555,7 @@ Weg Een tik op de kaart verbergt/toont de bedieningsknoppen en widgets. Volledig scherm - Markering overslaan + Markering gepasseerd kan worden geïmporteerd als Favorieten of als GPX-bestand. importeer als GPX-bestand Importeren als Favorieten @@ -3432,7 +3431,7 @@ Recht-naar-punt Kies een naam voor het profiel Open instellingen - Plugin uitgeschakeld + Plug-in uit Deze plug-in is een afzonderlijke app, die afzonderlijk verwijderd moet worden als je deze niet meer nodig denkt te hebben. \n \nDe plug-in blijft op het apparaat aanwezig na het verwijderen van OsmAnd. @@ -3443,7 +3442,7 @@ Het geïmporteerde profiel bevat bijkomende gegevens. Klik \'importeer\' om enkel de profielgegevens te importeren of kies bijkomende gegevens om te importeren. Je kan bijkomende gegevens om mee met het profiel te exporteren. App Standaardwaarde (%s) - Herberekening uitschakelen + Niet herberekenen Minimale afstand om route te herbereken De route wordt herberekend wanneer de afstand tot die route groter is dan de opgegeven parameter Eigen profiel @@ -3472,17 +3471,17 @@ Alle profielinstellingen herstellen\? Slaat nieuw profiel op Kan profiel niet back-uppen. - %1$s of %2$s + %1$s van %2$s Hellingen Terrein tonen / verbergen Terrein verbergen Terrein tonen Een knop om de terreinlaag al dan niet te tonen op de kaart. - Verwijder een beschrijving - Voeg een beschrijving toe - Selecteer groep - Selecteer vorm - cirkel + Beschrijving verwijderen + Beschrijving toevoegen + Groep kiezen + Vorm kiezen + Cirkel Ruit Min Combineer POI-types uit verschillende categorieën. Tik op \"Schakelen\" om alles te selecteren, tik op de linkerkant voor de categoriekeuze. @@ -3702,4 +3701,16 @@ Time-out van het scherm Inschakelen om het zoomniveau van de kaart in te stellen met de volumeknoppen. Gebruik volumeknoppen om in en uit te zoomen + Verkrijg informatie over POIs uit Wikipedia. Het is je offline reisgidsje - schakel de Wikipedia-plug-in in en geniet van artikelen over de bezienswaardigheden in je omgeving. + Geef de voertuiglengte op, er zijn mogelijk routebeperkingen voor lange voertuigen. + Het volgende routepunt wordt verwijderd. Als dit de eindbestemming was, stopt de navigatie. + Verwijder het volgende routepunt + Kies een naam voor het punt + Wikipedia-kaarten downloaden + Motorscooter + Enduromotor + Rolstoel + Rolstoel vooraanzicht + Opgeloste OSM-notitie + Kart \ No newline at end of file diff --git a/OsmAnd/res/values-pl/strings.xml b/OsmAnd/res/values-pl/strings.xml index c5167021fe..eea73e1812 100644 --- a/OsmAnd/res/values-pl/strings.xml +++ b/OsmAnd/res/values-pl/strings.xml @@ -1781,7 +1781,6 @@ Usunięto użyteczne miejce OSM Otwarto ponownie notatkę OSM Skomentowano uwagę OSM - Usunięto uwagę OSM Utworzono uwagę OSM Utwórz uwagę Nie utworzono uwagi. @@ -3251,7 +3250,7 @@ Wybiera styl aplikacji, jednostki, region Ustawienia OsmAnd Skopiuj z innego profilu - Ciężar, wysokość, prędkość + Waga, wysokość, długość, prędkość Parametry pojazdu Komunikaty głosowe są odtwarzane tylko podczas nawigacji. Komunikaty głosowe @@ -3463,12 +3462,12 @@ Efekt uboczny: trasa nie będzie zawierała sekcji, w których nie zostało spełnione kryterium minimalnej prędkości (np. podczas pchania roweru pod strome wzgórze). Nie będzie również zawierała informacji o czasach odpoczynku, np. przerwach. Ma to wpływ na analizę i przetwarzanie końcowe, np. przy próbie określenia całkowitej długości trasy, czasu w ruchu lub średniej prędkości. Zmień układ kategorii Zmień kolejność sortowania listy, ukryj niepotrzebne kategorie. Wszystkie zmiany można importować lub eksportować za pomocą profili. - Można dodać nową, niestandardową kategorię wybierając jedną lub kilka potrzebnych kategorii. + Można dodać nową, niestandardową kategorię wybierając jedną lub kilka kategorii. Dostępne Dodaj niestandardową kategorię Wyświetlaj tylko w nocy - Ustawienia wtyczek przywrócone do stanu domyślnego. - Ustawienia profili przywrócone do stanu domyślnego. + Ustawienia wtyczek przywrócone do domyślnych. + Ustawienia profili przywrócone do domyślnych. %1$s/%2$s Zachód słońca o %1$s Wschód słońca o %1$s @@ -3480,7 +3479,7 @@ Użyj aplikacji systemowej Dźwięk migawki aparatu Przywrócenie domyślnej kolejności sortowania spowoduje przywrócenie porządku sortowania do stanu domyślnego po instalacji. - Tryb ułatwień dostępu wyłączony w twoim systemie. + Tryb ułatwień jest dostępu wyłączony w twoim systemie. Wygaś ekran zgodnie z ustawieniami systemu Wyczyść zarejestrowane dane - Profile: teraz można zmienić kolejność, ustawić ikonę dla mapy, zmienić wszystkie ustawienia dla profili bazowych i przywrócić je do domyślnych ustawień. @@ -3523,7 +3522,7 @@ Pokaż powiadomienia systemowe podczas nawigacji z instrukcjami nawigacji. Powiadomienie nawigacyjne Domyślnie (%s) - Wyłączenie ponownego obliczania + Bez ponownego obliczania Minimalna odległość do ponownego wyznaczenia trasy Wyznacza ponownie trasę, jeśli odległość do trasy jest dłuższa niż określony parametr Twoje nagrane ślady są w %1$s lub w folderze OsmAnd. @@ -3588,7 +3587,7 @@ Przycisk do wyświetlania lub ukrywania warstwy terenu na mapie. Pokaż teren Ukryj teren - Pokaż/ukryj teren + Pokaż / ukryj teren Nachylenie Włącz, aby wyświetlić cieniowanie wzniesień lub stoków. Możesz przeczytać więcej o tego rodzaju mapach na naszej stronie. Legenda @@ -3630,7 +3629,7 @@ Ukryte Te elementy są ukryte w menu, jednak reprezentowane opcje i wtyczki będą wciąż działać. Ukrycie ustawień resetuje je do pierwotnego stanu. - \"Główne czynności\" zawierają tylko 4 przyciski. + Mieści tylko 4 przyciski. Główne działania Możesz przemieszczać elementy tylko wewnątrz tej kategorii. Wtyczka deweloperska @@ -3719,7 +3718,7 @@ Ukryj transport publiczny Pokaż transport publiczny Pokaż/ukryj transport publiczny - Utwórz / Edytuj POI + Utwórz / Edytuj użyteczne miejsce Dodaj / Edytuj Ulubione Naciśnięcie przycisku akcji powoduje przełączanie między wybranymi profilami. Dodaj profil diff --git a/OsmAnd/res/values-pt-rBR/strings.xml b/OsmAnd/res/values-pt-rBR/strings.xml index 1054f6d06a..3b0b437c87 100644 --- a/OsmAnd/res/values-pt-rBR/strings.xml +++ b/OsmAnd/res/values-pt-rBR/strings.xml @@ -1682,7 +1682,6 @@ Pôr do Sol: %2$s Abrir nota no OSM Nota no OSM reaberta Nota no OSM comentada - Nota no OSM excluído Nota no OSM criada Nota no OSM Criar nota @@ -3802,4 +3801,10 @@ Pôr do Sol: %2$s O ponto de destino atual na rota será excluído. Se for o destino, a navegação será interrompida. Baixar mapas da Wikipédia Obter informações sobre pontos de interesse da Wikipédia. É o seu guia de bolso off-line - só ativar o complemento Wikipédia e desfrutar de artigos sobre os elementos ao seu redor. + Motocicleta enduro + Motoneta + Cadeira de rodas + Cadeira de rodas para a frente + Carrinho de compras + Nota OSM fechada \ No newline at end of file diff --git a/OsmAnd/res/values-pt/strings.xml b/OsmAnd/res/values-pt/strings.xml index 898063f44d..52ec68e2d2 100644 --- a/OsmAnd/res/values-pt/strings.xml +++ b/OsmAnd/res/values-pt/strings.xml @@ -1506,7 +1506,6 @@ Abrir anotação OSM Re-abrir anotação OSM Anotação OSM comentada - Nota OSM eliminada Anotação OSM adicionada Anotação OSM Adicionar anotação OSM diff --git a/OsmAnd/res/values-ro/strings.xml b/OsmAnd/res/values-ro/strings.xml index 3e7d433de9..c0a9abe434 100644 --- a/OsmAnd/res/values-ro/strings.xml +++ b/OsmAnd/res/values-ro/strings.xml @@ -1359,7 +1359,6 @@ \"Oprit\" lansează direct ecranul hărții. Copiat în clipboard Nota OSM comentată - Nota OSM ștearsă Nota OSM creată Notă OSM Crează notă diff --git a/OsmAnd/res/values-ru/phrases.xml b/OsmAnd/res/values-ru/phrases.xml index c685fd9c49..c85fd1297b 100644 --- a/OsmAnd/res/values-ru/phrases.xml +++ b/OsmAnd/res/values-ru/phrases.xml @@ -3817,4 +3817,7 @@ Вибрация: нет Стрелка Вибрация + Городской квартал + Муниципалитет + Подарочная коробка \ No newline at end of file diff --git a/OsmAnd/res/values-ru/strings.xml b/OsmAnd/res/values-ru/strings.xml index cb563bcdd3..659e2b28c2 100644 --- a/OsmAnd/res/values-ru/strings.xml +++ b/OsmAnd/res/values-ru/strings.xml @@ -274,7 +274,6 @@ Редактировать POI Заметка OSM открыта снова К заметке OSM добавлен комментарий - Заметка OSM удалена Заметка OSM создана Заметка OSM Создать заметку @@ -548,7 +547,7 @@ Минимальный масштаб векторных карт Не удалось выполнить локальный поиск. Поиск по географическому положению - Системная + Системный Язык интерфейса приложения (будет использован после перезапуска OsmAnd). Язык интерфейса Далее @@ -1120,7 +1119,7 @@ Стиль карты Эл. почта Восход/закат - Мобильный просмотр и навигация по онлайн и локальным картам OSM всего мира + Мобильные карты и навигация по всему миру для локальных и онлайн-карт OSM OsmAnd (Open Street Maps Automated Navigation Directions) \n \n OsmAnd — это навигационное приложение с открытым исходным кодом и доступом к картам и данным на основе OSM. Все данные карт (векторные или растровые) могут быть сохранены на карту памяти устройства для использования без подключения к интернету. OsmAnd также предоставляет локальные и онлайн-средства построения маршрута, включая голосовые инструкции по маршруту. @@ -1200,7 +1199,7 @@ Выберите цветовую схему дорог: Цветовая схема дорог Ш %1$.3f Д %2$.3f - незавершённое + неполный Ограничение скорости GPX Прочие карты @@ -1386,7 +1385,7 @@ \n Примечание 2: в новом хранилище совместное использование файлов OsmAnd и OsmAnd+ невозможно. Копирование файла (%s) на новое место… Копирование файлов данных OsmAnd на новое место (%s)… - Выключение 2-фазной маршрутизации для автомобильной навигации. + Выключение двухфазной маршрутизации для автомобильной навигации. Быстрое построение маршрута не удалось (%s), отмените для возврата к медленному построению. Масштаб Выберите GPX… @@ -1624,7 +1623,7 @@ Нежелательные участки %1$s необходимо это разрешение, чтобы выключить экран для экономии энергии. Автовключение экрана перед поворотом - Включать экран устройства (если он выключен) при приближении к повороту. + Включать экран перед поворотом (если выключен). Карты доступные для обновления: %1$s Координаты Дом @@ -1833,7 +1832,7 @@ Умный перерасчёт маршрута Перерасчёт только начальной части маршрута для длительных поездок. Удалить правки OSM - Выключен + Выключено Раскраска по сетевой принадлежности Раскраска туристических меток по OSMC Выход @@ -1998,7 +1997,7 @@ Поделиться местоположением Отправить Выберите, где вы хотите хранить файлы карт и другие данные. - «Выключено» запускает карту непосредственно. + При выключении сразу открывается карта. Карта загружена QR код Показать карту @@ -2414,7 +2413,7 @@ Маркер перемещён в действующие Указатель расстояния Показать карту - Для использования этой функции вы должны добавить хотя бы один маркер. + Для использования этой функции нужно добавить хотя бы один маркер. Не удалось изменить заметку. Дорога Показывать направляющие линии @@ -3245,14 +3244,14 @@ Внешний вид Настроить навигацию Предупреждения отображаются в левом нижнем углу во время навигации. - Влияет для всего приложения + Общие настройки приложения Настройки OsmAnd Копировать из другого профиля Включить экран Карта во время навигации Карта во время навигации Вес, высота, длина, скорость - Параметры транспортного средства + Параметры автомобиля Голосовые оповещения происходят только во время навигации. Навигационные инструкции и объявления Голосовые подсказки @@ -3369,7 +3368,7 @@ Выберите цвет Вы не можете удалить стандартные профили OsmAnd, но вы можете отключить их на предыдущем экране или переместить вниз. Редактировать профили - Тип навигации влияет на правила расчёта маршрута. + «Тип навигации» определяет способ расчета маршрутов. Внешний вид профиля Значок, цвет и имя Редактировать список профилей @@ -3814,4 +3813,8 @@ Текущий пункт назначения на маршруте будет удалён. Если это пункт назначения, навигация остановится. Информация о достопримечательностях из Википедии. Это ваш карманный автономный гид — просто включите плагин Википедии и наслаждайтесь статьями об объектах вокруг вас. Скачать карты Википедии + Эндуро мотоцикл + Мотороллер + Закрытая заметка OSM + Инвалидная коляска \ No newline at end of file diff --git a/OsmAnd/res/values-sc/strings.xml b/OsmAnd/res/values-sc/strings.xml index fd9438d853..f8c3f277fc 100644 --- a/OsmAnd/res/values-sc/strings.xml +++ b/OsmAnd/res/values-sc/strings.xml @@ -1770,7 +1770,6 @@ Aberi una nota de OSM Nota OSM torrada a abèrrere Nota OSM cummentada - Nota OSM iscantzellada Nota OSM creada Nota OSM Crea nota @@ -3817,4 +3816,10 @@ Su puntu de destinatzione atuale in s\'àndala at a èssere iscantzelladu. Si at a èssere sa destinatzione, sa navigatzione s\'at a firmare. Iscàrriga sas mapas de Wikipedia Otene informatziones a pitzu de puntos de interesse dae Wikipedia. Est sa ghia non in lìnia tua de mantènnere in butzaca - abìlita s\'estensione Wikipedia e ispassia·ti cun sos artìculos a pitzu de sos ogetos a fùrriu de tie. + Moto enduro + Motorinu + Cadira a rodas cara a in antis + Cadira a rodas + Go-kart + Nota de OSM serrada \ No newline at end of file diff --git a/OsmAnd/res/values-sk/strings.xml b/OsmAnd/res/values-sk/strings.xml index d850b202d7..b41cf8721c 100644 --- a/OsmAnd/res/values-sk/strings.xml +++ b/OsmAnd/res/values-sk/strings.xml @@ -1767,7 +1767,6 @@ Otvoriť OSM poznámku Znovuotvorená OSM poznámka Pridaný komentár k OSM poznámke - Odstránená OSM poznámka Vytvorená OSM poznámka OSM poznámka Vytvoriť poznámku @@ -3813,4 +3812,10 @@ Aktuálny cieľový bod na trase bude vymazaný. Ak je to posledný cieľ, navigácia sa zastaví. Stiahnuť mapy Wikipédia Získajte informácie o bodoch záujmu z Wikipédie. Je to váš vreckový sprievodca - zapnite modul Wikipédia a užívajte si články o objektoch okolo vás. + Enduro motorka + Skúter + Invalidný vozík + Invalidný vozík dopredu + Motokára + Zatvorená OSM poznámka \ No newline at end of file diff --git a/OsmAnd/res/values-sl/strings.xml b/OsmAnd/res/values-sl/strings.xml index 2878167119..323ca39e8e 100644 --- a/OsmAnd/res/values-sl/strings.xml +++ b/OsmAnd/res/values-sl/strings.xml @@ -1768,7 +1768,6 @@ Sorazmerna velikost pomnilnika je %4$s MB (omejitev na androidu je %5$s MB, na d Izbrisana točka POI Odpri opombe OSM Ponovno odprte opombe OSM - Izbrisana opomba OSM Ustvarjena opomba OSM Opomba OSM Ustvari opombo diff --git a/OsmAnd/res/values-sr/phrases.xml b/OsmAnd/res/values-sr/phrases.xml index 94e738e86b..2908da2fc3 100644 --- a/OsmAnd/res/values-sr/phrases.xml +++ b/OsmAnd/res/values-sr/phrases.xml @@ -2815,4 +2815,820 @@ Мофа приступ Приступ мотоциклима Стена пењања + Саветовање (брачно): не + Саветовање (брачно): да + Саветовање (имигрант): не + Саветовање (имигрант): да + Саветовање (бескућно): не + Саветовање (бескућно): да + Саветовање (породично): не + Саветовање (породично): да + Саветовање (образовање): не + Саветовање (образовање): да + Саветовање (око дрога): не + Саветовање (око дрога): да + Саветовање (кризно): не + Саветовање (кризно): да + Саветовање (за парове): не + Саветовање (за парове): да + Саветовање (смернице за дете): не + Саветовање (смернице за дете): да + Саветовање (пренатално): не + Саветовање (пренатално): да + Саветовање (зависност): не + Саветовање (зависност): да + Улога здравственог радника: вештак + Улога здравственог радника: техничар + Улога здравственог радника: помоћник лекара + Улога здравственог радника: терапеут + Улога здравственог радника: психолог + Улога здравственог радника: подолог + Улога здравственог радника: лекар + Улога здравственог радника: болничар + Улога здравственог радника: медицинска сестра + Улога здравственог радника: бабица + Улога здравственог радника: исцелитељ + Улога здравственог радника: асистент + Зид + Понд + Суво буре + Стуб + Подземни + Тачка усисавања + Тип здравствене установе: дом групе за подршку + Тип здравствене установе: старачки дом + Тип здравствене установе: прва помоћ + Тип здравствене установе: амбуланта + Тип здравствене установе: одељење + Тип здравствене установе: терапија + Тип здравствене установе: лабораторија + Тип здравствене установе: саветовалиште + Тип здравствене установе: теренска болница + Медицинска канцеларија + Здравствена услуга: тест: не + Здравствена служба: тест: да + Здравствена служба: подршка: не + Здравствена служба: подршка: да + Здравствена служба: вакцинација: не + Здравствена служба: вакцинација: да + Здравствена служба: превенција: не + Здравствена служба: превенција: да + Здравствена услуга: дечје одељење: не + Здравствена услуга: дечје одељење: да + Здравствена служба: преглед: не + Здравствена служба: преглед: да + Здравствена служба: саветовање: не + Здравствена служба: саветовање: да + Здравствена служба: породилиште: не + Здравствена служба: породилиште: да + Унани + Сида + Традиционално Тибетански + Традиционално монголски + Кампо + Ајурведа + Традиционално Кинески + Западни + Санитарна отпадна станица + Соларијум + Смернице за госте: не + Смернице за госте: да + Оријентација места слободног летења: З + Оријентација места слободног летења: ЈЗ + Нема време лета (слободно летење) + Оријентација места слободног летења: СЗ + Оријентација места слободног летења: Ј + Оријентација места слободног летења: ЈИ + Оријентација места слободног летења: И + Оријентација места слободног летења: СИ + Оријентација места слободног летења: С + Слободно летење круто: не + Крута + Змајарство: не + Змајарство + Параглајдинг: не + Параглајдинг + Званично: не + Званично: да + Обука + Вуча + Слетање на врху + Слетање + Полетање + Управљано дугметом: не + Управљано дугметом: да + Славина за воду + Слободно летење (спорт) + Усисивач + Усисавач: не + Да + Компримовани ваздух: не + Да + Расадник биљака + Име куће + Експлозија: уређај + Експлозија: бојева глава + Експлозија: пречник кратера + Плотун експлозија: друга или каснија детонација плотун теста + Плотун експлозија: прва детонација плотун теста + Куглање + Мрежа + Продаја: половна + Продаја: да, половна + Продаја: не + Продаја + Штандови + Рептили + Соколарник + Птичник + Птице + Сафари парк + Кућиште + Парк дивљих животиња + Зоолошки врт са мажењем животиња + Животни прстен + Школа страних језика + Музичка школа + Дечији камп + Поправка електронике: ТВ + Поправка електронике: телефон + Поправка електронике: апарати + Поправка електронике: рачунари + Канцеларија снабдевача енергије + Вино: сервирано + Вино: малопродаја + Вино: да + Да + Заједнички радни простор + Теретна станица + Конструкција: скривена + Конструкција: купола + Конструкција: тањир + Конструкција: самостојећа + Конструкција: решетка + Тип: отворена штала + Бушеншанк + Затворено + Отворено + Видљивост: подручје + Видљивост: улица + Видљивост: кућа + Локација: улаз + Локација: зид + Локација: мост + Локација: платформа + Локација: унутар + Локација: напољу + Локација: врх крова + Локација: кров + Локација: изнад главе + Локација: надземље + Локација: подводна + Локација: подземна + Метална мрежа + Декотрава + Вештачка трава + Тартан + Глина + Планинско подручје + Кулуар + Клисура + ВХФ канал + Законодавна институција + Транспортна институција + Благајна + Социјалне услуге + Социјално осигурање + Јавни сервис + Министарство + Архива + Мрежа + Кану: не + Кану: да + Кајаци: не + Кајаци: да + Гумењак: не + Гумењак: да + Једрењаци: не + Једрењаци: да + Џетски: не + Џетски: да + Бродови на веслање: не + Бродови на веслање: да + Кућни бродови: не + Кућни бродови: да + Моторни бродови: не + Моторни бродови: да + Тип: ограђен део + Чување животиња: овца + Чување животиња: коњ + Чување животиња + Литица + Фото студио + Додаци исхрани + Локомотива + Продавница електронских цигарета + Бинго + Клађење + Слот машине + Пацинко + Лутрија + Врста + Место коцкања + Лото срећке + Опрема за расвету + Браварска продавница + Електро продавница + Намирнице за забаву + Место за исхрану животиња + Кантонска + Пастел + Суб + Сагардотегиа + Чај са мехурићима + Брасери + Емпанада + Предјело + Пиадина + Кантина + Слане палачинке + Замрзнути јогурт + Деликатеси + Фина јела + Соба + Багел + Хеуригер + Гастропуб + Гиудон + Риба и помфрит + Тип: метални орман + Тип: дрвени ормар + Тип: кутија за читање + Тип: телефонска кутија + Јавна полица за књиге + Божић: вебсајт + Божић: локација + Божић: радно време + Божић: белешка + Божић: период догађаја + Јелка + Продавница дрвећа + Божићна радња + Божићна пирамида + Божићно тржиште + Божићни догађај + Божић + Википедија + Дужина + Одлагање тоалета: кантом + Одлагање тоалета: хемијско + Одлагање тоалета: питлатрине + Одлагање тоалета: испирање + Резервоар за воду + Противпожарни оператор + Висока комисија + Резиденција амбасадора + Делегација + Стална мисија + Почасни конзулат + Генерални конзулат + Конзулат + Саобраћајно огледало + Једино + Не + Да + Минимална старост + Главни дистрибуциони оквир + Аквакултура: дагње + Аквакултура: риба + Аквакултура: шкампи + Аквакултура + Приказ информација путницима: не + Приказ информација путницима: да + Подршка: кула + Подршка: кров + Подршка: носеће + Подршка: плафон + Подршка: билбord + Подршка: земља + Подршка: постоље + Подршка: дрво + Подршка: зид + Подршка: стуб + Приказ датума: не + Приказ датума + Хигрометар: не + Капацитет (кревета) + ХигрометарHygrometer + Термометар: не + Термометар + Сунчани сат + Дигитални екран + Аналогни екран + Пумпна станица + Екран: не + Екран: да + Излаз: биогас + Излазна снага биогаса + Излаз: вакуум + Излаз: компримовани ваздух + Излаз: хладна вода + Излаз: врућ ваздух + Излаз: пара + Излаз: топла вода + Излаз (струја): не + Излаз: струја + Напон + Стакленичка хортикултура + Гравитациона + Метеоролошка + Употреба: шпијунажа + Употреба: истраживање + Употреба: шпијунажа + Употреба: образовање + Спектар + Пречник + Гама + Радио + Оптички + Телескоп + Картица \"Тројка\" се не прихвата + Тројка + Статус пумпе: закључана + Статус пумпе: поломљена + Статус пумпе: у реду + Стил пумпе: историјски + Стил пумпе: модеран + Тип пумпе: гравитациона + Тип пумпе: Индија Мк II или III> + Тип пумпе: пумпа снопа + Вентилациони отвор + Балка + Приватни + Јавни + Регионални + Међународни + Испорука: не + Да + Надзор прелаза: камера + Надзор прелаза: полазник + Надзор прелаза: не + Надзор прелаза + Прелазни салтир: не + Прелазни салтир + Прелаз на захтев: не + Прелаз на захтев + Прелазно светло: не + Прелазно светло + Прелазно звоно: не + Прелазно звоно + Прелазна баријера: дупло половична + Прелазна баријера: половична + Прелазна баријера: пуна + Прелазна баријера + Прелазна баријера: не + Активирање прелаза: даљинско + Активирање прелаза: локално + Активирање прелаза: аутоматско + Рекреациони центар + Летњи камп + Покварена гомила + Одређено + Со: не + Со + Дубина + Улично постоље + Бицикл дрво + Ормарићи + Војни контролни пункт + Тип кабинета: улична расвета + Тип кабинета: водоводни + Тип кабинета: отпади + Тип кабинета: поштански + Тип кабинета: гасни + Тип кабинета: кабловска телевизија + Тип кабинета: телекомски + Тип кабинета: енергетски + У употреби: да + Цистерна + Ток + Понд + Главни + Стил хидранта: wsh + Подземни + Улица + Паркинг + Трака + Зелена + Тротоар + Капацитет протока хидранта + Број хидранта + Притисак хидранта + Пречник хидранта + Канцеларија бабице + Услуга неге + Канцеларија психолога + Канцеларија исцелитеља + Канцеларија подолога + Канцеларија терапеута + Лекарска ординација + СИДА: не + СИДА: да + Аутизам: не + Аутизам: да + Ебола: не + Ебола: да + Маларија: не + Маларија: да + Кућна посета: не + Да + Хитна: не + Хитна: да + Саветовање: не + Саветовање: да + Болничке услуге: само + Болничке услуге: не + Болничке услуге: да + Предвиђено за дечаке: не + Предвиђено за дечаке: да + Предвиђено за мушкарце: не + Предвиђено за мушкарце: да + Предвиђено за девојке: не + Предвиђено за девојке: да + Предвиђено за старије особе: не + Предвиђено за старије особе: да + Предвиђено за жене: не + Предвиђено за жене: да + Предвиђено за одрасле: не + Предвиђено за одрасле: да + Предвиђено за децу: не + Предвиђено за децу: да + Предвиђено за малишане: не + Предвиђено за малишане: да + Предвиђено за новорођенчад: не + Предвиђено за новорођенчад: да + Саветовање (насиље): не + Саветовање (насиље): да + Саветовање (жртве): не + Саветовање (жртве): да + Саветовање (сексуално злостављање): не + Саветовање (сексуално злостављање): да + Саветовање (сексуално): не + Саветовање (сексуално): да + Саветовање (рехабилитација): не + Саветовање (рехабилитација): да + Саветовање (исхрана): не + Саветовање (исхрана): да + Атол + Донација крви + Медицинска лабораторија + Велепродаја + Производња кондиторских производа + Теренско прикупљање + Уређај инспекције + Вентилски групна + Вентилска + Мерна + Компресиона + Компензациона + Претварачка + Вучна + Прелазна + Индустријска + Мања дистрибуциона + Дистрибуциона + Преносна + Цевоводна подстаница + Једино + Да + Поправка обуће + Брдо + Лиценцни часови + Рушевине + Минско поље + Опасност од поплаве + Клизав пут + Опасност од лавине + Опасност од ерозије + Нуклеарна опасност + Опасност + Бесконтактно не прихвата се + Бесконтактно + Нагла појава + Продавница апарата + Крајњи датум + Стена + Курс + Електронски + Инјектор + Код + Тачка уреза + Пешачка контролна тачка + Просечан нагиб + Најнижа тачка + Највиша тачка + Ледени језик + Остатак + Полица + Стена + Ледопад + Висећи + Планински + Плимски + Излазни + Долина + Плато + Ледено поље + Ледена капа + Тежина + Број кабла + Виа ферата + Авантура пењања + Зип линија + Гуме + Осигурање + Мотор + Поправка трансмисије + Реглажа + Пригушивач + Поправка камиона + Стакло + Точкови + Електрика + Поправка каросерије + Клима уређај + Батерије + Ауто делови + Дијагностика + Продаја нових аутомобила + Кочнице + Продаја половних аутомобила + Промена уља + Ауто сервис + Играчки центар за одрасле + Забавна аркадна игра + Канцеларија за водоснабдевање + Место испоруке продавнице + Име речних брзака + Керамика + Продавница подова + Низак + Средњи + Висок + Низак + Средњи + Висок + Низак + Средњи + Висок + Низак + Средњи + Висок + Низак + Средњи + Висок + Низак + Средњи + Висок + АС / НЗС 3112 + БС 1363 + Шуко + НЕМА 14-30 + НЕМА 14-30 + НЕМА 5-20 + НЕМА 5-15Р + Тесла Роудстер + Тесла Суперпуњач + Тесла стандард + CHAdeMO + Тип 3 + Тип 2 комбо + Тип 2 + Тип 1 комбо + Тип 1 + ЦЕЕ црвена 125А + ЦЕЕ црвена 64А + ЦЕЕ црвена 32А + ЦЕЕ црвена 16А + ЦЕЕ плава + Продавница канабиса + Продавница чамаца + Продавница камина + Замрзнута храна + Тип: пашњак + Тип: трајна + Тип: прелазна + Пречник круне + Обим + Пењачке руте + Дневник врха пењања: не + Дневник врха пењања: да + Оријентација зида: СЗ + Оријентација зида: З + Оријентација зида: ЈЗ + Оријентација зида: Ј + Оријентација зида: ЈИ + Оријентација зида: И + Оријентација зида: СИ + Оријентација зида: С + Фиксна сидра: не + Фиксна сидра: да + Квалитет пењања: крх + Квалитет пењања: чврст + Стена за пењање: порфир + Стена за пењање: гнеисс + Стена за пењање: кварцит + Стена за пењање: пешчењак + Пењање на камен: гранит + Стена за пењање: кречњак + Максимална дужина пењања + Минимална дужина пењања + Дужина пењања + Соло у дубљим водама: не + Соло у дубљим водама: да + Мешовито: не + Мешовито: да + Лед: не + Лед: да + Руте на више тачака: не + Руте са више тачака: да + Традиционално: не + Традиционално: да + Горње уже: не + Горње уже: да + Балванирање: не + Балванирање: да + Спорт: не + Спорт: да + Поштански број + Трансфер новца + Центар плаћања + Стан + Кућни број + Улица + Кутија писма + Депо + Станица пуњење + Величина мапе: регија + Величина мапе: град + Величина мапе: сајт + Тип мапе: топоскопска + Тип мапе: шема + Врста мапе: улична + Врста мапе: топо + Излаз станице пуњења + Ампеража + Цена паркирања + Цена паркирања: не + Цена паркирања: да + Камион: не + Камион: да + Скутер: не + Скутер: да + Бицикл: не + Бицикл: да + Аутомобил: не + Аутомобил: да + Утичница: АС / НЗС 3112: излаз + Утичница: АС / НЗС 3112: струја + Утичница: АС / НЗС 3112 + Утичница: БС 1363: излаз + Утичница: БС 1363: струја + Утичница: БС 1363 + Утичница: Шуко: излаз + Утичница: Шуко: струја + Утичница: Шуко + Утичница: НЕМА 14-50: излаз + Утичница: НЕМА 14-50: струја + Утичница: НЕМА 14-50 + Утичница: НЕМА 14-30: излаз + Утичница: НЕМА 14-30: струја + Утичница: НЕМА 14-30 + Утичница: НЕМА 5-20: излаз + Утичница: НЕМА 5-20: струја + Утичница: НЕМА 5-20 + Утичница: НЕМА 5-15Р: излаз + Утичница: НЕМА 5-15Р: струја + Утичница: НЕМА 5-15Р + Утичница: Тесла Роудстер: излаз + Утичница: Тесла Роудстер: струја + Утичница: Тесла Роудстер + Утичница: Тесла суперпуњач: излаз + Утичница: Тесла суперпуњач: струја + Утичница: Тесла суперпуњач + Утичница: Тесла стандард: излаз + Утичница: Тесла стандард: струја + Утичница: Тесла стандард + Утичница: CHAdeMO: излаз + Утичница: CHAdeMO: струја + Утичница: CHAdeMO + Утичница: Тип 3: излаз + Утичница: Тип 3: струја + Утичница: Тип 3 + Утичница: Тип 2 комбо: излаз + Утичница: Тип 2 комбо: струја + Утичница: Тип 2 комбо + Утичница: Тип 2: излаз + Утичница: Тип 2: струја + Утичница: Тип 2 + Утичница: Тип 1 комбо: излаз + Утичница: Тип 1 комбо: струја + Утичница: Тип 1 комбо + Соцкет: Тип 1: излаз + Утичница: Тип 1: струја + Утичница: Тип 1 + Утичница: ЦЕЕ црвена 125А: излаз + Утичница: ЦЕЕ црвена 125А: струја + Утичница: ЦЕЕ црвена 125А + Утичница: ЦЕЕ црвена 64А: излаз + Утичница: ЦЕЕ црвена 64А: струја + Утичница: ЦЕЕ црвена 64А + Утичница: ЦЕЕ црвена 32А: излаз + Утичница: ЦЕЕ црвена 32А: струја + Утичница: ЦЕЕ црвена 32А + Утичница: ЦЕЕ црвена 16А: излаз + Утичница: ЦЕЕ црвена 16А: струја + Утичница: ЦЕЕ црвена 16А + Утичница: ЦЕЕ плава: излаз + Утичница: ЦЕЕ плава: струја + Утичница: ЦЕЕ плава + Флаширана вода + Резервоар за воду + Превоз воде + Бушотина + Пумпа + Текућа вода + Цевовод + Бунар + Акватаблете + Обрнута осмоза + Хлор + Нема + Трајност воденог места: хитно + Трајност воденог места: издржљива + Потребно одржавање + Прекинуто + Ограничен + Локација: киоск + Изнајмљивање чамаца + Кревети + Резервација: само чланови + Резервација: не + Резервација: да + Резервације: препоручује се + Резервација: обавезна + Зимска соба: не + Зимска соба: да + Правац: сви + Правац: излаз + Правац: улаз + Правац: надоле + Правац: нагоре + Правац: супротно од казаљке на сату + Правац: у смеру казаљке на сату + Правац: уназад + Правац: напред + Правац: север-северозапад + Правац: северозапад + Правац: запад-северозапад + Правац: запад + Правац: запад-југозапад + Правац: југозапад + Правац: југ-југозапад + Правац: југ + Правац: југ-југоисток + Правац: југоисток + Правац: исток-југоисток + Правац: исток + Правац: исток-североисток + Правац: североисток + Правац: север-североисток + Правац: север + Свемирска лука + Пуштање: не + Пуштање: да + Усвајање: не + Усвајање: да + Власник + Стандардни + Дуалспорт + Ван пута + Чопер + Спортски моторцикл + Скутер + Мото одећа: не + Мото одећа + Гуме: не + Гуме + Делови: не + Делови + Поправака: не + Поправка + Изнајмљивање: не + Изнајмљивање + Да + Ознака земље + Природни споменик + Брига о деци + Путарина \ No newline at end of file diff --git a/OsmAnd/res/values-sr/strings.xml b/OsmAnd/res/values-sr/strings.xml index 5b6be8d957..7a19f27534 100644 --- a/OsmAnd/res/values-sr/strings.xml +++ b/OsmAnd/res/values-sr/strings.xml @@ -357,7 +357,6 @@ Отвори белешку ОСМ-а Поново отворена белешка ОСМ-а Искоментарисана белешка ОСМ-а - Избрисана белешка ОСМ-а Белешка ОСМ-а Направи белешку Додај коментар @@ -3812,4 +3811,10 @@ Тренутна одредишна тачка биће уклоњена. Ако је она одредишна, стопираће се навигација. Преузмите мапе Википедије Информације о тачкама од интереса потражите од Википедије. То је ваш џепни ванмрежни водич - само омогућите додатак Википедиа и уживајте у чланцима о објектима око вас. + Ендуро скутер + Скутер + Инвалидска колица + Инвалидска колица напред + Корпа + Затворена ОСМ белешка \ No newline at end of file diff --git a/OsmAnd/res/values-sv/phrases.xml b/OsmAnd/res/values-sv/phrases.xml index 4306fea7c0..60e90c4246 100644 --- a/OsmAnd/res/values-sv/phrases.xml +++ b/OsmAnd/res/values-sv/phrases.xml @@ -1640,7 +1640,7 @@ Ja Drive-in: nej Ja - Drive-through: ja + Drive-through: nej Bryggerinamn Ja Inget mikrobryggeri diff --git a/OsmAnd/res/values-sv/strings.xml b/OsmAnd/res/values-sv/strings.xml index 20b9ae5977..36934d43c5 100644 --- a/OsmAnd/res/values-sv/strings.xml +++ b/OsmAnd/res/values-sv/strings.xml @@ -1711,7 +1711,6 @@ Long %2$s Raderat OSM POI Öppna OSM-anteckning Kommenterat OSM-anteckning - Tagit bort OSM-anteckning Skapat OSM-anteckning OSM-anteckning Skapa anteckning diff --git a/OsmAnd/res/values-tr/phrases.xml b/OsmAnd/res/values-tr/phrases.xml index 5b939eb519..5d6ab323b0 100644 --- a/OsmAnd/res/values-tr/phrases.xml +++ b/OsmAnd/res/values-tr/phrases.xml @@ -1476,7 +1476,7 @@ Serbest sürüş Klasik Klasik+paten - Scooter + Mobilet Paten Hayır Tümsek @@ -2394,4 +2394,7 @@ URL Ok Titreşim + Mobilet: hayır + Mobilet: evet + Mobilet \ No newline at end of file diff --git a/OsmAnd/res/values-tr/strings.xml b/OsmAnd/res/values-tr/strings.xml index 50457451cb..268467dae2 100644 --- a/OsmAnd/res/values-tr/strings.xml +++ b/OsmAnd/res/values-tr/strings.xml @@ -975,7 +975,7 @@ (%s) dosyası yeni hedefine kopyalanıyor… OsmAnd veri dosyaları yeni hedef (%s) \'e kopyalanıyor… Navigasyon tercihleri - Güzergah seçenekleri + Yönlendirme tercihleri Metinden konuşmaya konuşma hızını belirtin. Hoparlör yerleşimi Hızlı rota hesaplama ( $1%s) başarısız oldu , hesaplama yavaş çare . @@ -1273,7 +1273,6 @@ OSM Not\'u aç Yeniden açılmış OSM Notu Yorum yazılmış OSM Notu - Silinmiş OSM Notu Oluşturulmuş OSM Notu OSM Notu Not oluştur @@ -2501,7 +2500,7 @@ Nokta ekle Açıklamayı gizle Açıklamayı göster - Haritaları taşı + Haritaları hareket ettir Yürüme navigasyonunu dene. Ayarları değiştirmeyi deneyin. Restore et @@ -2582,7 +2581,7 @@ Yeni profil Çökme Kişisel taşıyıcı - Scooter + Mobilet Gün Günler Günler @@ -3371,7 +3370,7 @@ Renk seç OsmAnd öntanımlı profilleri silinemez, ancak (önceki ekranda) devre dışı bırakılabilir veya en altta sıralanabilir. Profilleri düzenle - \'Navigasyon türü\' rotaların nasıl hesaplandığını yönetir. + \'Navigasyon türü\' güzergahın nasıl hesaplandığını yönetir. Profil görünümü Simge, renk ve isim Profil listesini düzenle @@ -3770,4 +3769,10 @@ Yakınlaştırma için ses seviyesi düğmeleri Wikipedia haritalarını indir Wikipedia\'dan ilgi çekici yerler hakkında bilgi alın. Bu sizin çevrim dışı cep rehberinizdir - sadece Wikipedia eklentisini etkinleştirin ve etrafınızdaki nesneler hakkında makalelerin tadını çıkarın. + Enduro motosiklet + Küçük motosiklet + Tekerlekli sandalye + İleri tekerlekli sandalye + Go-kart + Kapatılmış OSM Notu \ No newline at end of file diff --git a/OsmAnd/res/values-uk/strings.xml b/OsmAnd/res/values-uk/strings.xml index 8a5184b325..8e1ff5e6fe 100644 --- a/OsmAnd/res/values-uk/strings.xml +++ b/OsmAnd/res/values-uk/strings.xml @@ -1127,7 +1127,7 @@ Маршрутна точка " \n -\nДовго утримуйте, щоб побачити на мапі" +\nУтримуйте, щоб побачити на мапі" Запускати навігацію автоматично виділені Під-треки: %1$s @@ -1639,7 +1639,6 @@ Відкрити OSM-нотатку Відкрити заново OSM-нотатку До OSM-нотатки додано коментар - Вилучено OSM-нотатку Створено OSM-нотатку OSM-нотатка Створити нотатку @@ -3125,7 +3124,7 @@ Прогулянки, походи, біг Види громадського транспорту Корабель, веслування, вітрильний спорт - Літак, аероглайдинг + Літак, планер Геокодування Пряма лінія BRouter (автономний) @@ -3408,10 +3407,10 @@ Позиція значка в спокої Натиснення \"Застосувати\" видалить профілі назавжди. Основний профіль - Оберіть колір + Виберіть колір Усталені профілі OsmAnd не видалено, проте вимкнуто (на попередньому екрані) чи відпорядковано донизу. Редагувати профілі - \"Вид навігації\" визначає спосіб обчислення маршрутів. + \'Тип навігації\' визначає спосіб обчислення маршрутів. Зовнішній вигляд профілю Значок, колір та назва Редагувати список профілів @@ -3804,4 +3803,11 @@ Роликові ковзани Увімкнути для зміни масштабу мапи кнопками гучності пристрою. Масштабування кнопками гучності + Вкажіть довжину вашого автомобіля, для довгих транспортних засобів можуть застосовуватися деякі обмеження на маршрутах. + Видалити наступну точку призначення + Вкажіть назву пункту + Поточну точку призначення на маршруті буде видалено. Якщо це буде місце призначення, навігація припиниться. + Завантажити мапи Вікіпедії + Отримайте відомості про визначні місця у Вікіпедії. Це ваш кишеньковий посібник без мережі - просто ввімкніть втулок \"Вікіпедія\" і насолоджуйтесь статтями про об\'єкти навколо вас. + Моторолер \ No newline at end of file diff --git a/OsmAnd/res/values-zh-rCN/strings.xml b/OsmAnd/res/values-zh-rCN/strings.xml index 7f0187f5d9..b72be1f2c0 100644 --- a/OsmAnd/res/values-zh-rCN/strings.xml +++ b/OsmAnd/res/values-zh-rCN/strings.xml @@ -911,7 +911,6 @@ 打开 OSM 注解 重新打开 OSM 注解 已评论 OSM 注解 - 已删除 OSM 注解 已创建 OSM 注解 OSM 注解 创建注解 diff --git a/OsmAnd/res/values-zh-rTW/strings.xml b/OsmAnd/res/values-zh-rTW/strings.xml index bd7b2cf482..88c644aee8 100644 --- a/OsmAnd/res/values-zh-rTW/strings.xml +++ b/OsmAnd/res/values-zh-rTW/strings.xml @@ -1764,7 +1764,6 @@ 開啟 OSM 註解 重新開啟 OSM 註解 已評論 OSM 註解 - 已刪除 OSM 註解 建立 OSM 的註解 OSM 註解 建立註解 @@ -3810,4 +3809,10 @@ 目前路徑上的目的地點將會被刪除。如果其將為目的地,導航就會停止。 下載維基百科地圖 從維基百科取得關於興趣點的資訊。這是您的離線口袋指南 ── 只要啟用維基百科外掛程式並享受有關於您周圍景點的文章。 + 耐力賽摩托車 + 小型摩托車 + 輪椅 + 輪椅向前 + 卡丁車 + 已關閉的 OSM 註記 \ No newline at end of file diff --git a/OsmAnd/res/values/sizes.xml b/OsmAnd/res/values/sizes.xml index d3eb9bf16d..ebefb8942f 100644 --- a/OsmAnd/res/values/sizes.xml +++ b/OsmAnd/res/values/sizes.xml @@ -114,7 +114,7 @@ 120dp 9dp - 78dp + 92dp 8dp @@ -148,7 +148,7 @@ 25sp 20dp 16sp - 8sp + 12sp 1sp 3sp 2dp diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml index 64f9e464bd..5d733cf83f 100644 --- a/OsmAnd/res/values/strings.xml +++ b/OsmAnd/res/values/strings.xml @@ -11,6 +11,12 @@ Thx - Hardy --> + Closed OSM Note + Go-cart + Wheelchair forward + Wheelchair + Motor scooter + Enduro motorcycle Get information about points of interest from Wikipedia. It is your pocket offline guide - just enable Wikipedia plugin and enjoy articles about objects around you. Download Wikipedia maps The current destination point on the route will be deleted. If it will be the Destination, navigation will stop. @@ -1682,7 +1688,6 @@ Open OSM Note Reopened OSM Note Commented OSM Note - Deleted OSM Note Created OSM Note OSM Note Create note diff --git a/OsmAnd/src/net/osmand/plus/CurrentPositionHelper.java b/OsmAnd/src/net/osmand/plus/CurrentPositionHelper.java index 5fce920b91..a50a345aa3 100644 --- a/OsmAnd/src/net/osmand/plus/CurrentPositionHelper.java +++ b/OsmAnd/src/net/osmand/plus/CurrentPositionHelper.java @@ -237,6 +237,7 @@ public class CurrentPositionHelper { List complete = new ArrayList<>(); double minBuildingDistance = 0; if (res != null) { + GeocodingUtilities gu = new GeocodingUtilities(); for (GeocodingResult r : res) { BinaryMapIndexReader foundRepo = null; List rts = usedReaders; @@ -259,7 +260,7 @@ public class CurrentPositionHelper { } else if (foundRepo != null) { List justified = null; try { - justified = new GeocodingUtilities().justifyReverseGeocodingSearch(r, foundRepo, + justified = gu.justifyReverseGeocodingSearch(r, foundRepo, minBuildingDistance, result); } catch (IOException e) { log.error("Exception happened during reverse geocoding", e); @@ -277,6 +278,7 @@ public class CurrentPositionHelper { complete.add(r); } } + gu.filterDuplicateRegionResults(complete); } if (result.isCancelled()) { @@ -287,7 +289,7 @@ public class CurrentPositionHelper { }); return; } - Collections.sort(complete, GeocodingUtilities.DISTANCE_COMPARATOR); +// Collections.sort(complete, GeocodingUtilities.DISTANCE_COMPARATOR); // for(GeocodingResult rt : complete) { // System.out.println(rt.toString()); // } diff --git a/OsmAnd/src/net/osmand/plus/FavouritesDbHelper.java b/OsmAnd/src/net/osmand/plus/FavouritesDbHelper.java index f6bb1866e7..4b9dc43eb3 100644 --- a/OsmAnd/src/net/osmand/plus/FavouritesDbHelper.java +++ b/OsmAnd/src/net/osmand/plus/FavouritesDbHelper.java @@ -679,6 +679,16 @@ public class FavouritesDbHelper { return favoriteGroups; } + public boolean isGroupVisible(String name) { + String nameLowercase = name.toLowerCase(); + for (String groupName : flatGroups.keySet()) { + if (groupName.toLowerCase().equals(nameLowercase) || FavoriteGroup.getDisplayName(context, groupName).equals(name)) { + return flatGroups.get(groupName).isVisible(); + } + } + return false; + } + public boolean groupExists(String name) { String nameLowercase = name.toLowerCase(); for (String groupName : flatGroups.keySet()) { @@ -800,10 +810,12 @@ public class FavouritesDbHelper { public void editFavouriteGroup(FavoriteGroup group, String newName, int color, boolean visible) { if (color != 0 && group.color != color) { FavoriteGroup gr = flatGroups.get(group.name); - group.color = color; for (FavouritePoint p : gr.points) { - p.setColor(color); + if (p.getColor() == group.color) { + p.setColor(color); + } } + group.color = color; runSyncWithMarkers(gr); } if (group.visible != visible) { diff --git a/OsmAnd/src/net/osmand/plus/activities/SettingsGeneralActivity.java b/OsmAnd/src/net/osmand/plus/activities/SettingsGeneralActivity.java index 384678f7bc..aaf206ca06 100644 --- a/OsmAnd/src/net/osmand/plus/activities/SettingsGeneralActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/SettingsGeneralActivity.java @@ -280,7 +280,7 @@ public class SettingsGeneralActivity extends SettingsBaseActivity implements OnR "fi", "fr", "gl", - "he", + "iw", "hr", "hsb", "hu", diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/AmenityMenuBuilder.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/AmenityMenuBuilder.java index 66567bc76c..d627b4e6e6 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/AmenityMenuBuilder.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/AmenityMenuBuilder.java @@ -471,7 +471,7 @@ public class AmenityMenuBuilder extends MenuBuilder { } textPrefix = app.getString(R.string.poi_cuisine); vl = sb.toString(); - } else if (key.contains(Amenity.ROUTE)) { + } else if (key.contains(Amenity.ROUTE) || key.equals(Amenity.WIKIDATA)) { continue; } else { if (key.contains(Amenity.DESCRIPTION)) { @@ -784,12 +784,16 @@ public class AmenityMenuBuilder extends MenuBuilder { Map additionalInfo = amenity.getAdditionalInfo(); String imageValue = additionalInfo.get("image"); String mapillaryValue = additionalInfo.get("mapillary"); + String wikidataValue = additionalInfo.get("wikidata"); if (!Algorithms.isEmpty(imageValue)) { params.put("osm_image", imageValue); } if (!Algorithms.isEmpty(mapillaryValue)) { params.put("osm_mapillary_key", mapillaryValue); } + if (!Algorithms.isEmpty(wikidataValue)) { + params.put("wikidata_id", wikidataValue); + } return params; } diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/ImageCard.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/ImageCard.java index a821d8b3cf..94c045fa4d 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/ImageCard.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/ImageCard.java @@ -25,6 +25,7 @@ import net.osmand.plus.activities.MapActivity; import net.osmand.plus.mapcontextmenu.MenuBuilder; import net.osmand.plus.mapillary.MapillaryContributeCard; import net.osmand.plus.mapillary.MapillaryImageCard; +import net.osmand.plus.wikimedia.WikiImageHelper; import net.osmand.util.Algorithms; import org.json.JSONArray; @@ -437,6 +438,11 @@ public abstract class ImageCard extends AbstractCard { pms.put("lang", preferredLang); } if (this.params != null) { + String wikidataId = this.params.get("wikidata_id"); + if (wikidataId != null) { + this.params.remove("wikidata_id"); + WikiImageHelper.fillWikiMediaCards(mapActivity, wikidataId, result); + } pms.putAll(this.params); } String response = AndroidNetworkUtils.sendRequest(app, "https://osmand.net/api/cm_place", pms, diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/editors/FavoritePointEditorFragmentNew.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/editors/FavoritePointEditorFragmentNew.java index 2362252307..b3159922cf 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/editors/FavoritePointEditorFragmentNew.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/editors/FavoritePointEditorFragmentNew.java @@ -97,7 +97,7 @@ public class FavoritePointEditorFragmentNew extends PointEditorFragmentNew { } }); if (editor != null && editor.isNew()) { - ImageView toolbarAction = (ImageView) view.findViewById(R.id.toolbar_action); + ImageView toolbarAction = view.findViewById(R.id.toolbar_action); toolbarAction.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { @@ -460,30 +460,36 @@ public class FavoritePointEditorFragmentNew extends PointEditorFragmentNew { @Override public Set getCategories() { Set categories = new LinkedHashSet<>(); + Set categoriesHidden = new LinkedHashSet<>(); FavouritesDbHelper helper = getHelper(); if (helper != null && editor != null) { OsmandApplication app = getMyApplication(); - if (editor.isNew()) { - FavoriteGroup lastUsedGroup = helper.getGroup(getLastUsedGroup()); - if (lastUsedGroup != null && lastUsedGroup.isVisible()) { - categories.add(lastUsedGroup.getDisplayName(app)); - } - for (FavouritesDbHelper.FavoriteGroup fg : getHelper().getFavoriteGroups()) { - if (!fg.equals(lastUsedGroup) && fg.isVisible()) { - categories.add(fg.getDisplayName(app)); - } - } - } else { - for (FavoriteGroup fg : helper.getFavoriteGroups()) { + FavoriteGroup lastUsedGroup = helper.getGroup(getLastUsedGroup()); + if (lastUsedGroup != null) { + categories.add(lastUsedGroup.getDisplayName(app)); + } + for (FavouritesDbHelper.FavoriteGroup fg : helper.getFavoriteGroups()) { + if (!fg.equals(lastUsedGroup)) { if (fg.isVisible()) { categories.add(fg.getDisplayName(app)); + } else { + categoriesHidden.add(fg.getDisplayName(app)); } } } + categories.addAll(categoriesHidden); } return categories; } + @Override + public boolean isCategoryVisible(String name) { + if (getHelper() != null) { + return getHelper().isGroupVisible(name); + } + return true; + } + @Override public int getCategoryPointsCount(String category) { FavouritesDbHelper helper = getHelper(); @@ -498,6 +504,7 @@ public class FavoritePointEditorFragmentNew extends PointEditorFragmentNew { } @Override + @ColorInt public int getCategoryColor(String category) { FavouritesDbHelper helper = getHelper(); if (helper != null) { diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/editors/PointEditorFragmentNew.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/editors/PointEditorFragmentNew.java index 70697426ed..68ada0922b 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/editors/PointEditorFragmentNew.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/editors/PointEditorFragmentNew.java @@ -5,6 +5,7 @@ import android.app.Activity; import android.content.Context; import android.content.DialogInterface; import android.graphics.Rect; +import android.graphics.Typeface; import android.graphics.drawable.Drawable; import android.graphics.drawable.GradientDrawable; import android.os.Build; @@ -675,6 +676,7 @@ public abstract class PointEditorFragmentNew extends BaseOsmAndFragment { public void setCategory(String name, int color) { setSelectedItemWithScroll(name); + updateColorSelector(color, groupRecyclerView.getRootView()); } private void setSelectedItemWithScroll(String name) { @@ -732,6 +734,7 @@ public abstract class PointEditorFragmentNew extends BaseOsmAndFragment { public abstract String getToolbarTitle(); + @ColorInt public abstract int getCategoryColor(String category); public abstract int getCategoryPointsCount(String category); @@ -762,6 +765,12 @@ public abstract class PointEditorFragmentNew extends BaseOsmAndFragment { public abstract Set getCategories(); + protected boolean isCategoryVisible(String name) { + return true; + } + + ; + String getNameTextValue() { EditText nameEdit = view.findViewById(R.id.name_edit); return nameEdit.getText().toString().trim(); @@ -885,16 +894,13 @@ public abstract class PointEditorFragmentNew extends BaseOsmAndFragment { public void onClick(View view) { int previousSelectedPosition = getItemPosition(selectedItemName); selectedItemName = items.get(holder.getAdapterPosition()); + updateColorSelector(getCategoryColor(selectedItemName), groupRecyclerView.getRootView()); notifyItemChanged(holder.getAdapterPosition()); notifyItemChanged(previousSelectedPosition); } }); final String group = items.get(position); holder.groupName.setText(group); - int categoryColor = getCategoryColor(group); - int color = categoryColor == 0 ? getDefaultColor() : categoryColor; - holder.groupIcon.setImageDrawable(UiUtilities.tintDrawable( - AppCompatResources.getDrawable(app, R.drawable.ic_action_folder), color)); holder.pointsCounter.setText(String.valueOf(getCategoryPointsCount(group))); int strokeColor; int strokeWidth; @@ -913,6 +919,20 @@ public abstract class PointEditorFragmentNew extends BaseOsmAndFragment { rectContourDrawable.setStroke(AndroidUtils.dpToPx(app, strokeWidth), strokeColor); holder.groupButton.setImageDrawable(rectContourDrawable); } + int color; + int iconID; + if (!isCategoryVisible(group)) { + color = ContextCompat.getColor(app, R.color.text_color_secondary_light); + iconID = R.drawable.ic_action_hide; + holder.groupName.setTypeface(null, Typeface.ITALIC); + } else { + int categoryColor = getCategoryColor(group); + color = categoryColor == 0 ? getDefaultColor() : categoryColor; + iconID = R.drawable.ic_action_folder; + holder.groupName.setTypeface(null, Typeface.NORMAL); + } + holder.groupIcon.setImageDrawable(UiUtilities.tintDrawable( + AppCompatResources.getDrawable(app, iconID), color)); } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { AndroidUtils.setBackground(app, holder.groupButton, nightMode, R.drawable.ripple_solid_light_6dp, diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/editors/WptPtEditorFragmentNew.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/editors/WptPtEditorFragmentNew.java index e74539a06a..94ecff5478 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/editors/WptPtEditorFragmentNew.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/editors/WptPtEditorFragmentNew.java @@ -8,6 +8,7 @@ import android.os.AsyncTask; import android.os.Bundle; import android.view.View; +import androidx.annotation.ColorInt; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.DialogFragment; @@ -454,6 +455,7 @@ public class WptPtEditorFragmentNew extends PointEditorFragmentNew { } @Override + @ColorInt public int getCategoryColor(String category) { if (categoriesMap != null) { Integer color = categoriesMap.get(category); diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenu.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenu.java index fdc58e7831..586a301d45 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenu.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenu.java @@ -46,6 +46,7 @@ import net.osmand.plus.helpers.GpxUiHelper.OrderedLineDataSet; import net.osmand.plus.views.GPXLayer; import net.osmand.plus.views.mapwidgets.MapInfoWidgetsFactory; import net.osmand.plus.views.mapwidgets.MapInfoWidgetsFactory.TopToolbarController; +import net.osmand.util.MapUtils; import java.util.ArrayList; import java.util.Collections; @@ -312,18 +313,15 @@ public class TrackDetailsMenu { } } else { float distance = pos * dataSet.getDivX(); - double previousSplitDistance = 0; + double totalDistance = 0; WptPt previousPoint = null; for (int i = 0; i < segment.points.size(); i++) { WptPt currentPoint = segment.points.get(i); if (previousPoint != null) { - if (currentPoint.distance < previousPoint.distance) { - previousSplitDistance += previousPoint.distance; - } + totalDistance += MapUtils.getDistance(previousPoint.lat, previousPoint.lon, currentPoint.lat, currentPoint.lon); } - double totalDistance = previousSplitDistance + currentPoint.distance; - if (totalDistance >= distance) { - if (previousPoint != null) { + if (currentPoint.distance >= distance || Math.abs(totalDistance - distance) < 0.1) { + if (previousPoint != null && currentPoint.distance >= distance) { double percent = 1 - (totalDistance - distance) / (currentPoint.distance - previousPoint.distance); double dLat = (currentPoint.lat - previousPoint.lat) * percent; double dLon = (currentPoint.lon - previousPoint.lon) * percent; @@ -500,6 +498,9 @@ public class TrackDetailsMenu { } else { mapActivity.getMapLayers().getGpxLayer().setTrackChartPoints(trackChartPoints); } + if (location != null) { + mapActivity.refreshMap(); + } fitTrackOnMap(chart, location, forceFit); } diff --git a/OsmAnd/src/net/osmand/plus/myplaces/TrackSegmentFragment.java b/OsmAnd/src/net/osmand/plus/myplaces/TrackSegmentFragment.java index 8207d401ff..41343f0fa3 100644 --- a/OsmAnd/src/net/osmand/plus/myplaces/TrackSegmentFragment.java +++ b/OsmAnd/src/net/osmand/plus/myplaces/TrackSegmentFragment.java @@ -57,7 +57,6 @@ import net.osmand.plus.GpxSelectionHelper.GpxDisplayItemType; import net.osmand.plus.GpxSelectionHelper.SelectedGpxFile; import net.osmand.plus.OsmAndFormatter; import net.osmand.plus.OsmandApplication; -import net.osmand.plus.settings.backend.OsmandSettings; import net.osmand.plus.R; import net.osmand.plus.UiUtilities; import net.osmand.plus.activities.MapActivity; @@ -70,12 +69,14 @@ import net.osmand.plus.helpers.GpxUiHelper.GPXDataSetType; import net.osmand.plus.helpers.GpxUiHelper.OrderedLineDataSet; import net.osmand.plus.measurementtool.NewGpxData; import net.osmand.plus.myplaces.TrackBitmapDrawer.TrackBitmapDrawerListener; +import net.osmand.plus.settings.backend.OsmandSettings; import net.osmand.plus.views.controls.PagerSlidingTabStrip; import net.osmand.plus.views.controls.PagerSlidingTabStrip.CustomTabProvider; import net.osmand.plus.views.controls.WrapContentHeightViewPager; import net.osmand.plus.views.controls.WrapContentHeightViewPager.ViewAtPositionInterface; import net.osmand.plus.widgets.IconPopupMenu; import net.osmand.util.Algorithms; +import net.osmand.util.MapUtils; import java.io.File; import java.lang.ref.WeakReference; @@ -525,16 +526,14 @@ public class TrackSegmentFragment extends OsmAndListFragment implements TrackBit } } else { float distance = pos * dataSet.getDivX(); - double previousSplitDistance = 0; + double totalDistance = 0; for (int i = 0; i < segment.points.size(); i++) { WptPt currentPoint = segment.points.get(i); if (i != 0) { WptPt previousPoint = segment.points.get(i - 1); - if (currentPoint.distance < previousPoint.distance) { - previousSplitDistance += previousPoint.distance; - } + totalDistance += MapUtils.getDistance(previousPoint.lat, previousPoint.lon, currentPoint.lat, currentPoint.lon); } - if (previousSplitDistance + currentPoint.distance >= distance) { + if (currentPoint.distance >= distance || Math.abs(totalDistance - distance) < 0.1) { wpt = currentPoint; break; } diff --git a/OsmAnd/src/net/osmand/plus/osmedit/EditPOIMenuController.java b/OsmAnd/src/net/osmand/plus/osmedit/EditPOIMenuController.java index 2ef7632e19..47c2eb5200 100644 --- a/OsmAnd/src/net/osmand/plus/osmedit/EditPOIMenuController.java +++ b/OsmAnd/src/net/osmand/plus/osmedit/EditPOIMenuController.java @@ -94,7 +94,7 @@ public class EditPOIMenuController extends MenuController { } } else if (osmPoint.getGroup() == OsmPoint.Group.BUG) { if (osmPoint.getAction() == Action.DELETE) { - actionStr = mapActivity.getString(R.string.osm_edit_removed_note); + actionStr = mapActivity.getString(R.string.osm_edit_closed_note); } else if (osmPoint.getAction() == Action.MODIFY) { actionStr = mapActivity.getString(R.string.osm_edit_commented_note); } else if (osmPoint.getAction() == Action.REOPEN) { diff --git a/OsmAnd/src/net/osmand/plus/poi/PoiUIFilter.java b/OsmAnd/src/net/osmand/plus/poi/PoiUIFilter.java index 4b1471a396..6629228696 100644 --- a/OsmAnd/src/net/osmand/plus/poi/PoiUIFilter.java +++ b/OsmAnd/src/net/osmand/plus/poi/PoiUIFilter.java @@ -682,7 +682,8 @@ public class PoiUIFilter implements SearchPoiTypeFilter, Comparable if (subtype != null) { PoiCategory c = subtype.getCategory(); String typeName = subtype.getKeyName(); - if (!getAcceptedSubtypes(c).contains(typeName)) { + Set acceptedSubtypes = getAcceptedSubtypes(c); + if (acceptedSubtypes != null && !acceptedSubtypes.contains(typeName)) { LinkedHashSet typeNames = acceptedTypesOrigin.get(c); if (typeNames == null) { typeNames = new LinkedHashSet<>(); diff --git a/OsmAnd/src/net/osmand/plus/profiles/ProfileIcons.java b/OsmAnd/src/net/osmand/plus/profiles/ProfileIcons.java index 9bc0bb2441..8e41b2bce6 100644 --- a/OsmAnd/src/net/osmand/plus/profiles/ProfileIcons.java +++ b/OsmAnd/src/net/osmand/plus/profiles/ProfileIcons.java @@ -17,6 +17,8 @@ public enum ProfileIcons { BUS(R.drawable.ic_action_bus_dark, R.string.app_mode_bus, "ic_action_bus_dark"), SUBWAY(R.drawable.ic_action_subway, R.string.app_mode_subway, "ic_action_subway"), MOTORCYCLE(R.drawable.ic_action_motorcycle_dark, R.string.app_mode_motorcycle, "ic_action_motorcycle_dark"), + ENDURO_MOTORCYCLE(R.drawable.ic_action_enduro_motorcycle, R.string.app_mode_enduro_motorcycle, "ic_action_enduro_motorcycle"), + MOTOR_SCOOTER(R.drawable.ic_action_motor_scooter, R.string.app_mode_motor_scooter, "ic_action_motor_scooter"), BICYCLE(R.drawable.ic_action_bicycle_dark, R.string.app_mode_bicycle, "ic_action_bicycle_dark"), HORSE(R.drawable.ic_action_horse, R.string.app_mode_horse, "ic_action_horse"), PEDESTRIAN(R.drawable.ic_action_pedestrian_dark, R.string.app_mode_pedestrian, "ic_action_pedestrian_dark"), @@ -29,6 +31,8 @@ public enum ProfileIcons { MONOWHEEL(R.drawable.ic_action_monowheel, R.string.app_mode_monowheel, "ic_action_monowheel"), SCOOTER(R.drawable.ic_action_scooter, R.string.app_mode_scooter, "ic_action_scooter"), INLINE_SKATES(R.drawable.ic_action_inline_skates, R.string.app_mode_inline_skates, "ic_action_inline_skates"), + WHEELCHAIR(R.drawable.ic_action_wheelchair, R.string.app_mode_wheelchair, "ic_action_wheelchair"), + WHEELCHAIR_FORWARD(R.drawable.ic_action_wheelchair_forward, R.string.app_mode_wheelchair_forward, "ic_action_wheelchair_forward"), UFO(R.drawable.ic_action_ufo, R.string.app_mode_ufo, "ic_action_ufo"), OFFROAD(R.drawable.ic_action_offroad, R.string.app_mode_offroad, "ic_action_offroad"), CAMPERVAN(R.drawable.ic_action_campervan, R.string.app_mode_campervan, "ic_action_campervan"), @@ -38,6 +42,7 @@ public enum ProfileIcons { UTV(R.drawable.ic_action_ski_touring, R.string.app_mode_utv, "ic_action_ski_touring"), SKI_TOURING(R.drawable.ic_action_utv, R.string.app_mode_ski_touring, "ic_action_utv"), SNOWMOBILE(R.drawable.ic_action_snowmobile, R.string.app_mode_ski_snowmobile, "ic_action_snowmobile"), + GO_CART(R.drawable.ic_action_go_cart, R.string.app_mode_go_cart, "ic_action_go_cart"), OSM(R.drawable.ic_action_openstreetmap_logo, R.string.app_mode_osm, "ic_action_openstreetmap_logo"); @DrawableRes diff --git a/OsmAnd/src/net/osmand/plus/routing/RouteCalculationResult.java b/OsmAnd/src/net/osmand/plus/routing/RouteCalculationResult.java index 46ceaf70ea..e70752b7f1 100644 --- a/OsmAnd/src/net/osmand/plus/routing/RouteCalculationResult.java +++ b/OsmAnd/src/net/osmand/plus/routing/RouteCalculationResult.java @@ -140,9 +140,13 @@ public class RouteCalculationResult { OsmandApplication ctx, boolean leftSide, RoutingContext rctx, List waypoints, ApplicationMode mode) { if (rctx != null) { this.routingTime = rctx.routingTime; - this.visitedSegments = rctx.visitedSegments; - this.loadedTiles = rctx.loadedTiles; - this.calculateTime = (float) (((System.nanoTime() - rctx.timeToCalculate) / 1e6) / 1000f); + this.visitedSegments = rctx.getVisitedSegments(); + this.loadedTiles = rctx.getLoadedTiles(); + if (rctx.calculationProgress != null) { + this.calculateTime = (float) (rctx.calculationProgress.timeToCalculate / 1.0e9); + } else { + this.calculateTime = 0; + } } else { this.routingTime = 0; this.visitedSegments = 0; diff --git a/OsmAnd/src/net/osmand/plus/search/QuickSearchListAdapter.java b/OsmAnd/src/net/osmand/plus/search/QuickSearchListAdapter.java index 2650725c11..9251e555b0 100644 --- a/OsmAnd/src/net/osmand/plus/search/QuickSearchListAdapter.java +++ b/OsmAnd/src/net/osmand/plus/search/QuickSearchListAdapter.java @@ -473,7 +473,7 @@ public class QuickSearchListAdapter extends ArrayAdapter { ContextCompat.getColor(app, colorClosed)); int colorId = rs.isOpenedForTime(Calendar.getInstance()) ? colorOpen : colorClosed; timeLayout.setVisibility(View.VISIBLE); - timeIcon.setImageDrawable(app.getUIUtilities().getIcon(R.drawable.ic_action_time_16, colorId)); + timeIcon.setImageDrawable(app.getUIUtilities().getIcon(R.drawable.ic_action_opening_hour_16, colorId)); timeText.setText(openHours); } else { timeLayout.setVisibility(View.GONE); diff --git a/OsmAnd/src/net/osmand/plus/views/mapwidgets/RouteInfoWidgetsFactory.java b/OsmAnd/src/net/osmand/plus/views/mapwidgets/RouteInfoWidgetsFactory.java index 7ee0d1c4c6..06e5838c73 100644 --- a/OsmAnd/src/net/osmand/plus/views/mapwidgets/RouteInfoWidgetsFactory.java +++ b/OsmAnd/src/net/osmand/plus/views/mapwidgets/RouteInfoWidgetsFactory.java @@ -1252,6 +1252,7 @@ public class RouteInfoWidgetsFactory { private int imgId; private String cachedText; private String cachedBottomText; + private OsmandSettings.DrivingRegion cachedRegion; public AlarmWidget(final OsmandApplication app, MapActivity ma) { layout = ma.findViewById(R.id.map_alarm_warning); @@ -1366,7 +1367,7 @@ public class RouteInfoWidgetsFactory { icon.setImageResource(locimgId); } Resources res = layout.getContext().getResources(); - if (!Algorithms.objectEquals(text, cachedText)) { + if (!Algorithms.objectEquals(text, cachedText) || cachedRegion != region) { cachedText = text; widgetText.setText(cachedText); if (alarm.getType() == AlarmInfoType.SPEED_LIMIT && americanType && !isCanadianRegion) { @@ -1376,9 +1377,10 @@ public class RouteInfoWidgetsFactory { widgetText.setPadding(0, 0, 0, 0); } } - if (!Algorithms.objectEquals(bottomText, cachedBottomText)) { + if (!Algorithms.objectEquals(bottomText, cachedBottomText) || cachedRegion != region) { cachedBottomText = bottomText; widgetBottomText.setText(cachedBottomText); + cachedRegion = region; if (alarm.getType() == AlarmInfoType.SPEED_LIMIT && isCanadianRegion) { int bottomPadding = res.getDimensionPixelSize(R.dimen.map_button_margin); widgetBottomText.setPadding(0, 0, 0, bottomPadding); diff --git a/OsmAnd/src/net/osmand/plus/wikimedia/WikiImage.java b/OsmAnd/src/net/osmand/plus/wikimedia/WikiImage.java new file mode 100644 index 0000000000..d545b024e6 --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/wikimedia/WikiImage.java @@ -0,0 +1,28 @@ +package net.osmand.plus.wikimedia; + +public class WikiImage { + + private String imageName; + private String imageStubUrl; + private String imageHiResUrl; + + public WikiImage(String imageName, String imageStubUrl, + String imageHiResUrl) { + this.imageName = imageName; + this.imageStubUrl = imageStubUrl; + this.imageHiResUrl = imageHiResUrl; + } + + public String getImageName() { + return imageName; + } + + public String getImageStubUrl() { + return imageStubUrl; + } + + public String getImageHiResUrl() { + return imageHiResUrl; + } + +} diff --git a/OsmAnd/src/net/osmand/plus/wikimedia/WikiImageCard.java b/OsmAnd/src/net/osmand/plus/wikimedia/WikiImageCard.java new file mode 100644 index 0000000000..e423e3daa5 --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/wikimedia/WikiImageCard.java @@ -0,0 +1,40 @@ +package net.osmand.plus.wikimedia; + +import android.view.View; + +import net.osmand.plus.R; +import net.osmand.plus.activities.MapActivity; +import net.osmand.plus.mapcontextmenu.builders.cards.ImageCard; +import net.osmand.util.Algorithms; + +public class WikiImageCard extends ImageCard { + + public WikiImageCard(final MapActivity mapActivity, + final WikiImage wikiImage) { + super(mapActivity, null); + + if (topIconId == 0) { + topIconId = R.drawable.ic_logo_wikimedia; + } + + this.imageUrl = wikiImage.getImageStubUrl(); + this.title = wikiImage.getImageName(); + this.url = this.imageUrl; + + View.OnClickListener onClickListener = new View.OnClickListener() { + @Override + public void onClick(View v) { + openUrl(getMapActivity(), getMyApplication(), getTitle(), wikiImage.getImageHiResUrl(), + isExternalLink() || Algorithms.isEmpty(getImageHiresUrl()), + !Algorithms.isEmpty(getImageHiresUrl())); + } + }; + + if (!Algorithms.isEmpty(buttonText)) { + this.onButtonClickListener = onClickListener; + } else { + this.onClickListener = onClickListener; + } + } + +} diff --git a/OsmAnd/src/net/osmand/plus/wikimedia/WikiImageHelper.java b/OsmAnd/src/net/osmand/plus/wikimedia/WikiImageHelper.java new file mode 100644 index 0000000000..eded246941 --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/wikimedia/WikiImageHelper.java @@ -0,0 +1,126 @@ +package net.osmand.plus.wikimedia; + +import androidx.annotation.NonNull; + +import com.google.gson.Gson; +import com.google.gson.JsonSyntaxException; +import com.google.gson.annotations.Expose; +import com.google.gson.annotations.SerializedName; + +import net.osmand.PlatformUtil; +import net.osmand.osm.io.NetworkUtils; +import net.osmand.plus.activities.MapActivity; +import net.osmand.plus.mapcontextmenu.builders.cards.ImageCard; + +import org.apache.commons.codec.binary.Hex; +import org.apache.commons.codec.digest.DigestUtils; +import org.apache.commons.logging.Log; + +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.util.ArrayList; +import java.util.List; + +public class WikiImageHelper { + private static final String WIKIDATA_API_ENDPOINT = "https://www.wikidata.org/w/api.php"; + private static final String ACTION = "?action=wbgetclaims&property=P18&entity="; + private static final String FORMAT_JSON = "&format=json"; + private static final String IMAGE_BASE_URL = "https://upload.wikimedia.org/wikipedia/commons/"; + private static final String WIKIDATA_PREFIX = "Q"; + private static final int THUMB_SIZE = 500; + private static final Log LOG = PlatformUtil.getLog(WikiImageHelper.class); + + public static void fillWikiMediaCards(@NonNull MapActivity mapActivity, @NonNull String wikidata, + List images) { + if (wikidata.startsWith(WIKIDATA_PREFIX)) { + StringBuilder rawResponse = new StringBuilder(); + String url = WIKIDATA_API_ENDPOINT + ACTION + wikidata + FORMAT_JSON; + String error = NetworkUtils.sendGetRequest(url, null, rawResponse); + if (error == null) { + try { + Gson gson = new Gson(); + WikipediaResponse response = gson.fromJson(rawResponse.toString(), WikipediaResponse.class); + for (WikiImage img : getImageData(response)) { + images.add(new WikiImageCard(mapActivity, img)); + } + return; + } catch (JsonSyntaxException e) { + error = e.getLocalizedMessage(); + } + } + LOG.error(error); + } else { + LOG.error("Wrong WikiMedia ID"); + } + } + + private static List getImageData(WikipediaResponse response) { + List images = new ArrayList<>(); + for (P18 p18 : response.claims.p18) { + String imageFileName = p18.mainsnak.datavalue.value; + if (imageFileName != null) { + try { + String imageName = URLDecoder.decode(imageFileName, "UTF-8"); + imageFileName = imageName.replace(" ", "_"); + imageName = imageName.substring(0, imageName.lastIndexOf(".")); + String[] urlHashParts = getHash(imageFileName); + + String imageHiResUrl = IMAGE_BASE_URL + + urlHashParts[0] + "/" + urlHashParts[1] + "/" + + imageFileName; + String imageStubUrl = IMAGE_BASE_URL + "thumb/" + + urlHashParts[0] + "/" + urlHashParts[1] + "/" + + imageFileName + "/" + THUMB_SIZE + "px-" + + imageFileName; + images.add(new WikiImage(imageName, imageStubUrl, imageHiResUrl)); + + } catch (UnsupportedEncodingException e) { + LOG.error(e.getLocalizedMessage()); + } + } + } + return images; + } + + @NonNull + private static String[] getHash(@NonNull String s) { + String md5 = new String(Hex.encodeHex(DigestUtils.md5(s))); + return new String[]{md5.substring(0, 1), md5.substring(0, 2)}; + } + + private static class Claims { + @SerializedName("P18") + @Expose + private List p18 = null; + } + + private static class Datavalue { + @SerializedName("value") + @Expose + private String value; + @SerializedName("type") + @Expose + private String type; + } + + private static class Mainsnak { + @SerializedName("datavalue") + @Expose + private Datavalue datavalue; + @SerializedName("datatype") + @Expose + private String datatype; + } + + private static class P18 { + @SerializedName("mainsnak") + @Expose + private Mainsnak mainsnak; + } + + private static class WikipediaResponse { + @SerializedName("claims") + @Expose + private Claims claims; + } +} diff --git a/OsmAndCore-sample/src/net/osmand/core/samples/android/sample1/CurrentPositionHelper.java b/OsmAndCore-sample/src/net/osmand/core/samples/android/sample1/CurrentPositionHelper.java index 351f1891d6..e490925754 100644 --- a/OsmAndCore-sample/src/net/osmand/core/samples/android/sample1/CurrentPositionHelper.java +++ b/OsmAndCore-sample/src/net/osmand/core/samples/android/sample1/CurrentPositionHelper.java @@ -191,6 +191,7 @@ public class CurrentPositionHelper { private void justifyResult(List res, final ResultMatcher result) { List complete = new ArrayList<>(); double minBuildingDistance = 0; + GeocodingUtilities gu = new GeocodingUtilities(); if (res != null) { for (GeocodingResult r : res) { BinaryMapIndexReader foundRepo = null; @@ -208,7 +209,7 @@ public class CurrentPositionHelper { } else if (foundRepo != null) { List justified = null; try { - justified = new GeocodingUtilities().justifyReverseGeocodingSearch(r, foundRepo, + justified = gu.justifyReverseGeocodingSearch(r, foundRepo, minBuildingDistance, result); } catch (IOException e) { log.error("Exception happened during reverse geocoding", e); @@ -227,6 +228,7 @@ public class CurrentPositionHelper { complete.add(r); } } + gu.filterDuplicateRegionResults(complete); } if (result.isCancelled()) { @@ -237,7 +239,7 @@ public class CurrentPositionHelper { }); return; } - Collections.sort(complete, GeocodingUtilities.DISTANCE_COMPARATOR); + // Collections.sort(complete, GeocodingUtilities.DISTANCE_COMPARATOR); // for(GeocodingResult rt : complete) { // System.out.println(rt.toString()); // }