package cgeo.geocaching.maps.mapsforge.v6.layers; import cgeo.geocaching.CgeoApplication; import cgeo.geocaching.location.Geopoint; import cgeo.geocaching.maps.routing.Routing; import android.content.Context; import android.location.Location; import android.support.v4.util.Pair; import android.util.DisplayMetrics; import android.view.WindowManager; import java.util.ArrayList; import org.mapsforge.core.graphics.Canvas; import org.mapsforge.core.graphics.Paint; import org.mapsforge.core.graphics.Style; import org.mapsforge.core.model.BoundingBox; import org.mapsforge.core.model.Point; import org.mapsforge.core.util.MercatorProjection; import org.mapsforge.map.android.graphics.AndroidGraphicFactory; import org.mapsforge.map.layer.Layer; public class NavigationLayer extends Layer { private Geopoint currentCoords; private Geopoint destinationCoords; private final float width; private Paint line = null; public NavigationLayer(final Geopoint coords) { this.destinationCoords = coords; final DisplayMetrics metrics = new DisplayMetrics(); final WindowManager windowManager = (WindowManager) CgeoApplication.getInstance().getSystemService(Context.WINDOW_SERVICE); windowManager.getDefaultDisplay().getMetrics(metrics); width = 8f * metrics.density; } public void setDestination(final Geopoint coords) { destinationCoords = coords; } public void setCoordinates(final Location coordinatesIn) { currentCoords = new Geopoint(coordinatesIn); } @Override public void draw(final BoundingBox boundingBox, final byte zoomLevel, final Canvas canvas, final Point topLeftPoint) { if (destinationCoords == null || currentCoords == null) { return; } if (line == null) { line = AndroidGraphicFactory.INSTANCE.createPaint(); line.setStrokeWidth(width); line.setStyle(Style.STROKE); line.setColor(0xD0EB391E); } final long mapSize = MercatorProjection.getMapSize(zoomLevel, this.displayModel.getTileSize()); final Geopoint[] routingPoints = Routing.getTrack(currentCoords, destinationCoords); final ArrayList<Pair<Integer, Integer>> pixelPoints = new ArrayList<>(routingPoints.length); for (final Geopoint geopoint : routingPoints) { pixelPoints.add(translateToPixels(mapSize, topLeftPoint, geopoint)); } // paint path segments for (int i = 1; i < pixelPoints.size(); i++) { final Pair<Integer, Integer> source = pixelPoints.get(i - 1); final Pair<Integer, Integer> destination = pixelPoints.get(i); canvas.drawLine(source.first, source.second, destination.first, destination.second, line); } } private static Pair<Integer, Integer> translateToPixels(final long mapSize, final Point topLeftPoint, final Geopoint coords) { final int posX = (int) (MercatorProjection.longitudeToPixelX(coords.getLongitude(), mapSize) - topLeftPoint.x); final int posY = (int) (MercatorProjection.latitudeToPixelY(coords.getLatitude(), mapSize) - topLeftPoint.y); return new Pair<>(posX, posY); } }