如何根据纬度和经度获得两个位置之间的距离?

fea*_*res 1 javascript sorting json react-native react-native-listview

我正在尝试根据用户到每个位置的距离显示一个列表。这些位置以 JSON 的形式从 Firebase 接收。

要获取用户位置,我正在使用:

    navigator.geolocation.getCurrentPosition(function(position) {
        var latitude = position.coords.latitude;
        var longitude = position.coords.longitude;
Run Code Online (Sandbox Code Playgroud)

你知道一种按距离对这个 JSON 进行排序并列出它(有多个子节点)的方法吗?

谢谢。

Kha*_*laf 8

您有两种方法可以获取纬度/经度与其他纬度/经度之间的距离:

- 使用谷歌 API

    function getDistanceOneToOne(lat1, lng1, lat2, lng2)
    {
       const Location1Str = lat1 + "," + lng1;
       const Location2Str = lat2 + "," + lng2;

       let ApiURL = "https://maps.googleapis.com/maps/api/distancematrix/json?";

       let params = `origins=${Location1Str}&destinations=${Location2Str}&key=${GOOGLE_API_KEY}`; // you need to get a key
       let finalApiURL = `${ApiURL}${encodeURI(params)}`;

       let fetchResult =  await fetch(finalApiURL); // call API
       let Result =  await fetchResult.json(); // extract json

       return Result.rows[0].elements[0].distance;
    }
Run Code Online (Sandbox Code Playgroud)

这要求在移动网络连接,但它提供的驱动距离(完全一样的驱动导航器)PLUS的详细信息(例如,持续时间到达),不像其提供的直线距离的第二种方法。

对于上述情况,您需要获取 Google Api Key。更多信息:谷歌地图 Api

- 使用纯数学

这发生在设备本地,它提供两个纬度/经度之间的直线距离。

function distance(lat1, lon1, lat2, lon2, unit) {
    var radlat1 = Math.PI * lat1/180
    var radlat2 = Math.PI * lat2/180
    var theta = lon1-lon2
    var radtheta = Math.PI * theta/180
    var dist = Math.sin(radlat1) * Math.sin(radlat2) + Math.cos(radlat1) * Math.cos(radlat2) * Math.cos(radtheta);
    dist = Math.acos(dist)
    dist = dist * 180/Math.PI
    dist = dist * 60 * 1.1515
    if (unit=="K") { dist = dist * 1.609344 }
    if (unit=="M") { dist = dist * 0.8684 }
    return dist
}
Run Code Online (Sandbox Code Playgroud)

为每个项目运行上述之一,您将获得每个项目的距离。希望有帮助。