Слияние полигонов

Слияние полигонов в Turf.js относится к операциям пространственной алгебры, в которых два или более полигональных объекта объединяются в один или несколько результирующих контуров без пересечений и внутренних наложений. В рамках GeoJSON-геометрий результатом обычно становится либо Polygon, либо MultiPolygon, в зависимости от топологии исходных данных.

Операция union строится на вычислении геометрического объединения множеств точек, принадлежащих исходным полигонам. В двумерной декартовой интерпретации это эквивалентно множеству:

A ∪ B = { x | x ∈ A или x ∈ B }

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

В Turf.js операция реализована через функцию:

turf.union(poly1, poly2)

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

Входные данные и требования к геометрии

Корректность результата зависит от структуры входных GeoJSON-объектов:

  • Тип: Polygon или MultiPolygon
  • Координаты замкнуты (первая и последняя точка совпадают)
  • Отсутствие самопересечений
  • Единая система координат (обычно WGS84)

Особое значение имеет топология границ. Некорректные кольца (rings) приводят к ошибкам построения или деградации результата до некорректных геометрий.

Алгоритмическая основа Turf.js union

Внутренняя реализация операции объединения опирается на комбинацию:

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

Ключевой этап — построение planar subdivision, где каждое ребро рассматривается как независимый сегмент, а все пересечения явно материализуются в узлы графа.

Далее применяется классификация областей:

  • области внутри первого полигона
  • области внутри второго полигона
  • пересекающиеся области

Итоговая геометрия формируется из объединения всех областей, попавших хотя бы в один исходный набор.

Простое объединение двух полигонов

Базовый сценарий включает два пересекающихся полигона:

import * as turf from "@turf/turf";

const poly1 = turf.polygon([[
  [0, 0],
  [4, 0],
  [4, 4],
  [0, 4],
  [0, 0]
]]);

const poly2 = turf.polygon([[
  [2, 2],
  [6, 2],
  [6, 6],
  [2, 6],
  [2, 2]
]]);

const result = turf.union(poly1, poly2);

В данном случае результатом становится объединённая фигура с внешним контуром, охватывающим обе области, и вырезанной внутренней границей в зоне пересечения.

Объединение множественных полигонов

Функция union не является вариативной для массивов напрямую, поэтому применяется последовательная агрегация:

let merged = polygons[0];

for (let i = 1; i < polygons.length; i++) {
  merged = turf.union(merged, polygons[i]);
}

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

Особенности работы с MultiPolygon

При пересечении нескольких компонент MultiPolygon алгоритм:

  • распаковывает все внутренние полигоны
  • выполняет pairwise union
  • нормализует результат в единый GeoJSON-объект

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

Обработка дыр (holes)

Полигональные отверстия представляются внутренними кольцами. При объединении:

  • пересекающиеся holes могут исчезать
  • holes могут преобразовываться в внешние границы
  • возможна инверсия роли внутренних и внешних колец при сложной топологии

Особенно критично поведение при касаниях по границе: даже точечный контакт может привести к слиянию областей.

Численная устойчивость и погрешности

Геометрические операции в Turf.js чувствительны к:

  • плавающей точке IEEE 754
  • минимальным пересечениям сегментов
  • почти коллинеарным рёбрам

Типичные проблемы:

  • дублирование узлов пересечения
  • микро-зазоры между границами
  • некорректная классификация точек «на границе»

Для снижения ошибок применяются:

  • snapping (привязка координат)
  • округление координат
  • предобработка simplify

Производительность операции union

Сложность операции в худшем случае близка к O(n²), где n — количество сегментов.

Факторы замедления:

  • большое число вершин
  • сложные пересечения
  • многокомпонентные полигоны
  • отсутствие предварительного упрощения

Оптимизации:

  • предварительное применение turf.simplify
  • пространственное разбиение (grid index)
  • кластеризация полигонов по bounding box
  • минимизация количества последовательных union-операций

Геодезический контекст

Несмотря на то, что Turf.js работает в географических координатах, многие операции внутри union приближённо используют планарные модели. Это означает:

  • локальная точность высокая
  • глобальные искажения возрастают на больших площадях
  • на полярных областях возможны аномалии геометрии

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

Типичные сценарии применения

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

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

Составные операции и цепочки преобразований

Union часто комбинируется с другими операциями:

  • intersection → выделение общих зон
  • difference → вычитание областей
  • dissolve → группировка по атрибутам
  • buffer → расширение границ перед объединением

Типичная последовательность для сглаживания данных:

  1. buffer для устранения разрывов
  2. simplify для уменьшения плотности вершин
  3. union для объединения областей
  4. clean-up для нормализации геометрии

Ошибки и нестандартные случаи

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

  • самопересекающиеся полигоны (bow-tie)
  • коллинеарные границы с совпадающими сегментами
  • дублирующиеся координаты
  • нулевые площади (degenerate polygons)

В таких случаях результат может:

  • возвращать null
  • выдавать MultiPolygon с неожиданной структурой
  • терять внутренние кольца

Структурная нормализация результата

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

  • упорядочивание колец по направлению (clockwise / counterclockwise)
  • удаление избыточных точек
  • объединение касающихся сегментов
  • проверка валидности GeoJSON

Эта стадия критична для последующих операций рендеринга и анализа.

Взаимодействие с пространственными индексами

При интеграции в большие системы обработки данных union часто применяется после предварительного построения R-tree индексов. Это позволяет:

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

Такой подход особенно эффективен в GIS-системах с тысячами объектов.