Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

android gps position accuracy circle

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);
    }

}
like image 867
kzs Avatar asked Jun 13 '11 08:06

kzs


People also ask

How do I fix an inaccurate GPS on my Android?

Go to Settings and look for the option named Location and ensure that your location services are ON. Now the first option under Location should be Mode, tap on it and set it to High accuracy. This uses your GPS as well as your Wi-Fi and mobile networks to estimate your location.

Can you calibrate GPS on Android?

Calibrate Android GPSReturn to the Google Maps app. Hold the device right-side up, then move it in a figure-8 motion a few times. The calibration is complete when the beam becomes narrower and points in an accurate direction.

How accurate is GPS positioning?

The government provides the GPS signal in space with a global average user range rate error (URRE) of ≤0.006 m/sec over any 3-second interval, with 95% probability.


2 Answers

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);
like image 149
Jakob Avatar answered Sep 19 '22 10:09

Jakob


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);
  }
like image 25
dzsonni Avatar answered Sep 22 '22 10:09

dzsonni