Как получить расстояние между двумя точками на основе их широты и долготы?

Я пытаюсь отобразить список на основе расстояния пользователя до каждого местоположения. Местоположения получены от Firebase как JSON.

Чтобы узнать местоположение пользователя, я использую:

    navigator.geolocation.getCurrentPosition(function(position) {
        var latitude = position.coords.latitude;
        var longitude = position.coords.longitude;

Знаете ли вы, как отсортировать этот JSON по расстоянию и перечислить его (имея несколько дочерних узлов)?

Благодарю.

1 ответ

Решение

У вас есть два способа получить расстояние между широтой / долготой и другой широтой / долготой:

- Использование Google 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;
    }

Это требует подключения к сети на мобильном телефоне, но оно обеспечивает расстояние вождения (точно так же, как вождение навигатора) ПЛЮС больше информации (например, длительность прибытия), в отличие от второго подхода, который обеспечивает прямое расстояние.

Для вышеперечисленного вам необходимо получить ключ Google Api. Более подробная информация здесь: Google Maps 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
}

Запустите один из вышеперечисленных для каждого элемента, и вы получите расстояние для каждого. Надеюсь, это поможет.

Другие вопросы по тегам