У меня была идея для забавного приложения, которое должно вычислять расстояние «по прямой» между двумя координатами на карте, поэтому я пошел искать пакет, который позаботится об этом за меня. Найти подходящий пакет оказалось не так просто, как я ожидал, поэтому я решил поделиться кратким изложением своих знаний.

Работа с местоположениями и расстояниями для меня совершенно новая вещь, поэтому, если у вас есть какие-либо советы, предложения или исправления, обязательно оставляйте их в комментариях!

Формулы

Формула расстояния по большому кругу

Расстояние по большому кругу — это кратчайшее расстояние между двумя точками на поверхности сферы, измеренное вдоль поверхности сферы.

Но Земля не сфера, это сплюснутый сфероид. Форма, которую вы получаете, когда держите мягкий мяч сверху и снизу и сжимаете его…

Формула расстояния по большому кругу проста в вычислительном отношении, но является наименее точной из трех: ее точность составляет всего 0,5%.

Формула Хаверсина

Формула гаверсинусагаверсинус является сокращением от половина сложенного синуса — это формула для вычисления расстояний на поверхности сферы. В вычислительном отношении это еще одна относительно простая формула с точностью до 0,3%.

Формула Винсенти

Формула Винсенти — названная в честь Таддеуса Винсента — вычисляет расстояние между двумя точками на поверхности нашего сплюснутого сфероида с точностью до 0,5 мм. Эта формула требует больших вычислительных ресурсов, чем две другие формулы.

Пакеты

Сначала я оценил geo-position.ts (в котором используется формула расстояния по большому кругу) и node-geo-distance (в котором используются формулы гаверсинуса и Винсенти) ). Вскоре после того, как я решил, что знаю, чем хочу заниматься, и начал писать эту статью, я обнаружил geolib.

Все три пакета были просты в использовании и — для моих потребностей в точности и того, что я считаю «нормальными» требованиями к производительности — работали более чем достаточно хорошо, чтобы быть жизнеспособными вариантами.

гео-позиция.тс

geo-position.ts использует формулу расстояния по большому кругу и предоставляет несколько полезных функций для загрузки. У меня было очень приятное общение с сопровождающим, когда я обратился с некоторыми вопросами!

узел-гео-расстояние

node-geo-distance настолько прост, насколько это возможно, с асинхронной и синхронной вариациями каждой из функций Haversine и Vincenty.

геолиб

geolib на сегодняшний день является самым популярным из трех и имеет больше всего функций, помимо расчета расстояний.

Производительность

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

  1. geo-position.ts: ~0,75 мкс)
  2. node-geo-distance: ~1,35 мкс для гаверсинуса, ~1,5 мкс для Винсенти.
  3. geolib: от ~2,5 до 7,5 мкс в зависимости от желаемого уровня точности.

Еда на вынос

Для моего варианта использования даже точность в пределах 0,05% достаточно хороша (мое приложение на самом деле не заботится о том, что происходит вблизи северного и южного полюсов нашей планеты), и я тоже (на данном этапе, по крайней мере) меня беспокоят вычисления, для выполнения которых требуется менее десяти микросекунд, поэтому более высокая точность geolib в сочетании с ее дополнительными функциями делают ее отлично подходящей для моих целей. Наверное, большинство целей :)

Надеюсь, вы нашли это полезным!

Повышение уровня кодирования

Спасибо, что являетесь частью нашего сообщества! Перед тем, как ты уйдешь:

  • 👏 Хлопайте за историю и подписывайтесь на автора 👉
  • 📰 Смотрите больше контента в публикации Level Up Coding
  • 🔔 Подписывайтесь на нас: Twitter | ЛинкедИн | "Новостная рассылка"

🚀👉 Присоединяйтесь к коллективу талантов Level Up и найдите прекрасную работу