如何使用它们的经度和纬度值计算两个位置之间的距离

Posted

技术标签:

【中文标题】如何使用它们的经度和纬度值计算两个位置之间的距离【英文标题】:How to calculate distance between two locations using their longitude and latitude value 【发布时间】:2011-10-22 08:29:39 【问题描述】:

这是我的代码,我使用下面的代码来计算两个位置之间的距离,使用它们的纬度和经度。它给出了错误的距离。有时会变得正确,有时会变得无关紧要。

我们正在从数据库中获取 lat1 和 lng1。

//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;

【问题讨论】:

【参考方案1】:

有一个android.location.Location.distanceBetween() 方法可以很好地做到这一点。

Android Developer Docs: Location

【讨论】:

这是空中距离还是公路距离? 可能是空中 绝对是空中的 :)【参考方案2】:

此处以英里 (mi) 为单位计算距离

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

【讨论】:

我们可以将距离添加到 latlng 以获得距离 latng 如果您在答案中添加单位会很好。 我认为这个输出单位是英里,你可以用这个公式换算成公里-> km =mi / 0.62137; 为什么要乘以 60 和 1.1515 --> dist = dist * 60 * 1.1515; 在整个堆栈中找到的最佳距离计算代码。非常精准。但请解释每一步。无法理解你做了什么。感谢分享!。【参考方案3】:

试试这个代码。

startPoint.distanceTo(endPoint) 函数以米为单位返回这些地点之间的距离。

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

这里“距离”是我们要求的结果。我希望它适用于android。

【讨论】:

嘿@sandeepmaaram 我正在使用“SphericalUtil.computeDistanceBetween(from, to);”计算距离,但问题是,当我在日志中打印该距离时,它给了我 13047。实际距离也是 15.6 公里。所以我很困惑,那是什么数字?如果是距离,那么它是如何计算的。 SphericalUtil 这个API是java/android提供的吗?你试过我的解决方案了吗? 非常感谢@sandeepmaaram 我尝试了你的解决方案,你的答案给出了我想要的确切位置。 Nd 是 SphericalUtil api 由 android 提供。【参考方案4】:

在 build.gradle 中:

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

然后:

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

    return SphericalUtil.computeDistanceBetween(point1, point2);

【讨论】:

在这个方法中 distanceBetween() 什么是 LatLng?我尝试传递经度纬度双精度值,但不支持。 你需要把 LatLng 类型不是 double 看起来像 LatLng[21.432432,76.543543]【参考方案5】:

如果您有两个位置对象 Location loc1Location loc2,则可以

float distance = loc1.distanceTo(loc2);

如果您有经度和纬度值,则使用静态 distanceBetween() 函数

    float[] results = new float[1];
    Location.distanceBetween(startLatitude, startLongitude,
    endLatitude, endLongitude, results);
    float distance = results[0];

【讨论】:

【参考方案6】:
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;

【讨论】:

【参考方案7】:

获取经纬度的公里数

public static float getKmFromLatLong(float lat1, float lng1, float lat2, float lng2)
            Location loc1 = new Location("");
            loc1.setLatitude(lat1);
            loc1.setLongitude(lng1);
            Location loc2 = new Location("");
            loc2.setLatitude(lat2);
            loc2.setLongitude(lng2);
            float distanceInMeters = loc1.distanceTo(loc2);
            return distanceInMeters/1000;
        

【讨论】:

【参考方案8】:

使用以下方法计算两个不同位置的距离。

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

【讨论】:

【参考方案9】:

你为什么要编写自己计算距离的代码?

检查Location类中的api

【讨论】:

你为什么认为他正在开发一个Android应用程序?【参考方案10】:

你应该使用Haversine距离公式

Haversine 公式用于计算地球上两点之间的最远距离。

    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;

        

【讨论】:

【参考方案11】:
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;
        

【讨论】:

【参考方案12】:

试试下面这个方法代码来获取两个位置之间的米距离,希望对你有帮助

 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;

【讨论】:

【参考方案13】:

2021 年 10 月 8 日更新

返回此位置与给定位置之间的近似distance(以米为单位)。距离是使用 WGS84 椭球定义的。

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

科特林

 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)
    

【讨论】:

【参考方案14】:

返回此位置与给定位置之间的近似distance(以米为单位)。距离使用 WGS84 椭球定义。

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

【讨论】:

【参考方案15】:

在 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]

【讨论】:

以上是关于如何使用它们的经度和纬度值计算两个位置之间的距离的主要内容,如果未能解决你的问题,请参考以下文章

如何计算两个经纬度距离之间的时差

两个经纬度算距离公式 方法是啥

使用距离和纬度和经度计算位置

给定两个区域的经度和纬度,如何找到它们之间的距离(以米为单位)。如何在 SQL 中查询..?

从纬度,经度转换为x,y

如何计算两个经纬度之间的距离[重复]