How to calculate distance between two locations using their longitude and latitude value
Asked Answered
E

14

67

Here my code I used below code to calculate the distance between two location using their latitude and longitude. It is giving wrong distance. sometimes getting right and sometimes getting irrelevant distance.

We are getting lat1 and lng1 from database.

//getting lat2 and lng2 from GPS as below

public class MyLocationListener implements LocationListener {

  @Override
  public void onLocationChanged(Location loc)
  {
    lat2=loc.getLatitude();
    lng2=loc.getLongitude();
    String Text = "My current location is: " +"Latitud = "+ loc.getLatitude() +"Longitud = " + loc.getLongitude();

    //System.out.println("Lat & Lang form Loc"+Text);
    //Toast.makeText( getApplicationContext(), Text,Toast.LENGTH_SHORT).show();
  }

  @Override
  public void onProviderDisabled(String provider)
  {
  }

  @Override
  public void onProviderEnabled(String provider)
  {
  }

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


  //Calculating distance
  double earthRadius = 3958.75;

  double dLat = Math.toRadians(lat1-lat2);
  double dLng = Math.toRadians(lng1-lng2);
  double a = Math.sin(dLat/2) * Math.sin(dLat/2) +
             Math.cos(Math.toRadians(lat2)) * Math.cos(Math.toRadians(lat1)) *
             Math.sin(dLng/2) * Math.sin(dLng/2);
  double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
  double dist = earthRadius * c;
Eurypterid answered 8/8, 2011 at 12:13 Comment(1)
See stackoverflow.com/a/3694410Junker
G
98

As shown in the article at https://dzone.com/articles/distance-calculation-using-3 and in the answer at Calculating distance between two points, using latitude longitude?

private double distance(double lat1, double lon1, double lat2, double
lon2) {
    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;
    return (dist); }

private double deg2rad(double deg) {
    return (deg * Math.PI / 180.0); }

private double rad2deg(double rad) {
    return (rad * 180.0 / Math.PI); }
Grosberg answered 8/8, 2011 at 12:16 Comment(7)
can we add distance to latlng to get distance latngConias
It would be nice if you added Units in your answer.Altruistic
i think this output units is Miles, you can convert as kilometers with this formula-> km =mi / 0.62137;Cassity
why multiplying by 60 and 1.1515 --> dist = dist * 60 * 1.1515;Vivien
Best Distance calculation code found in whole stack. Very Accurate. But please explain each step. Can't understand what you did. Thanks for Share!.Cacoepy
This method returns in miles. Since given a in degrees (and fractions of a degree), then there are 60 nautical miles to one degree, hence 60 * 1.1515 statute miles, and 60 * 1.1515 * 1.609344 kilometres to one degree.Malinda
How can we convert kilometres to meters?Tallyman
S
103

There is an android.location.Location.distanceBetween() method which does this quite well.

Android Developer Docs: Location

Stelmach answered 8/8, 2011 at 12:18 Comment(3)
is this aerial or onroad distance ?Revelation
Probably AerialDeweydewhirst
Definitely aerial :)Hemicycle
G
98

As shown in the article at https://dzone.com/articles/distance-calculation-using-3 and in the answer at Calculating distance between two points, using latitude longitude?

private double distance(double lat1, double lon1, double lat2, double
lon2) {
    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;
    return (dist); }

private double deg2rad(double deg) {
    return (deg * Math.PI / 180.0); }

private double rad2deg(double rad) {
    return (rad * 180.0 / Math.PI); }
Grosberg answered 8/8, 2011 at 12:16 Comment(7)
can we add distance to latlng to get distance latngConias
It would be nice if you added Units in your answer.Altruistic
i think this output units is Miles, you can convert as kilometers with this formula-> km =mi / 0.62137;Cassity
why multiplying by 60 and 1.1515 --> dist = dist * 60 * 1.1515;Vivien
Best Distance calculation code found in whole stack. Very Accurate. But please explain each step. Can't understand what you did. Thanks for Share!.Cacoepy
This method returns in miles. Since given a in degrees (and fractions of a degree), then there are 60 nautical miles to one degree, hence 60 * 1.1515 statute miles, and 60 * 1.1515 * 1.609344 kilometres to one degree.Malinda
How can we convert kilometres to meters?Tallyman
O
86

Try this code.

startPoint.distanceTo(endPoint) function returns the distance between those places in meters.

Location startPoint=new Location("locationA");
startPoint.setLatitude(17.372102);
startPoint.setLongitude(78.484196);

Location endPoint=new Location("locationA");
endPoint.setLatitude(17.375775);
endPoint.setLongitude(78.469218);

double distance=startPoint.distanceTo(endPoint);

here "distance" is our required result in Meters. I hope it will work for android.

Overhand answered 30/11, 2013 at 5:35 Comment(4)
Heyy @Overhand I'm using "SphericalUtil.computeDistanceBetween(from, to);" to calculate distance, but the thing is, as i print that distance in log it gives me 13047. Also the actual distance is 15.6 km. So I'm confused that what are that numbers?? If its the distance then how does it calculates.Prepositive
SphericalUtil is this API provided by java/android? did you try with my solution?Overhand
Thankss a lot @Overhand I tried ur solution nd ur answer gives the exact location i want. Nd yes SphericalUtil api is provided by android.Prepositive
this one is the closest for coordinates in Turkey.Disconcerted
O
13

in build.gradle:

compile 'com.google.maps.android:android-maps-utils:0.4'

and then:

public static Double distanceBetween(LatLng point1, LatLng point2) {
    if (point1 == null || point2 == null) {
        return null;
    }

    return SphericalUtil.computeDistanceBetween(point1, point2);
}
Orography answered 7/8, 2015 at 9:45 Comment(2)
In this method distanceBetween() what is the LatLng? I tried to pass longitude latitude double value but it is not supporting.Diaconate
you need to put LatLng type not double which looks like LatLng[21.432432,76.543543]Sutphin
P
9

If you have two Location Objects Location loc1 and Location loc2 you do

float distance = loc1.distanceTo(loc2);

If you have longitude and latitude values you use the static distanceBetween() function

    float[] results = new float[1];
    Location.distanceBetween(startLatitude, startLongitude,
    endLatitude, endLongitude, results);
    float distance = results[0];
Pricefixing answered 11/2, 2016 at 14:49 Comment(0)
P
5

In Kotlin

private fun distanceInMeter(startLat: Double, startLon: Double, endLat: Double, endLon: Double): Float {
    var results = FloatArray(1)
    Location.distanceBetween(startLat,startLon,endLat,endLon,results)  
    return results[0]
}
Paganize answered 1/11, 2021 at 9:15 Comment(0)
W
3
private String getDistanceOnRoad(double latitude, double longitude,
        double prelatitute, double prelongitude) {
    String result_in_kms = "";
    String url = "http://maps.google.com/maps/api/directions/xml?origin="
            + latitude + "," + longitude + "&destination=" + prelatitute
            + "," + prelongitude + "&sensor=false&units=metric";
    String tag[] = { "text" };
    HttpResponse response = null;
    try {
        HttpClient httpClient = new DefaultHttpClient();
        HttpContext localContext = new BasicHttpContext();
        HttpPost httpPost = new HttpPost(url);
        response = httpClient.execute(httpPost, localContext);
        InputStream is = response.getEntity().getContent();
        DocumentBuilder builder = DocumentBuilderFactory.newInstance()
                .newDocumentBuilder();
        Document doc = builder.parse(is);
        if (doc != null) {
            NodeList nl;
            ArrayList args = new ArrayList();
            for (String s : tag) {
                nl = doc.getElementsByTagName(s);
                if (nl.getLength() > 0) {
                    Node node = nl.item(nl.getLength() - 1);
                    args.add(node.getTextContent());
                } else {
                    args.add(" - ");
                }
            }
            result_in_kms = String.format("%s", args.get(0));
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return result_in_kms;
}
Whitish answered 28/1, 2015 at 9:47 Comment(0)
M
2
private float distanceFrom_in_Km(float lat1, float lng1, float lat2, float lng2) {

     if (lat1== null || lng1== null || lat2== null || lng2== null) 
     {
                return null;
     }

 double earthRadius = 6371000; //meters
    double dLat = Math.toRadians(lat2-lat1);
    double dLng = Math.toRadians(lng2-lng1);
    double a = Math.sin(dLat/2) * Math.sin(dLat/2) +
               Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) *
               Math.sin(dLng/2) * Math.sin(dLng/2);
    double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
    float dist = (float) (earthRadius * c);

    return dist;
    }    
Multure answered 15/6, 2017 at 8:57 Comment(0)
M
2

Use the below method for calculating the distance of two different locations.

public double getKilometers(double lat1, double long1, double lat2, double long2) {
 double PI_RAD = Math.PI / 180.0;
 double phi1 = lat1 * PI_RAD;
 double phi2 = lat2 * PI_RAD;
 double lam1 = long1 * PI_RAD;
 double lam2 = long2 * PI_RAD;

return 6371.01 * acos(sin(phi1) * sin(phi2) + cos(phi1) * cos(phi2) * cos(lam2 - lam1));}
Mroz answered 17/6, 2019 at 6:38 Comment(0)
M
2

Try This below method code to get the distance in meter between two location, hope it will help for you

 public static double distance(LatLng start, LatLng end){
    try {
        Location location1 = new Location("locationA");
        location1.setLatitude(start.latitude);
        location1.setLongitude(start.longitude);
        Location location2 = new Location("locationB");
        location2.setLatitude(end.latitude);
        location2.setLongitude(end.longitude);
        double distance = location1.distanceTo(location2);
        return distance;
    } catch (Exception e) {

        e.printStackTrace();

    }
    return 0;
}
Marja answered 3/10, 2019 at 7:24 Comment(0)
A
1

Why are you writing the code for calculating the distance by yourself?

Check the api's in Location class

Alburga answered 8/8, 2011 at 12:19 Comment(1)
And why do you assume that he is developing an Android App?Charleen
N
1

You should use Haversine Distance Formulas

Haversine Formulas used to calculate the great distance between two points on the earth.

    public void haversine(double lat1, double lon1, double lat2, double lon2) {
 double Rad = 6372.8; //Earth's Radius In kilometers
            // TODO Auto-generated method stub
            double dLat = Math.toRadians(lat2 - lat1);
            double dLon = Math.toRadians(lon2 - lon1);
            lat1 = Math.toRadians(lat1);
            lat2 = Math.toRadians(lat2);
            double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.sin(dLon / 2) * Math.sin(dLon / 2) * Math.cos(lat1) * Math.cos(lat2);
            double c = 2 * Math.asin(Math.sqrt(a));
            haverdistanceKM = Rad * c;

        }
Nashoma answered 7/10, 2016 at 6:20 Comment(1)
I have tried but no difference from startPoint.distanceTo(endPoint)Centurion
L
1

Updated on October 8, 2021

Returns the approximate distance in meters between this location and the given location. Distance is defined using the WGS84 ellipsoid.

Java

  public float getDistance(double startLat,double startLang,double endLat,double endLang) {

        Location locStart = new Location("");
        locStart.setLatitude(startLat);
        locStart.setLongitude(startLang);

        Location locEnd = new Location("");
        locEnd.setLatitude(endLat);
        locEnd.setLongitude(endLang);

        return locStart.distanceTo(locEnd);
    }

Kotlin

 private fun getDistance(
        startLat: Double,
        startLang: Double,
        endLat: Double,
        endLang: Double
    ): Float {
        val locStart = Location("")
        locStart.latitude = startLat
        locStart.longitude = startLang
        val locEnd = Location("")
        locEnd.latitude = endLat
        locEnd.longitude = endLang
        return locStart.distanceTo(locEnd)
    }
Leadsman answered 8/10, 2021 at 6:45 Comment(0)
N
0

Returns the approximate distance in meters between this location and the given location. Distance is defined using the WGS84 ellipsoid.

public float getMesureLatLang(double lat,double lang) {

    Location loc1 = new Location("");
    loc1.setLatitude(getLatitute());// current latitude
    loc1.setLongitude(getLangitute());//current  Longitude

    Location loc2 = new Location("");
    loc2.setLatitude(lat);
    loc2.setLongitude(lang);

    return loc1.distanceTo(loc2);
 //  return distance(getLatitute(),getLangitute(),lat,lang);
}
Nephritis answered 8/5, 2018 at 13:30 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.