Первое что пришло в голову использовать какие нибудь api для работы с геолокацией типа
такого. Далее получать текущие координаты
Geolocation.getCurrentPosition()
. Запрашивать их например каждую секунду, далее я не помню, но нужно поискать есть формула определения расстояния между двумя точками. Ну и в конечном итоге , пройденное_растояние += расстояние_между_двумя_точками(предыдущие_координаты, текущие_координаты);
Крч я с этим не работал, но если подумать можно что то придумать.
P.S. Когда то была необходимость определять расстояние между двумя точками, я написал функцию на C# думаю сложности не возникнет переписать на javascript. Но там расстоянием как правило было сотни киллометров, поэтому супер точность не была важна.
Моя функция (C#)static public double GPSTracker(Point pnt1, Point pnt2)
{
//pnt1, pnt2 - точки между которыми вычисляются расстояния
// rad - радиус сферы (Земли), num - количество знаков после запятой
//Отладка по входным данным (77.1539, 120.398) (77.1804,129.55) return dist 225883 angle 84.7925159033
//x - широта,y - долгота
int rad = 6372795;
double lat1, lat2, long1, long2;
//получение координат точек в радианах
lat1 = pnt1.X * Math.PI / 180;
long1 = pnt1.Y * Math.PI / 180;
lat2 = pnt2.X * Math.PI / 180;
long2 = pnt2.Y * Math.PI / 180;
//косинусы и синусы широт и разниц долгот
double cl1 = Math.Cos(lat1);
double cl2 = Math.Cos(lat2);
double sl1 = Math.Sin(lat1);
double sl2 = Math.Sin(lat2);
double delta = long2 - long1;
double cdelta = Math.Cos(delta);
double sdelta = Math.Sin(delta);
//вычисления длины большого круга
double y = Math.Sqrt(Math.Pow(cl2 * sdelta, 2) + Math.Pow(cl1 * sl2 - sl1 * cl2 * cdelta, 2));
double x = sl1 * sl2 + cl1 * cl2 * cdelta;
double ad = Math.Atan2(y, x);
double dist = ad * rad;
//вычисление начального азимута
x = (cl1 * sl2) - (sl1 * cl2 * cdelta);
y = sdelta * cl2;
double z = (Math.Atan(-y / x)) * 180 / Math.PI;
if (x < 0)
z = z + 180;
double z2 = (z + 180) % 360 - 180;
z2 = -z2 * Math.PI / 180;
double anglerad2 = z2 - ((2 * Math.PI) * Math.Floor((z2 / (2 * Math.PI))));
double angledeg = (anglerad2 * 180) / Math.PI;
//возврат значений длины большого круга и начального азимута
//return dist, angledeg
return dist;//метров
}