Незалежно від того, чи використовуєте Вінсенті, або Гаверсин, або сферичний закон косинусів, є розумність усвідомити будь-які потенційні проблеми з кодом, який ви плануєте використовувати, речі, на які слід стежити і пом'якшувати, і як можна вирішувати проблеми з Вінсенті проти Хаверсіна проти слонів. буде відрізнятись, коли стане відомо про якісь запізнілі проблеми / крайові випадки, які можуть бути, а можуть і не бути широко відомими. Це знає досвідчений програміст. Новачки не можуть. Я сподіваюся пошкодити деякі з них розчарування, коли фрагмент з форуму робить щось несподіване в певних випадках. Якщо хтось серйозно збирається використовувати якусь версію будь-якого з них, vincenty, haversine, sloc, то SE, SO, Reddit, Quora тощо може бути надано обмежену допомогу в якомусь початковому кодуванні рішення, але це не означає, що їх рішення або прийнята «відповідь» не містить питань. Якщо проект є досить важливим, він заслуговує на відповідний розумний обсяг досліджень. Прочитайте посібник, прочитайте документи, і якщо огляд цього коду існує, прочитайте це. Копіювання та вставлення фрагмента або сутінки, яке було анонсовано сто і більше разів, не означає, що його безпека є всебічною та забезпеченою.
Інтригуюча відповідь, опублікована cffk, породжує сенс усвідомлення ховаються крайових випадків у пакетних рішеннях, які можуть спричинити винятки чи інші труднощі . Конкретні претензії, висловлені на цій посаді, перевищують мій бюджет часу, який я повинен переслідувати в даний час, але я зазначаю, що в певних пакетах дійсно існують проблеми, в тому числі принаймні одна реалізація, яка стосується хоча б однієї особи, яка запропонувала поліпшити. так чи інакше, щоб мінімізувати або усунути ризик виникнення цих труднощів. Я не буду більше додавати до цієї теми, що стосується Вінсенті (будучи її занадто неосвіченою), але перейду натомість до хаверсину, принаймні частково на тему з ОП.
Популярна в опублікованій формулі haversine, будь то python чи іншою мовою, тому що найімовірніше буде використовувати специфікацію IEEE 754 з плаваючою точкою для більшості всіх систем Intel та Intel, схожих сьогодні, та процесорів ARM, powerPC тощо. також можуть бути сприйнятливими до рідкісних, але реальних і повторюваних помилок винятків на близькій відстані або на відстані 180 градусних дуг, антиподальних точках через наближення плаваючої точки та округлення. Деякі новачки, можливо, ще не покусані цією ситуацією. Оскільки ця специфікація fp наближається і округляє, це не означає, що будь-який код, який викликає fp64, може викликати помилки винятку, ні. Але якийсь код, деякі формули можуть мати не настільки очевидні крайові випадки, коли наближення та округлення IEEE 754 fp64 можуть призвести до того, що значення дещо відхилиться від області математичного методу, який, як очікується, бездоганно оцінить таке значення. Приклад ... sqrt (). Якщо негативне значення знайде шлях до sqrt (), наприклад sqrt (-0.00000000000000000122739), виникла помилка виключення. У формулі Гаверсина, способі просування до рішення, є два методи sqrt () в atan2 (). Thea, що обчислюється і потім використовується в sqrt (), може в антиподальних точках на земній кулі трохи збиватися нижче 0,0 або вище 1,0, дуже незначно через наближення fp64 та округлення, рідко, але повторно. Послідовна надійна повторюваність у цьому контексті робить цей ризик винятком, кращим захистом для пом'якшення, а не ізольованим випадковим випадком. Ось приклад короткого фрагмента python3 хаверсину без необхідного захисту:
import math as m
a = m.sin(dlat / 2)**2 + m.cos(lat1) * m.cos(lat2) * m.sin(dlon / 2)**2
c = 2 * m.atan2(m.sqrt(a), m.sqrt(1 - a))
distance = Radius * c
Дуже поруч або в діаметрально протилежних точок, розраховується в першому рядку формули можуть відхилитися негативні, рідко, але повторюваністю з тими ж координатами широти Lon. Для захисту / виправити ті рідкісні випадки, можна просто додати, після в розрахунок, як показано нижче:
import math as m
note = ''
a = m.sin(dlat / 2)**2 + m.cos(lat1) * m.cos(lat2) * m.sin(dlon / 2)**2
if a < 0.0: a = 0.0 ; note = '*'
if a > 1.0: a = 1.0 ; note = '**'
c = 2 * m.atan2(m.sqrt(a), m.sqrt(1 - a))
distance = Radius * c
# note = '*' # a went below 0.0 and was normalized back to 0.0
# note = '**' # a went above 1.0 and was normalized back to max of 1.0
Звичайно, я тут не показав всю функцію, але короткий фрагмент, як це часто розміщується. Але це показує захист sqrt (), випробувавши a , та нормалізувавши його при необхідності, також заощаджуючи необхідність поставити всю справу за винятком спробу. Примітка = '' вгорі - це запобігти протестуванню етапу байт-коду, щоб нотатка була використана перед призначенням значення, якщо вона повертається з результатом функції.
З допомогою цього простого зміни, додавання двох тестів, SQRT () функції будуть щасливі, і код тепер має додаткову ноту , яка може бути повернута в викликає код, щоб попередити про те , що результат був трохи нормалізувалися, і чому. Деяким може бути байдуже, іншим - ні, але його немає, запобігаючи помилці винятку, що "може" статися інакше Спроба, крім блоку, може зафіксувати виняток, але не виправити його, якщо прямо не написано для цього. Здається , простіше код корекції лінії (и) відразу після розрахунку лінії. Ретельно прочищений вхід не повинен взагалі вимагати спроб, крім блоку.
Резюме, при використанні гаверсінуса, кодуються в явному вигляді , а не НЕ з допомогою пакета або бібліотеки, незалежно від того , ваш мова за вибором, було б гарною ідеєю для перевірки і нормалізації в задню частину в потребу діапазоні 0,0 <= а <= 1,0 в порядку для захисту наступного рядка своїми розрахунками c . Але більшість фрагментів коду Гаверсину не показують його та не згадують про ризик.
Досвід: під час ретельного тестування по всьому світу, з кроком 0,001 градуса, я заповнив жорсткий диск із комбінаціями lat lon, які спричинили виняток, надійний послідовний повторюваний виняток, протягом місяця також побічно тестуючи надійність охолодження процесора вентилятор, і моє терпіння. Так, я з тих пір видалив більшість цих журналів, оскільки їх метою було переважно довести точку (якщо каламбур дозволений). Але у мене є декілька коротших журналів «проблемних значень lat lon», які зберігаються для тестування.
Точність: Чи втратить а та весь хаверсиновий результат певну точність, нормалізуючи його, що повернеться до домену? Не так багато, можливо, не більше, ніж наближення та округлення fp64 вже вводили, що спричинило незначне відхилення від домену. Якщо ви вже знайшли гаверсин, прийнятний у порівнянні з вінсенсі - простіший, швидший, простіший у налаштуванні, усунення несправностей та обслуговування, тоді гаверсин може стати хорошим рішенням для вашого проекту.
Я використовував гаверсин на наземній проектованій небосхилі для вимірювання кутових відстаней між об'єктами на небі, як видно з положення на землі, картографування по азимуту та альт для скісфери lat lon, еквівалентних координат, ніяких еліпсоїдів взагалі не враховувати, оскільки Прогнозована теоретична скеля є ідеальною сферою, коли мова йде про вимірювання кутових відстаней погляду кутів між двома об'єктами від положення на земній поверхні. Він ідеально відповідає моїм потребам. Так, хаверин все ще є дуже корисним і дуже точним у певних програмах (і в рамках моїх цілей) ... але якщо ви все-таки використовуєте його, чи то на Землі для ГІС, чи навігації, чи в спостереженнях та вимірах об'єктів неба, захищайте це у випадку антиподальних точок або дуже поблизу антиподальних точок, шляхом тестування aі при необхідності повернути його до потрібного домену.
Незахищений хаверин є по всьому Інтернету, і я бачив лише один старий пост Usenet, який показав певний захист, я думаю, хтось із JPL, і це, можливо, було до 1985 року, специфікація з плаваючою точкою IEEE 754. На двох інших сторінках згадувались можливі проблеми поблизу антиподальних точок, але вони не описували ці проблеми, або як можна їх пом'якшити. Таким чином, існує стурбованість новичками (як я), які не завжди можуть добре зрозуміти належну практику для подальшого дослідження та перевірки крайових випадків, який-небудь код вони скопіювали та вставили у проект довіри. Інтригуюча публікація cffk була освіжаючою тим, що вона публічно використовує такі типи питань, які не часто згадуються, рідко публічно кодуються для захисту у фрагментах, і рідко обговорюються таким чином, порівняно з кількістю незахищених та не обговорюваних версій, які розміщуються.
Станом на 20190923 рік на вікі-сторінці формули haversine дійсно згадується проблема, яка можлива в антиподальних точках, через проблеми з плаваючою комою в обчислювальних пристроях ... заохочуючи ...
https://en.wikipedia.org/wiki/Haversine_formula
(тому що на цій сторінці wiki наразі немає HTML-прив’язки до розділу, до якого я б безпосередньо посилався, тому після завантаження сторінки зробіть пошук на цій сторінці браузера для "При використанні цих формул", і ви див. проблему Гаверсина щодо згаданих антиподальних точок (офіційно).
І цей інший сайт також дуже коротко згадує про нього:
https://www.movable-type.co.uk/scripts/latlong.html
Якщо ви знайдете на цій сторінці "включення захисту від помилок округлення", це таке ...
Якщо atan2 недоступний, c може бути обчислений з 2 ⋅ asin (min (1, √a)) (включаючи захист від помилок округлення).
Зараз є рідкісний приклад, коли згадуються помилки округлення та захист, показаний для версії asin (), але ще не згаданий або показаний для версії atan2 (). Але принаймні згадується ризик помилок округлення.
imho, будь-яка програма 24/7/365, яка використовує хаверсин, потребує такого захисту поблизу протиподіальних точок як важливої та простої деталі.
Я не знаю, які пакети haversine роблять або не включають цей захист, але якщо ви все це новачок, і ви збираєтесь використовувати широко опубліковані "фрагменти" версії, тепер ви знаєте, що це потребує захисту, і цей захист дуже простий у здійсненні, тобто якщо ви не використовуєте vincenty і не використовуєте упакований гаверсин без легкого доступу для зміни коду пакету.
IOW, незалежно від використання vincenty чи haversine чи sloc, слід усвідомити будь-які проблеми з кодом, речі, на які слід спостерігати та пом'якшувати, і як можна вирішувати питання vincenty vs haversine vs sloc, коли вони стануть відомими для кожного ховаються проблеми / крайові випадки, які можуть бути або не бути широко відомими.