Питаюсь реализовать определение пройденного расстояния по формуле Гаверсинуса, есть страница с скриптом которая запускаеться по клику по кнопке, далее с помощью функции 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);
});