代码之家  ›  专栏  ›  技术社区  ›  Chmouel Boudjnah

获取两个地理点之间的距离

  •  104
  • Chmouel Boudjnah  · 技术社区  · 14 年前

    我想制作一个应用程序来检查用户最近的地方。我可以很容易地得到用户的位置,并且我已经有了一个具有纬度和经度的位置列表。

    根据当前用户位置,了解列表最近位置的最佳方法是什么?

    我在谷歌API中找不到任何东西。

    8 回复  |  直到 6 年前
        1
  •  142
  •   praveen    11 年前
    Location loc1 = new Location("");
    loc1.setLatitude(lat1);
    loc1.setLongitude(lon1);
    
    Location loc2 = new Location("");
    loc2.setLatitude(lat2);
    loc2.setLongitude(lon2);
    
    float distanceInMeters = loc1.distanceTo(loc2);
    

    参考文献: http://developer.android.com/reference/android/location/Location.html#distanceTo(android.location.Location)

        2
  •  121
  •   haseman    14 年前

    http://developer.android.com/reference/android/location/Location.html

    查看到或之间的距离。可以从纬度和经度创建位置对象:

    Location location = new Location("");
    location.setLatitude(lat);
    location.setLongitude(lon);
    
        3
  •  30
  •   Jack    11 年前

    近似解(基于等矩形投影) 快得多 (它只需要1个trig和1个平方根)。

    如果您的点距离不太远,则此近似值是相关的。它将 总是高估 与真正的哈弗斯线距离相比。例如,它将添加 不超过0.05382% 如果两点之间的delta纬度或经度 不超过4个十进制度数 .

    标准公式(Haversine)是 准确的 一个(也就是说,它适用于地球上任意两个经度/纬度),但是 慢得多 因为它需要7个三角和2个平方根。如果你的两个点相距不太远,绝对精度也不是最重要的,你可以使用这个近似版本(等矩形),因为它只使用一个三角函数和一个平方根,速度快得多。

    // Approximate Equirectangular -- works if (lat1,lon1) ~ (lat2,lon2)
    int R = 6371; // km
    double x = (lon2 - lon1) * Math.cos((lat1 + lat2) / 2);
    double y = (lat2 - lat1);
    double distance = Math.sqrt(x * x + y * y) * R;
    

    你可以 进一步优化 无论是:

    1. 去除平方根 如果你简单地把距离和另一个距离比较一下(在这种情况下,比较两个平方距离);
    2. 分解出余弦 如果您计算从一个主点到其他许多主点的距离(在这种情况下,您将以主点为中心进行等矩形投影,这样就可以为所有比较计算一次余弦)。

    有关详细信息,请参阅: http://www.movable-type.co.uk/scripts/latlong.html

    Haversine公式在以下几种语言中有一个很好的参考实现: http://www.codecodex.com/wiki/Calculate_Distance_Between_Two_Points_on_a_Globe

        4
  •  10
  •   Dwaine Bailey    14 年前

    您可以使用几种方法,但要确定哪种方法最好,我们首先需要知道您是否知道用户的高度以及其他点的高度?

    根据你所追求的准确程度,你可以研究哈弗斯汀或文森蒂的公式…

    这些页面详细说明了公式,并且,对于数学上不太倾向的公式,还提供了如何在脚本中实现它们的解释!

    哈弗斯林公式: http://www.movable-type.co.uk/scripts/latlong.html

    文森蒂配方: http://www.movable-type.co.uk/scripts/latlong-vincenty.html

    如果你对公式中的任何含义有任何疑问,请评论一下,我会尽力回答的:)

        5
  •  3
  •   Zar E Ahmer    9 年前

    有两种方法可以获得两个latlng之间的距离。

    public static void distrancebetween(double startatitude,double startingitude,double endLatitude,double endLatitude,float[]results)
    < /代码> 
    
    

    请参阅此

    第二个

    public float distanceto(location dest)as answered by praveen.

    看到这个

    其次

    public float distanceTo (Location dest) 正如Praveen的回答。

        6
  •  2
  •   Levon Petrosyan    6 年前
    private float getDistance(double lat1, double lon1, double lat2, double lon2) {
            float[] distance = new float[2];
            Location.distanceBetween(lat1, lon1, lat2, lon2, distance);
            return distance[0];
        }
    
        7
  •  0
  •   farhad.kargaran    8 年前

    只需使用以下方法,通过lat和long,以米为单位获得距离:

    private static double distance_in_meter(final double lat1, final double lon1, final double lat2, final double lon2) {
        double R = 6371000f; // Radius of the earth in m
        double dLat = (lat1 - lat2) * Math.PI / 180f;
        double dLon = (lon1 - lon2) * Math.PI / 180f;
        double a = Math.sin(dLat/2) * Math.sin(dLat/2) +
                Math.cos(latlong1.latitude * Math.PI / 180f) * Math.cos(latlong2.latitude * Math.PI / 180f) *
                        Math.sin(dLon/2) * Math.sin(dLon/2);
        double c = 2f * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
        double d = R * c;
        return d;
    }
    
        8
  •  0
  •   saigopi.me    6 年前

    你可以使用谷歌地图API获取距离和时间。 Google Map API

    只需将下载的json传递给这个方法,就可以得到两个latlong之间的实时距离和时间。

    void parseJSONForDurationAndKMS(String json) throws JSONException {
    
        Log.d(TAG, "called parseJSONForDurationAndKMS");
        JSONObject jsonObject = new JSONObject(json);
        String distance;
        String duration;
        distance = jsonObject.getJSONArray("routes").getJSONObject(0).getJSONArray("legs").getJSONObject(0).getJSONObject("distance").getString("text");
        duration = jsonObject.getJSONArray("routes").getJSONObject(0).getJSONArray("legs").getJSONObject(0).getJSONObject("duration").getString("text");
    
        Log.d(TAG, "distance : " + distance);
        Log.d(TAG, "duration : " + duration);
    
        distanceBWLats.setText("Distance : " + distance + "\n" + "Duration : " + duration);
    
    
    }