В географических вычислениях под стандартным расстоянием обычно понимается кратчайшая линия между двумя точками на поверхности Земли, учитывающая её кривизну. В контексте Turf.js это расстояние вычисляется как геодезическое, то есть вдоль поверхности сферы или эллипсоида, а не как евклидово расстояние на плоскости.
При работе с координатами важно учитывать, что Земля не является плоской моделью, поэтому простое применение теоремы Пифагора к широте и долготе приводит к значительным погрешностям на больших дистанциях. Turf.js решает эту проблему через набор географических алгоритмов, стандартизированных для работы с GeoJSON-структурами.
Все операции в Turf.js опираются на формат GeoJSON. Точки задаются
как объекты типа Point:
const point = {
type: "Point",
coordinates: [lng, lat]
};
Ключевой момент заключается в порядке координат: сначала долгота, затем широта. Это отличается от многих картографических API, где используется порядок lat/lng.
Для вычисления расстояния используются два объекта
Point, например:
const from = turf.point([37.6173, 55.7558]);
const to = turf.point([30.3141, 59.9386]);
Основным инструментом является функция:
turf.distance(from, to, options)
Она возвращает расстояние между двумя точками по кратчайшей геодезической линии.
from — GeoJSON Pointto — GeoJSON Pointoptions — объект параметровПример базового использования:
import { point, distance } from "@turf/turf";
const moscow = point([37.6173, 55.7558]);
const saintPetersburg = point([30.3141, 59.9386]);
const result = distance(moscow, saintPetersburg);
По умолчанию результат возвращается в километрах.
Turf.js поддерживает несколько единиц измерения расстояния,
задаваемых через options.units.
Основные значения:
kilometers — километры (по умолчанию)miles — милиmeters — метрыdegrees — градусыradians — радианыПример:
const d = distance(moscow, saintPetersburg, { units: "meters" });
Выбор единиц напрямую влияет на интерпретацию результата, но не изменяет внутреннюю модель расчёта — вычисление всегда ведётся на сфере, после чего результат преобразуется.
Turf.js использует сферическую модель Земли и алгоритмы, основанные на сферической тригонометрии. Наиболее распространённый метод — формула гаверсинусов (Haversine formula), обеспечивающая устойчивые вычисления на больших расстояниях.
Общая идея заключается в вычислении центрального угла между точками:
[ a = ^2() + (_1)(_2)^2()]
[ c = 2 (, )]
[ d = R c]
где:
Такой подход обеспечивает стабильность вычислений даже при малых расстояниях, где другие формулы могут терять точность из-за численных ошибок.
Использование сферической модели влечёт ряд особенностей:
Геодезическая линия часто выглядит как дуга на плоской карте, хотя фактически является кратчайшим путём на сфере.
При вычислениях между точками, расположенными по разные стороны 180° долготы, алгоритм автоматически выбирает кратчайший путь через «разрыв» координатной сетки. Без этой корректировки расстояние могло бы вычисляться как почти полный обход Земли.
Вблизи полюсов изменение долготы практически не влияет на реальное положение точки. Turf.js корректно учитывает это поведение через сферическую модель, предотвращая резкие скачки расстояний.
При расстояниях в несколько метров или сантиметров возможны незначительные численные погрешности. Для таких задач иногда применяется локальная аппроксимация через плоскую модель, однако Turf.js сохраняет универсальный подход.
Функция расстояния часто применяется в задачах анализа геоданных:
Пример фильтрации точек по радиусу:
import { point, distance } from "@turf/turf";
const center = point([37.6173, 55.7558]);
const points = [
point([37.60, 55.75]),
point([38.00, 55.80]),
point([36.90, 55.60])
];
const radius = 20;
const filtered = points.filter(p => {
const d = distance(center, p, { units: "kilometers" });
return d <= radius;
});
Хотя Turf.js ориентирован на геодезические вычисления, важно учитывать различие между:
Использование геодезической модели критично для корректных результатов при масштабах города, страны или планеты.
Расчёт расстояния в Turf.js относительно лёгкий, однако при массовой обработке данных (десятки тысяч точек) нагрузка становится заметной.
Факторы влияния:
distance;Оптимизации:
Точность вычислений зависит от:
На уровне городских расстояний погрешность обычно не превышает нескольких метров. На межконтинентальных расстояниях отклонения могут возрастать, но остаются в пределах допустимых для большинства прикладных задач.
В некоторых системах расстояние рассчитывается через:
Подход Turf.js отличается тем, что абстрагирует вычисления от проекций и обеспечивает единый стандарт расчёта независимо от входных данных.
Расстояние часто выступает базовым элементом более сложных операций:
Каждая из этих задач опирается на базовое вычисление дистанции как фундаментальный геометрический примитив, от которого строится дальнейшая логика обработки пространственных данных.