3

Я получил два столбца со значениями широты и долготы. Мне нужно рассчитать расстояние между точками в каждом ряду. Я пытаюсь использовать формулу haversine, как показано здесь:

расчет haversine

Это так называемый расчет "большого круга". Мне нужно выполнить этот расчет на огромное количество координат.

Данные выглядят так:

  |        A        B    C    D    E   F    G
--|-------------------------------------------
0 |      LAT      LON rLAT dLAT dLON   a DIST
1 | 52.39964 13.04729  ...  ...  ... ...     
2 | 52.39985 13.04802  ...  ...  ... ...  ???
3 | 52.40116 13.04744  ...  ...  ... ...  ???
4 | 52.40147 13.04722  ...  ...  ... ...  ???
5 | 52.40163 13.04685  ...  ...  ... ...  ???
6 |      ...      ...  ...  ...  ... ...  ...

Теперь я попробовал следующее для поля G2 в LibreOffice:

C2=RADIANS(A2)
D2=RADIANS(A2-A1)
E2=RADIANS(B2-B1)
F2=SIN(D2/2)*SIN(D2/2)+SIN(E2/2)*SIN(E2/2)*COS(C1)*COS(C2)
G2=2*ATAN2(SQRT(F2), SQRT(1-F2))*6371

Результат для G2 - 20015 что довольно ... неправильно.

Как рассчитать расстояние между двумя точками, указанными по широте и долготе в Microsoft Excel или LibreOffice Calc? Что не так с моей формулой?

4 ответа4

5

Как обнаружил здесь BrianAdkins, эта формула Excel для вычисления расстояния между двумя точками широты / долготы работает для меня как в LibreOffice Calc, так и в Microsoft Excel 2013:

=ACOS(COS(RADIANS(90-A1))*COS(RADIANS(90-A2))+SIN(RADIANS(90-A1))*SIN(RADIANS(90-A2))*COS(RADIANS(B1-B2)))*6371

Результат в километрах, для небольших расстояний я использовал *1000 чтобы отобразить расстояние в метрах.

  |        A        B      C
--|--------------------------
0 |      LAT      LON   DIST
1 | 52.39964 13.04729               
2 | 52.39985 13.04802   54.8
3 | 52.40116 13.04744  150.9
4 | 52.40147 13.04722   37.6
5 | 52.40163 13.04685   30.8
6 |      ...      ...    ...

Чтобы отобразить расстояния в милях, замените *6371 на *3958 .

2

Метод Haversine хорош, если вы готовы принять фактор ошибки или если вы должны реализовать только формулу рабочего листа. Для коротких расстояний и некритических ситуаций это, вероятно, будет хорошо. Но если вам нужна точность, вам нужно использовать что-то вроде алгоритма, разработанного Таддеусом Винсенти. Его результаты считаются точными с точностью до миллиметров в зависимости от точности используемых пар широта / длинна. Сколько различий между ними? Между JFK и Токио разница составляет около 14,9 статутных миль (коротких). Между Лос-Анджелесом и Гонолулу, вы будете только в 3 милях от острова.

Хорошую реализацию алгоритма Винсенти в Visual Basic (как для Excel) можно найти по адресу:http://lost-species.livejournal.com/38453.html Код будет работать «как есть» в 32-разрядных версиях Excel, но завершится с ошибкой «слишком сложная формула» в 64-разрядной версии Excel. Чуть ниже публикации всего кода я опубликовал исправление этой проблемы, которое позволяет запускать его как на 32-, так и на 64-битных версиях движка VBA.

С уважением, J.Latham, Microsoft MVP, Excel 2006-2014

0

Полная прямая / обратная реализация Vincenty в формулах Excel VBA (надстройка 32/64 бита), позволяющая не только рассчитывать расстояние, но и азимут, а также обратный азимут, доступна по адресу https://github.com/tdjastrzebski/VincentyExcel

-1

Если вы измените аргументы ниже:

Было: G2 = 2 * ATAN2(SQRT(F2), SQRT(1-F2))* 6371

Is: G2 = 2 * ATAN2(SQRT(1-F2), SQRT(F2))* 6371

Вы должны получить правильный ответ. Надеюсь, это поможет!

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .