Расчет расстояния от точки до линии

Расстояние от точки до линии в двумерной геометрии определяется как минимальная длина перпендикуляра, опущенного из точки на прямую или отрезок. В случае работы с геопространственными данными важно различать два варианта:

  • расстояние до бесконечной прямой;
  • расстояние до конечного отрезка (линии как сегмента между координатами).

В геоинформационных системах почти всегда используется второй вариант, поскольку линии представлены как последовательности координат (LineString), ограниченные начальной и конечной точками.

Геометрическая интерпретация

Пусть задана точка ( P(x_0, y_0) ) и отрезок с концами ( A(x_1, y_1) ), ( B(x_2, y_2) ). Векторное представление позволяет выразить расстояние через проекцию:

  • вектор ( = (x_2 - x_1, y_2 - y_1) )
  • вектор ( = (x_0 - x_1, y_0 - y_1) )

Проекция точки на линию определяется скалярным коэффициентом:

[ t = ]

Дальнейшее поведение зависит от значения ( t ):

  • если ( t < 0 ), ближайшая точка — A;
  • если ( t > 1 ), ближайшая точка — B;
  • если ( 0 t ), проекция лежит на отрезке.

Минимальное расстояние вычисляется как длина вектора между ( P ) и ближайшей точкой на сегменте.

GeoJSON представление геометрии

В Turf.js все геометрии представлены в формате GeoJSON:

  • точка: { "type": "Point", "coordinates": [lng, lat] }
  • линия: { "type": "LineString", "coordinates": [[lng, lat], [lng, lat], ...] }

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

Особенности работы в географических координатах

Turf.js работает с координатами на сфере (WGS84), а не в декартовой плоскости. Это означает:

  • расстояния вычисляются с учетом кривизны Земли;
  • результат зависит от выбранной единицы измерения;
  • при малых расстояниях используется сферическая аппроксимация.

Основная функция Turf.js

Для вычисления расстояния от точки до линии используется функция:

turf.pointToLineDistance(point, line, options)

Параметры:

  • point — GeoJSON объект Point;

  • line — GeoJSON объект LineString или MultiLineString;

  • options — дополнительные параметры:

    • units — единицы измерения результата.

Поддерживаемые единицы:

  • kilometers
  • meters
  • miles
  • degrees

Базовый пример использования

import { 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);

Функция возвращает числовое значение расстояния от точки до ближайшего сегмента линии.

Механизм вычисления внутри Turf.js

Алгоритм можно описать следующим образом:

  1. Линия разбивается на сегменты между соседними координатами.
  2. Для каждого сегмента вычисляется проекция точки на прямую, содержащую сегмент.
  3. Проверяется принадлежность проекции отрезку.
  4. Если проекция вне сегмента, берется расстояние до ближайшей вершины.
  5. Из всех расстояний выбирается минимальное.

Такой подход обеспечивает корректную работу с ломаными линиями произвольной формы.

Работа с несколькими сегментами

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.

При работе с большими наборами данных (например, трассы дорог или границы стран) это может становиться критичным фактором. Оптимизация достигается через:

  • предварительную фильтрацию сегментов по bounding box;
  • пространственные индексы (R-tree);
  • упрощение геометрии (simplify).

Частые ошибки при использовании

  • перепутанный порядок координат [lat, lng] вместо [lng, lat];
  • отсутствие указания единиц измерения;
  • попытка использовать 2D евклидову модель для географических данных;
  • передача массива координат вместо GeoJSON объекта.

Интеграция с другими функциями Turf.js

Расстояние от точки до линии часто используется совместно с другими операциями:

  • turf.nearestPointOnLine — нахождение ближайшей точки на линии;
  • turf.booleanPointOnLine — проверка принадлежности точки линии;
  • turf.lineSlice — извлечение участка линии;
  • turf.buffer — построение буферной зоны вокруг линии.

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

Практическое применение в пространственном анализе

В геоинформационных системах вычисление расстояния от точки до линии применяется для:

  • определения отклонения GPS-трека от маршрута;
  • расчета расстояния до дорог, рек или границ;
  • анализа близости объектов к инфраструктуре;
  • построения систем навигации и маршрутизации;
  • оценки ошибок геопозиционирования.

Такие вычисления лежат в основе большинства задач пространственного анализа в браузерных и серверных JavaScript-приложениях, использующих Turf.js.