Есть ли способ рассчитать расстояние между двумя координатами на земле, а не по прямой? - PullRequest
1 голос
/ 26 сентября 2019

Я ищу способ найти расстояние между двумя координатами, которые также имеют данные высот, но я хочу, чтобы решение учитывало ТЕРРАУН между двумя точками, т.е. кратчайший путь между ними на земле, а не "по прямой".

Я нашел и использовал формулу Хаверсайна для расстояния «в воздухе», но, очевидно, он не даст реального расстояния, по которому человек будет идти по земле, так как между двумя точками может быть наклонэто идет вверх и / или вниз.Чем больше расстояние между точками, тем больше погрешность.

Я взял реальный файл .gpx и преобразовал его данные в формат JSON.это выглядит так:

let jsonSample = [{
    "lat": "57.107297", // 0
    "lon": "-5.334734",
    "ele": "957.00"
  }, // distance between 0 and 1 =>  169.1849929515954 m (as the crow flies) elevation difference: 50.210000000000036
  {
    "lat": "57.106590", // 1
    "lon": "-5.332253",
    "ele": "1007.21"
  }, // distance between 1 and 2 => 162.49601252670058  m (as the crow flies) elevation difference: 23.789999999999964
  {
    "lat": "57.105537", // 2 (summit)
    "lon": "-5.330387",
    "ele": "1031.00"
  }, // distance between 2 and 3 =>  32.45395539826568 m (as the crow flies) elevation difference: -13
  {
    "lat": "57.105284", // 3
    "lon": "-5.330119",
    "ele": "1018.00"
  }];

Реальные расстояния должны быть длиннее, чем рассчитанные по формуле Хаверсайна.Но как мне это вычислить?

1 Ответ

0 голосов
/ 26 сентября 2019

Погуглив "формулу haversine высоты" нашел меня этот Math.SE вопрос и ответ .

Прислушиваясь к комментариям, , пока расстояния, которые вы измеряете, не являютсяслишком далеко друг от друга , используя теорему Пифагора, вы можете добавить дельты высот в.

Я бы использовал Пифагор: пусть d расстояние Хаверсине и dh разница в высотах D=sqrt(d**2+dh**2).

Нечто подобное

function haversineWithAltitude(lat1, lon1, alt1, lat2, lon2, alt2) {
    const groundDistanceInMeters = haversine(lat1, lon1, lat2, lon2);
    const elevationDifferenceMeters = Math.abs(alt1 - alt2);
    return Math.sqrt(groundDistanceInMeters * groundDistanceInMeters + elevationDifferenceInMeters * elevationDifferenceInMeters);
}

должно, таким образом, работать - но, как уже было сказано, это неизбежно станет более неточным, если длина между точками будет очень большой.(В этот момент я, не будучи математиком и не зная лучше, сегментировал длинную ногу и вычислял каждое расстояние по кусочкам.)

...