package uni.projecte.maps.overlays; import java.util.ArrayList; import java.util.Iterator; import uni.projecte.R; import uni.projecte.maps.UTMDisplay; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.Point; import android.location.Location; import android.os.Handler; import android.widget.TextView; import com.google.android.apps.mytracks.content.MyTracksProviderUtils; import com.google.android.apps.mytracks.content.MyTracksProviderUtils.LocationIterator; import com.google.android.apps.mytracks.content.Track; import com.google.android.maps.GeoPoint; import com.google.android.maps.MapView; import edu.ub.bio.biogeolib.CoordConverter; import edu.ub.bio.biogeolib.CoordinateLatLon; import edu.ub.bio.biogeolib.CoordinateUTM; public class MyTracksOverlay extends com.google.android.maps.Overlay { private MapView mapView; private MyTracksProviderUtils myTracksProviderUtils; private Context baseContext; private Track track; private Bitmap bubbleIconExt; private long trackId; private TextView infoUTM; private String infoPrec; private ArrayList<GeoPoint> trackPointsList; private boolean cache=true; private Bitmap lastMarker; private Handler handler; private GeoPoint lastPoint; private double elevation; public MyTracksOverlay(Context context,MapView mapView,long trackId,boolean cache,Handler handler){ this.mapView=mapView; this.baseContext=context; this.handler=handler; myTracksProviderUtils = MyTracksProviderUtils.Factory.get(baseContext); track=myTracksProviderUtils.getTrack(trackId); bubbleIconExt = BitmapFactory.decodeResource(baseContext.getResources(),R.drawable.blue_dot); lastMarker = BitmapFactory.decodeResource(context.getResources(), R.drawable.arrow_blue); this.trackId=trackId; this.cache=cache; if(cache) loadTrackPoints(); } private void getLastAltitude(){ // Location lastLoc=myTracksProviderUtils.getLastLocation(); //if(lastLoc!=null) elevation=lastLoc.getAltitude(); elevation=0.0; } public GeoPoint getLastLocation(){ return lastPoint; } private void loadTrackPoints(){ trackPointsList=new ArrayList<GeoPoint>(); LocationIterator it = myTracksProviderUtils.getTrackPointLocationIterator(trackId, -1,false, MyTracksProviderUtils.DEFAULT_LOCATION_FACTORY); getLastAltitude(); GeoPoint geo=null; try { while (it.hasNext()) { Location location = it.next(); geo=new GeoPoint((int)(location.getLatitude()*1E6),(int)(location.getLongitude()*1E6)); trackPointsList.add(geo); } if(geo!=null) lastPoint=geo; } finally{ it.close(); } } @Override public void draw(Canvas canvas, MapView mapView, boolean shadow) { if(!cache) loadTrackPoints(); Iterator<GeoPoint> it=trackPointsList.iterator(); Point screenCoords = new Point(); Point previousScreenCoords = new Point(); GeoPoint previousPoint = null; GeoPoint geo=null; Paint paint=new Paint(); paint.setColor(Color.argb(255, 87, 129, 252)); paint.setAntiAlias(true); paint.setStrokeWidth(4); paint.setStrokeCap(Paint.Cap.ROUND); paint.setStyle(Paint.Style.STROKE); if(it.hasNext()){ geo=it.next(); mapView.getProjection().toPixels(geo,screenCoords); /* First point */ canvas.drawBitmap(bubbleIconExt, screenCoords.x - bubbleIconExt.getWidth()/2, screenCoords.y - bubbleIconExt.getHeight(),null); previousPoint=geo; while (it.hasNext()) { geo= it.next(); mapView.getProjection().toPixels(geo,screenCoords); mapView.getProjection().toPixels(previousPoint, previousScreenCoords); canvas.drawLine(previousScreenCoords.x, previousScreenCoords.y, screenCoords.x, screenCoords.y, paint); previousPoint=geo; } /* Last Point */ if(previousScreenCoords!=null) { /* Last Point and Previous Point: calculating arrow Rotation */ float bearing=calculateBearing(screenCoords,previousScreenCoords); paint.setColor(Color.argb(255, 87, 129, 252)); Matrix matrix = new Matrix(); matrix.postRotate(360-bearing); Bitmap arrowR = Bitmap.createBitmap(lastMarker,0, 0, lastMarker.getWidth(), lastMarker.getHeight(), matrix, true); canvas.drawBitmap(arrowR, screenCoords.x -arrowR.getWidth()/2, screenCoords.y -arrowR.getHeight()/2, paint); if(!cache){ CoordinateUTM utm = CoordConverter.getInstance().toUTM(new CoordinateLatLon(geo.getLatitudeE6()/1E6,geo.getLongitudeE6()/1E6)); infoUTM.setText(UTMDisplay.convertUTM(utm.getShortForm(),infoPrec,false)); handler.sendEmptyMessage(0); lastPoint=geo; getLastAltitude(); } } } } private float calculateBearing(Point pBefore, Point pAfter) { float res = -(float) (Math.atan2(pAfter.y - pBefore.y, pAfter.x - pBefore.x) * 180 / 3.1416) + 90.0f; if (res < 0) return res + 360.0f; else return res; } public void setInfoUTM(TextView infoUTM) { this.infoUTM = infoUTM; } public void setInfoPrec(String infoPrec) { this.infoPrec = infoPrec; } public GeoPoint getLastPoint() { return lastPoint; } public double getElevation() { return elevation; } }