Jatinkumar Patel
Jatinkumar Patel

Reputation: 1104

Calculate distance using latitude and longitude using gps data .

I am trying to calculate distance using gps lat and long data.

but i can't get accurate result .when i am given a static data ,then distance formula work perfect ,

public class NWDService extends Service implements LocationListener {


    private LocationManager myLocationManager;
    private LocationProvider myLocationProvider;

    NotificationManager myNotificationManager;
    private long frequency;

    private Handler handler;
    private double total_distance = 0;
    private Location currentLocation;
    public void onLocationChanged(Location newLocation) {
        try {
            System.out.println("latitude current :"+currentLocation.getLatitude());
            System.out.println("latitude current :"+currentLocation.getLongitude());
            System.out.println("latitude new  :"+newLocation.getLatitude());
            System.out.println("latitude new  :"+newLocation.getLongitude());
            System.out.println("distance total :"+total_distance);
            //System.out.println(distance(22.306813, 73.180239,22.301016, 73.177986, 'K') + " Kilometers\n");
            double diff = 0.0;
            diff = currentLocation.getLatitude()- newLocation.getLatitude();
            System.out.println("difference ::"+diff);
            if(diff != 0){

                total_distance = total_distance + distance(currentLocation.getLatitude(), currentLocation.getLongitude(), newLocation.getLatitude(), newLocation.getLatitude(), 'K');
                //total_distance =  distance(22.307309,73.181098,23.030000,72.580000,'K');
                handler.post(new Runnable() {

                    @Override
                    public void run() {
                        Toast.makeText(getApplicationContext(),"Total Distance:"+total_distance, Toast.LENGTH_LONG).show();
                    }
                });
            }

            currentLocation = newLocation;
        } catch (Exception e) {
            currentLocation = newLocation;
            e.printStackTrace();
        }
    }
      private double distance(double lat1, double lon1, double lat2, double lon2, char unit) {
          double theta = lon1 - lon2;
          double dist = Math.sin(deg2rad(lat1)) * Math.sin(deg2rad(lat2)) + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * Math.cos(deg2rad(theta));
          dist = Math.acos(dist);
          dist = rad2deg(dist);
          dist = dist * 60 * 1.1515;
          if (unit == 'K') {
            dist = dist * 1.609344;
          } else if (unit == 'N') {
            dist = dist * 0.8684;
            }
          return (dist);
        }

        /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
        /*::  This function converts decimal degrees to radians             :*/
        /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
        private double deg2rad(double deg) {
          return (deg * Math.PI / 180.0);
        }

        /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
        /*::  This function converts radians to decimal degrees             :*/
        /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
        private double rad2deg(double rad) {
          return (rad * 180.0 / Math.PI);
        }

    private void myNotify(String text) {
        Notification notif = new Notification(R.drawable.ic_launcher, text, System
                .currentTimeMillis());
        PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
                new Intent(this, Home.class), 0);
        notif.setLatestEventInfo(this, "NotWhileDriving", text, contentIntent);
        // notif.defaults = Notification.DEFAULT_VIBRATE;
        myNotificationManager.notify((int) System.currentTimeMillis(), notif);
    }

    @Override
    public void onCreate() {
        super.onCreate();
        handler = new Handler();

        android.util.Log.d("NWD", "creating");

        myLocationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
        System.out.println("location manager:"+myLocationManager.getAllProviders());
        myLocationProvider = myLocationManager.getProvider("gps");
        myNotificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
        updatePreferences();
    }
    public void updatePreferences() {
        // sync local variables with preferences
        android.util.Log.d("NWD", "updating preferences");
        frequency = 10;
        // update the LM with the new frequency
        myLocationManager.removeUpdates(this);
        myLocationManager.requestLocationUpdates(myLocationProvider.getName(),frequency, 0, this);

    }
    @Override
    public void onDestroy() {
        super.onDestroy();
        android.util.Log.d("NWD", "destroying");
        myLocationManager.removeUpdates(this);
        myNotify("stopping");
    }

    @SuppressWarnings("deprecation")
    @Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);
        android.util.Log.d("NWD", "starting");

        currentLocation = myLocationManager
                .getLastKnownLocation(myLocationProvider.getName());

        myNotify("starting"); 
    }

    public void onProviderDisabled(String arg0) {

    }

    public void onProviderEnabled(String arg0) {

    }

    public void onStatusChanged(String arg0, int arg1, Bundle arg2) {

    }

    @Override
    public IBinder onBind(Intent arg0) {
        return null; // this is for heavy IPC, not used
    }
}

Please help me what is the problem in my code...

Upvotes: 2

Views: 3194

Answers (3)

user1732284
user1732284

Reputation: 11

You can use Google Distance matrix API for find accurate result of distance between two place.

for detail study you can refer from:

https://developers.google.com/maps/documentation/distancematrix/

Upvotes: 0

Philipp
Philipp

Reputation: 11814

First, I don't believe this code works on different parts of the earth. I don't see the WGS 84 parameters, only some magic numbers in

 dist = dist * 60 * 1.1515;
 if (unit == 'K') {
     dist = dist * 1.609344;
 } else if (unit == 'N') {
     dist = dist * 0.8684;
 }

Where did you get that from? Do you understand it?

Second, if your data is noisy, you're adding up this noise by summing totalDistance. You might want to check if the distance is above some threshold and only add totalDistance if the distance threshold is exceeded.

Upvotes: 0

flx
flx

Reputation: 14226

Just use Location.distanceTo(Location) it will give you a really distance between two different Locations.

Upvotes: 6

Related Questions