package edu.mit.mitmobile2.maps; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Point; import android.graphics.Paint.Style; import android.graphics.drawable.Drawable; import android.location.Location; import com.google.android.maps.GeoPoint; import com.google.android.maps.MapController; import com.google.android.maps.MapView; import com.google.android.maps.MyLocationOverlay; import com.google.android.maps.Projection; import edu.mit.mitmobile2.R; public class FixedMyLocation extends MyLocationOverlay { private boolean bugged = false; private MapView mView; private Paint accuracyPaint; private Point center; private Point left; private Drawable drawable; private int width; private int height; public boolean snapFirstTime = false; private static final int WEST_LONGITUDE_E6 = -71132698; private static final int EAST_LONGITUDE_E6 = -71006698; private static final int NORTH_LATITUDE_E6 = 42407741; private static final int SOUTH_LATITUDE_E6 = 42331392; @Override public synchronized void onLocationChanged(Location location) { super.onLocationChanged(location); if (snapFirstTime) { MapController mc = mView.getController(); double lat = location.getLatitude() *1000000; double lon = location.getLongitude() *1000000; GeoPoint gp = new GeoPoint((int)lat,(int)lon); //http://mobile-dev.mit.edu/~sonya/martinez/api/map/?f=json //"initialExtent":{"xmin":-7917385.7999173,"ymin":5212844.4790179,"xmax":-7910779.1236727,"ymax":5217229.6735046,"spatialReference":{"wkid":102113}}, //"fullExtent":{"xmin":-7920689.3209994,"ymin":5211048.1193302,"xmax":-7907475.6025907,"ymax":5219026.0331923, //if ((lat>5212844)&&(lat<5217229)&&(lon>-7917385)&&(lon<-7910779)) { if ((lat>SOUTH_LATITUDE_E6)&&(lat<NORTH_LATITUDE_E6)&&(lon>WEST_LONGITUDE_E6)&&(lon<EAST_LONGITUDE_E6)) { mc.setZoom(MITMapActivity.INIT_ZOOM_ONE_ITEM); mc.setCenter(gp); } snapFirstTime = false; } } public FixedMyLocation(Context context, MapView mapView) { super(context, mapView); mView = mapView; } @Override protected void drawMyLocation(Canvas canvas, MapView mapView, Location lastFix, GeoPoint myLoc, long when) { if (!bugged) { try { super.drawMyLocation(canvas, mapView, lastFix, myLoc, when); } catch (Exception e) { bugged = true; } } if (bugged) { if (drawable == null) { accuracyPaint = new Paint(); accuracyPaint.setAntiAlias(true); accuracyPaint.setStrokeWidth(2.0f); drawable = mapView.getContext().getResources().getDrawable(R.drawable.mylocation); width = drawable.getIntrinsicWidth(); height = drawable.getIntrinsicHeight(); center = new Point(); left = new Point(); } Projection projection = mapView.getProjection(); double latitude = lastFix.getLatitude(); double longitude = lastFix.getLongitude(); float accuracy = lastFix.getAccuracy(); float[] result = new float[1]; Location.distanceBetween(latitude, longitude, latitude, longitude + 1, result); float longitudeLineDistance = result[0]; GeoPoint leftGeo = new GeoPoint((int)(latitude*1e6), (int)((longitude-accuracy/longitudeLineDistance)*1e6)); projection.toPixels(leftGeo, left); projection.toPixels(myLoc, center); int radius = center.x - left.x; accuracyPaint.setColor(0xff6666ff); accuracyPaint.setStyle(Style.STROKE); canvas.drawCircle(center.x, center.y, radius, accuracyPaint); accuracyPaint.setColor(0x186666ff); accuracyPaint.setStyle(Style.FILL); canvas.drawCircle(center.x, center.y, radius, accuracyPaint); drawable.setBounds(center.x - width / 2, center.y - height / 2, center.x + width / 2, center.y + height / 2); drawable.draw(canvas); } } }