Home » Android » android gps position accuracy circle

android gps position accuracy circle

Posted by: admin June 15, 2020 Leave a comment

Questions:

I have a simple activity that gives the GPS position of the user. what i want to do is to draw a circle around the gps position. The circle gives an idea about the accuracy of GPS positioning. For example, if the accuracy is 6 meters, then the radius of the circle will be covering 6 meters . following is the code.

import java.util.List;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Point;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;

public class ShowMap extends MapActivity {

    private MapController mapController;
    private MapView mapView;
    private LocationManager locationManager;
    private GeoUpdateHandler geoUpdateHandler;

    @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.gps);
            mapView = (MapView) findViewById(R.id.mapview);
            mapView.setBuiltInZoomControls(true);
            mapView.setSatellite(true);
            mapController = mapView.getController();
            mapController.setZoom(14); // Zoom 1 is world view
            geoUpdateHandler = new GeoUpdateHandler();

            locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
            if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
                createGpsDisabledAlert();
            } else {
                locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,
                        0,geoUpdateHandler);

            }

       }
     private void createGpsDisabledAlert() {
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder
                    .setMessage(
                            "Your GPS is disabled! Would you like to enable it?")
                    .setCancelable(false).setPositiveButton("Enable GPS",
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int id) {
                                    showGpsOptions();
                                }
                            });
            builder.setNegativeButton("Do nothing",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            dialog.cancel();
                        }
                    });
            AlertDialog alert = builder.create();
            alert.show();
        }

     private void showGpsOptions() {
            Intent gpsOptionsIntent = new Intent(
                    android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            startActivity(gpsOptionsIntent);
        } 


     @Override
    protected boolean isRouteDisplayed() {
        // TODO Auto-generated method stub
        return false;
    }


    public class GeoUpdateHandler implements LocationListener {

        @Override
        public void onLocationChanged(Location location) {
            int lat = (int) (location.getLatitude() * 1E6);
            int lng = (int) (location.getLongitude() * 1E6);
            GeoPoint point = new GeoPoint(lat, lng);
            mapController.animateTo(point); //  mapController.setCenter(point);
             MapOverlay mapOverlay = new MapOverlay();
              mapOverlay.setPointToDraw(point);
              List<Overlay> listOfOverlays = mapView.getOverlays();
              listOfOverlays.clear();
              listOfOverlays.add(mapOverlay);

        }

        @Override
        public void onProviderDisabled(String provider) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onProviderEnabled(String provider) {
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
        }
    }


    class MapOverlay extends Overlay
    {
      private GeoPoint pointToDraw;

      public void setPointToDraw(GeoPoint point) {
        pointToDraw = point;
      }

      public GeoPoint getPointToDraw() {
        return pointToDraw;
      }

      @Override
      public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when) {
        super.draw(canvas, mapView, shadow);           

        // convert point to pixels
        Point screenPts = new Point();
        mapView.getProjection().toPixels(pointToDraw, screenPts);

        // add marker
        Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.pen);
        canvas.drawBitmap(bmp, screenPts.x, screenPts.y - 128, null);    
        return true;
      }




    }
    @Override
    public void onPause() {
        super.onPause();
        locationManager.removeUpdates(geoUpdateHandler);
    }

}
How to&Answers:

You should create your Paint objects beforehand, draw is executed a lot, so keep the allocation to minimal.

      @Override
  public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when) {
    super.draw(canvas, mapView, shadow);           

    // convert point to pixels
    Point screenPts = new Point();
    mapView.getProjection().toPixels(pointToDraw, screenPts);

    // add marker
    Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.pen);
    canvas.drawBitmap(bmp, screenPts.x, screenPts.y - 128, null);    
    return true;

    mPaintBorder = new Paint();
    mPaintBorder.setStyle(Paint.Style.STROKE);
    mPaintBorder.setAntiAlias(true);
    mPaintBorder.setColor(0xee4D2EFF);
    mPaintFill = new Paint();
    mPaintFill.setStyle(Paint.Style.FILL);
    mPaintFill.setColor(0x154D2EFF);

    double lat = pointToDraw.getLatitudeE6();
    int radius = (int) mapView.getProjection().metersToEquatorPixels(theGpsAccuracy);
    /** Draw the boundary of the circle */
    canvas.drawCircle(ScreenPts.x, ScreenPts.y, radius, mPaintBorder);
    /** Fill the circle with semitransparent color */
    canvas.drawCircle(ScreenPts.x, ScreenPts.y, radius, mPaintFill);
  }

Answer:

You could also, if your working with a GoogleMap object, add a circle to represent accuracy like this.

         CircleOptions co = new CircleOptions();
            co.center(latlngpoint);
            co.radius(accuracy_in_meters);
            co.fillColor(fillColor);
            co.strokeColor(strokeColor);
            co.strokeWidth(4.0f);
         map.addCircle(co);