Вычисление длины линии

Библиотека Turf.js реализует геопространственные операции на основе GeoJSON и рассматривает линии как геодезические или планарные объекты в зависимости от выбранных параметров. Вычисление длины линии относится к базовым операциям анализа линейных геометрий и выполняется с учётом кривизны Земли, если не указано иное.


Модель данных линии в Turf.js

Линия в 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 использует геодезические формулы. Это означает, что расстояние между точками вычисляется по дуге большого круга, а не по прямой линии в декартовой системе координат.

Ключевая особенность:

  • Земля аппроксимируется сферой
  • Расчёт выполняется через тригонометрические преобразования
  • Минимизируются ошибки на больших расстояниях

Параметр units

Функция 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" });

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

  • kilometers
  • meters
  • miles
  • nauticalmiles
  • degrees (геометрическая длина в градусах)

Использование метров удобно при локальных вычислениях, километров — при региональном анализе, морских миль — в навигационных задачах.


Алгоритм расчёта

Внутренне Turf.js использует упрощённую сферическую модель и применяет формулу гаверсинуса для вычисления расстояния между последовательными точками линии.

Для двух точек:

a = sin²(Δφ / 2) + cos φ1 · cos φ2 · sin²(Δλ / 2)
c = 2 · atan2(√a, √(1−a))
d = R · c

где:

  • φ — широта
  • λ — долгота
  • R — радиус Земли

Длина линии представляет собой сумму сегментов:

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-наборами важны следующие аспекты:

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

Оптимизация достигается за счёт:

  • предварительной фильтрации геометрий
  • упрощения линий (simplification)
  • кэширования результатов

Взаимодействие с другими модулями Turf.js

Модуль длины часто используется совместно с:

  • @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 ориентирован на глобальные координатные системы и не требует проекции данных в локальные плоскости для базовых операций длины.


Практические ограничения

При использовании вычисления длины необходимо учитывать:

  • координаты должны быть в WGS84 (EPSG:4326)
  • не поддерживаются метрические проекции без предварительного преобразования
  • вычисления не учитывают высоту над уровнем моря

Игнорирование этих факторов приводит к систематическим отклонениям в результатах.