Библиотека Turf.js реализует геопространственные операции на основе GeoJSON и рассматривает линии как геодезические или планарные объекты в зависимости от выбранных параметров. Вычисление длины линии относится к базовым операциям анализа линейных геометрий и выполняется с учётом кривизны Земли, если не указано иное.
Линия в Turf.js представляется объектом GeoJSON типа
LineString:
const line = {
type: "Feature",
geometry: {
type: "LineString",
coordinates: [
[55.751244, 37.618423],
[59.934280, 30.335099]
]
}
};
Каждая координата задаётся в формате [долгота, широта],
что критически важно для корректных вычислений. Перепутанный порядок
приводит к значительным ошибкам в расчётах длины.
В Turf.js используется модуль @turf/length, который
вычисляет длину линии с учётом сферической модели Земли.
import length from "@turf/length";
const result = length(line);
По умолчанию результат возвращается в километрах.
В отличие от простого евклидова расстояния, Turf.js использует геодезические формулы. Это означает, что расстояние между точками вычисляется по дуге большого круга, а не по прямой линии в декартовой системе координат.
Ключевая особенность:
Функция length поддерживает выбор единиц измерения:
import length from "@turf/length";
const km = length(line, { units: "kilometers" });
const m = length(line, { units: "meters" });
const miles = length(line, { units: "miles" });
const nautical = length(line, { units: "nauticalmiles" });
Использование метров удобно при локальных вычислениях, километров — при региональном анализе, морских миль — в навигационных задачах.
Внутренне Turf.js использует упрощённую сферическую модель и применяет формулу гаверсинуса для вычисления расстояния между последовательными точками линии.
Для двух точек:
a = sin²(Δφ / 2) + cos φ1 · cos φ2 · sin²(Δλ / 2)
c = 2 · atan2(√a, √(1−a))
d = R · c
где:
Длина линии представляет собой сумму сегментов:
d_total = Σ d_i
import length from "@turf/length";
const route = {
type: "Feature",
geometry: {
type: "LineString",
coordinates: [
[37.618423, 55.751244],
[39.701505, 47.235713],
[49.123456, 55.789012]
]
}
};
const totalLength = length(route, { units: "kilometers" });
Каждый сегмент линии рассчитывается отдельно, после чего результаты суммируются.
Для анализа часто требуется получить длину отдельных отрезков:
function segmentLengths(line) {
const coords = line.geometry.coordinates;
const result = [];
for (let i = 0; i < coords.length - 1; i++) {
const segment = {
type: "Feature",
geometry: {
type: "LineString",
coordinates: [coords[i], coords[i + 1]]
}
};
result.push(length(segment, { units: "kilometers" }));
}
return result;
}
Такой подход используется в задачах маршрутизации и транспортной аналитики.
Одной из частых ошибок при вычислении длины является нарушение порядка координат.
Корректный формат:
[долгота, широта]
Неверный формат:
[широта, долгота]
При неправильном порядке алгоритм всё равно выполнится, но результат будет некорректным из-за географической интерпретации точек.
При увеличении количества точек возрастает влияние:
Чем больше промежуточных точек, тем ближе результат к реальной длине криволинейного маршрута.
В геоаналитических системах длина линии применяется для:
Пример расчёта общей длины набора маршрутов:
import length from "@turf/length";
function totalNetworkLength(lines) {
return lines.reduce((sum, line) => {
return sum + length(line, { units: "kilometers" });
}, 0);
}
При работе с большими GeoJSON-наборами важны следующие аспекты:
Оптимизация достигается за счёт:
Модуль длины часто используется совместно с:
@turf/bearing — направление сегментов@turf/distance — расстояние между точками@turf/simplify — упрощение линий@turf/along — поиск точки на расстоянии вдоль
линииКомбинация этих инструментов позволяет строить полноценные системы анализа маршрутов.
Если линия образует кольцо, последний сегмент не соединяется автоматически с первой точкой. Для замкнутых фигур необходимо явно повторить начальную координату в конце массива:
const ring = {
type: "Feature",
geometry: {
type: "LineString",
coordinates: [
[0, 0],
[1, 0],
[1, 1],
[0, 1],
[0, 0]
]
}
};
Без замыкания результат будет соответствовать открытой ломаной.
На малых расстояниях различия между евклидовой и геодезической моделью минимальны. Однако при увеличении масштаба:
Turf.js ориентирован на глобальные координатные системы и не требует проекции данных в локальные плоскости для базовых операций длины.
При использовании вычисления длины необходимо учитывать:
Игнорирование этих факторов приводит к систематическим отклонениям в результатах.