В геопространственных вычислениях направление линии определяется как азимут начального направления от одной точки к другой на поверхности эллипсоида. В контексте Turf.js это направление выражается через функцию вычисления начального пеленга между двумя координатами и используется при анализе маршрутов, сегментов линий и построении ориентированных геометрий.
Направление линии в географии отличается от привычного евклидового угла на плоскости. При работе с координатами WGS84 учитывается кривизна Земли, поэтому угол рассчитывается как начальный азимут великой окружности.
Начальный пеленг (bearing) — это угол между направлением на север и линией, соединяющей две точки, измеренный по часовой стрелке.
Формально:
Результат вычисления всегда нормализуется в диапазоне от −180° до 180° или от 0° до 360° в зависимости от реализации.
Основная функция для определения направления между двумя точками:
turf.bearing(point1, point2)
Она возвращает начальный азимут от первой точки ко второй.
Пример:
import * as turf from "@turf/turf";
const point1 = turf.point([30.5, 50.5]);
const point2 = turf.point([30.7, 50.6]);
const angle = turf.bearing(point1, point2);
console.log(angle);
Результат интерпретируется как геодезический угол, указывающий направление движения от первой точки ко второй вдоль поверхности Земли.
Внутренне алгоритм опирается на сферическую тригонометрию. Используется преобразование координат в радианы и вычисление угла через арктангенс разностей долгот и широт:
[ = (()(_2), (_1)(_2) - (_1)(_2)())]
где:
Полученный результат переводится в градусы и нормализуется.
Для сложных геометрий, состоящих из нескольких точек, направление определяется для каждого сегмента отдельно.
const line = turf.lineString([
[30.5, 50.5],
[30.6, 50.55],
[30.7, 50.6]
]);
const coords = line.geometry.coordinates;
for (let i = 0; i < coords.length - 1; i++) {
const from = turf.point(coords[i]);
const to = turf.point(coords[i + 1]);
const segmentBearing = turf.bearing(from, to);
console.log(segmentBearing);
}
Такой подход позволяет анализировать локальные изменения направления вдоль маршрута.
Результат функции может быть отрицательным. Это не ошибка, а способ выражения направления относительно северного меридиана:
Пример:
Для унификации часто используется преобразование:
function normalizeBearing(angle) {
return (angle + 360) % 360;
}
Направление обратно ориентированной линии получается добавлением или вычитанием 180°:
const forward = turf.bearing(pointA, pointB);
const backward = (forward + 180) % 360;
Это важно при моделировании двусторонних маршрутов и анализе навигации.
При анализе LineString направление может использоваться как:
Однако у многосегментной линии отсутствует одно глобальное направление. Оно заменяется набором локальных углов.
Для анализа поворотов используется разница направлений между соседними сегментами:
function angleDifference(a, b) {
let diff = b - a;
while (diff > 180) diff -= 360;
while (diff < -180) diff += 360;
return diff;
}
Это позволяет определить характер поворота:
При построении картографических объектов направление применяется для:
Пример получения угла для маркера:
const angle = turf.bearing(start, end);
// применяем к стилю
marker.style.transform = `rotate(${angle}deg)`;
При вычислениях важно учитывать:
Для маршрутов, содержащих множество точек, направление часто усредняется:
function averageBearing(coords) {
let sum = 0;
for (let i = 0; i < coords.length - 1; i++) {
const a = turf.bearing(
turf.point(coords[i]),
turf.point(coords[i + 1])
);
sum += a;
}
return sum / (coords.length - 1);
}
Такой подход даёт приближённое глобальное направление линии, хотя геометрически оно не строго определено.
Определение направления используется в:
Направление становится базовым параметром, связывающим геометрию линии с её семантикой движения.