Объединение линий

В библиотеке Turf.js объединение линейных геометрий выполняется через анализ топологии координат и последующее склеивание сегментов в непрерывные цепочки. Основной инструмент для этой задачи — turf.lineMerge, работающий с объектами типа LineString и MultiLineString.

Линейные объекты в GeoJSON представляют собой последовательности координатных точек. При наличии нескольких линий задача объединения заключается в восстановлении непрерывных маршрутов, если конечные и начальные точки совпадают.

Объединение выполняется не по геометрическому пересечению в пространстве, а по совпадению координатных узлов. Это означает, что даже минимальные расхождения в координатах могут привести к тому, что линии не будут объединены.

Ключевое поведение:

  • объединяются только линии с совпадающими конечными точками;
  • порядок координат влияет на результат;
  • пересекающиеся, но не соединённые линии не склеиваются автоматически.

Базовая операция lineMerge

Функция turf.lineMerge принимает Feature<LineString | MultiLineString> и возвращает максимально объединённые линейные цепочки.

import lineMerge from "@turf/line-merge";

const line = {
  type: "Feature",
  geometry: {
    type: "MultiLineString",
    coordinates: [
      [[0, 0], [1, 1]],
      [[1, 1], [2, 2]],
      [[10, 10], [11, 11]]
    ]
  }
};

const merged = lineMerge(line);

Результат:

  • первая и вторая линии объединяются в одну непрерывную;
  • третья остаётся отдельной, так как не имеет общей точки соединения.

Важность топологической согласованности

Объединение зависит от строгого совпадения координат. Даже незначительные различия делают соединение невозможным:

  • [1, 1][1.0000001, 1]
  • различие в округлении разрывает цепочку

Для подготовки данных используется нормализация координат.

Подготовка геометрии перед объединением

Перед выполнением lineMerge часто выполняется очистка и выравнивание координат.

Удаление дубликатов точек

import cleanCoords from "@turf/clean-coords";

const cleaned = cleanCoords(feature);

Удаляются повторяющиеся соседние координаты, которые могут мешать корректной топологии.

Приведение к сетке

При работе с данными GPS полезно сглаживание координат:

import truncate from "@turf/truncate";

const normalized = truncate(feature, {
  precision: 5
});

Это уменьшает влияние погрешностей измерений.

Упрощение геометрии

Для уменьшения количества точек применяется:

import simplify from "@turf/simplify";

const simplified = simplify(feature, {
  tolerance: 0.0001,
  highQuality: true
});

Снижение плотности координат облегчает последующую топологическую обработку.

Алгоритм объединения внутри lineMerge

Логика работы lineMerge основана на построении графа:

  • каждая линия рассматривается как ребро графа;
  • узлы графа — координатные точки;
  • совпадающие узлы объединяются;
  • выполняется обход для поиска непрерывных цепочек.

Результат:

  • LineString при единственной цепочке;
  • MultiLineString при нескольких независимых компонентах.

Работа с разветвлёнными структурами

Если линии образуют развилки, объединение происходит частично:

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

Пример сценария — дорожная сеть с перекрёстками.

Особенности направленности линий

Направление координат влияет на соединение:

  • [A → B] и [B → C] объединяются;
  • [B → A] и [B → C] могут потребовать перестановки.

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

function normalize(line) {
  const coords = line.geometry.coordinates;
  if (coords[0][0] > coords[coords.length - 1][0]) {
    coords.reverse();
  }
  return line;
}

Разрывы и невозможность объединения

Объединение не выполняется при наличии разрывов:

  • отсутствует общая точка;
  • расстояние между концами больше нуля;
  • координаты находятся в разных системах или масштабах.

В таких случаях применяется “сшивание” через привязку к ближайшим точкам, но это уже отдельная операция пространственной коррекции.

Отличие от boolean-операций

Линейное объединение в Turf.js не связано с булевыми операциями:

  • turf.union работает только с полигонами;
  • turf.lineMerge не выполняет геометрическое пересечение;
  • линии не «склеиваются» по площади или пересечению, только по узлам.

Пример обработки сети линий

import lineMerge from "@turf/line-merge";
import cleanCoords from "@turf/clean-coords";
import simplify from "@turf/simplify";

const roads = cleanCoords({
  type: "Feature",
  geometry: {
    type: "MultiLineString",
    coordinates: [
      [[0, 0], [1, 1], [2, 2]],
      [[2, 2], [3, 3], [4, 4]],
      [[10, 10], [11, 11]]
    ]
  }
});

const optimized = simplify(roads, { tolerance: 0.00001 });

const merged = lineMerge(optimized);

Обработка включает:

  • очистку координат;
  • уменьшение плотности точек;
  • объединение связных сегментов.

Поведение при множественных компонентах

Если вход содержит несколько несвязанных групп линий, результат сохраняет структуру:

  • каждая группа преобразуется в отдельный LineString;
  • итоговый объект становится MultiLineString.

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

Объединение линий используется при обработке:

  • дорожных графов;
  • маршрутов логистики;
  • трубопроводных систем;
  • геометрии рек и русел;
  • упрощения GPS-треков.

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