Расстояние от точки до линии в двумерной геометрии определяется как минимальная длина перпендикуляра, опущенного из точки на прямую или отрезок. В случае работы с геопространственными данными важно различать два варианта:
В геоинформационных системах почти всегда используется второй вариант, поскольку линии представлены как последовательности координат (LineString), ограниченные начальной и конечной точками.
Пусть задана точка ( P(x_0, y_0) ) и отрезок с концами ( A(x_1, y_1) ), ( B(x_2, y_2) ). Векторное представление позволяет выразить расстояние через проекцию:
Проекция точки на линию определяется скалярным коэффициентом:
[ t = ]
Дальнейшее поведение зависит от значения ( t ):
Минимальное расстояние вычисляется как длина вектора между ( P ) и ближайшей точкой на сегменте.
В Turf.js все геометрии представлены в формате GeoJSON:
{ "type": "Point", "coordinates": [lng, lat] }{ "type": "LineString", "coordinates": [[lng, lat], [lng, lat], ...] }Важный аспект — порядок координат строго фиксирован: сначала долгота, затем широта. Ошибка в порядке координат приводит к некорректным результатам вычислений расстояний.
Turf.js работает с координатами на сфере (WGS84), а не в декартовой плоскости. Это означает:
Для вычисления расстояния от точки до линии используется функция:
turf.pointToLineDistance(point, line, options)
point — GeoJSON объект Point;
line — GeoJSON объект LineString или
MultiLineString;
options — дополнительные параметры:
units — единицы измерения результата.Поддерживаемые единицы:
kilometersmetersmilesdegreesimport { point, lineString, pointToLineDistance } from "@turf/turf";
const pt = point([30.5, 50.5]);
const line = lineString([
[30.0, 50.0],
[31.0, 51.0]
]);
const distance = pointToLineDistance(pt, line, { units: "kilometers" });
console.log(distance);
Функция возвращает числовое значение расстояния от точки до ближайшего сегмента линии.
Алгоритм можно описать следующим образом:
Такой подход обеспечивает корректную работу с ломаными линиями произвольной формы.
LineString с несколькими точками интерпретируется как последовательность отрезков:
A — B — C — D
Расстояние от точки до линии:
min(
dist(P, AB),
dist(P, BC),
dist(P, CD)
)
Каждый сегмент рассматривается независимо, что позволяет корректно обрабатывать сложные маршруты и границы.
Параметр units влияет на масштаб результата. При
использовании географических координат:
Пример:
pointToLineDistance(pt, line, { units: "meters" });
Результат будет в метрах, что удобно для локальных измерений.
При отсутствии координат результат не может быть вычислен. В реальных сценариях такие данные должны фильтроваться до вызова функции.
Если точка совпадает с одной из координат LineString, расстояние равно нулю.
Алгоритм не зависит от ориентации сегмента, поскольку использует векторные операции.
На больших расстояниях (сотни километров) погрешность сферической модели может увеличиваться, однако Turf.js компенсирует это через геодезические расчеты.
Расстояние до линии вычисляется только по границе геометрии. В отличие от полигона:
Сложность алгоритма линейная относительно количества сегментов:
[ O(n)]
где ( n ) — количество координат в LineString.
При работе с большими наборами данных (например, трассы дорог или границы стран) это может становиться критичным фактором. Оптимизация достигается через:
[lat, lng] вместо
[lng, lat];Расстояние от точки до линии часто используется совместно с другими операциями:
turf.nearestPointOnLine — нахождение ближайшей точки на
линии;turf.booleanPointOnLine — проверка принадлежности точки
линии;turf.lineSlice — извлечение участка линии;turf.buffer — построение буферной зоны вокруг
линии.Комбинация этих функций позволяет решать задачи анализа маршрутов, логистики и геофенсинга.
В геоинформационных системах вычисление расстояния от точки до линии применяется для:
Такие вычисления лежат в основе большинства задач пространственного анализа в браузерных и серверных JavaScript-приложениях, использующих Turf.js.