primitiv
@primitiv
Веб программист

Как определить расстояние по долготе и широте?

Питаюсь реализовать определение пройденного расстояния по формуле Гаверсинуса, есть страница с скриптом которая запускаеться по клику по кнопке, далее с помощью функции setInterval каждые 5 секунд делаю запрос к геолакации, как бы я не изменял алгоритм данные не расчитиваються, ниже я напишу сам код с комментариями для понимания того что я питаюсь реализовать, помогите пожалуйста уже три дня на это потратил
var bulean = true // используется для остановки скрипта
var schirota // текущая широта (конечная точка)
var dolgota // текущая долгота (конечная точка)
var stSchirota // широта начальная точка
var stDolgota // долгота начальная точка
var visota // текущая высота
var visotaSt = 0 // начальная высота
var st = true // используется для начального присвоения 
var kilometr = 0 // общее количество пройденного пути 
$("body").on("click", ".button_start", function () { //делегирую

    //определение пройденный путь и высоту подъёма
    setInterval(function () { 

        if (bulean) { //если true расчёты должны идти

            var cord = new Promise(function (resolve, reject) { //получаю широту, долготу и высоту
                navigator.geolocation.getCurrentPosition(function (location) {
                    schirota = location.coords.latitude;
                    dolgota = location.coords.longitude;
                    visota = location.coords.altitude; 
                    resolve(schirota, dolgota, visota) //возвращаю актуальные данные
                });
            })

            cord.then(function () { // когда отработает промис

                if (st) { /*если это первый проход то присваиваю начальным точкам текущие координаты,
при следующих проходах эта ветвь не должна отрабативать */
                    stDolgota = dolgota
                    stSchirota = schirota
                }
                //определение пройденого пути
                var radius_earth = 6371; // Радиус Земли
                var lat_1 = deg2rad(stSchirota), //начальная широта для расчёта
                    lon_1 = deg2rad(stDolgota), //начальная долгота для расчёта
                    lat_2 = deg2rad(schirota), //конечная широта для расчёта
                    lon_2 = deg2rad(dolgota); //конечная долгота для расчёта
                    // собственно сама формула Гаверсинуса
                var d = 2 * radius_earth * Math.asin(Math.sqrt(Math.sin((lat_2 - lat_1) / 2) ** 2 + Math.cos(lat_1) * Math.cos(lat_2) * Math.sin((lon_2 - lon_1) / 2) ** 2));
                /* проверяю не равны ли начальные и конечные точки
если равны то значить пользователь не сдвинулся с места */
                if(stSchirota+stDolgota != schirota+dolgota){
                    kilometr = Number(kilometr) + Number(d) //плюсуем новый отрезок расстояния с общим
                    $("#metr").html(kilometr + ' км'); 
/* если пользователь перемещается то прошлые текущие координаты присваиваються 
переменным начальных расчётных координат */
                    stDolgota = dolgota
                    stSchirota = schirota
                }
                
                //определение высоти подъёма
                if (st) { // если это первый проход то присваиваю начальную высоту подъёма
                    visotaSt = visota
                    st = false //присваиваю false чтобы более не было начальных проходов
                }
                if (visotaSt < visota) { /* проверяю, если текущая высота больше чем начальная высота 
установленная первым проходом то с текущего вычитаю начальную и получаю высоту подъёма */
                    $("#visota").html((Number(visotaSt) - Number(visota)) + ' м');
                }

            })
        }
    }, 5000);
});
  • Вопрос задан
  • 156 просмотров
Пригласить эксперта
Ответы на вопрос 1
@serhiops
Python/JavaScript/C++
Судя по тому, как вы это все выщитываете, вам лучше воспользовать готовым решением https://github.com/njj/haversine
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы