Слияние полигонов в Turf.js относится к операциям пространственной алгебры, в которых два или более полигональных объекта объединяются в один или несколько результирующих контуров без пересечений и внутренних наложений. В рамках GeoJSON-геометрий результатом обычно становится либо Polygon, либо MultiPolygon, в зависимости от топологии исходных данных.
Операция union строится на вычислении геометрического объединения множеств точек, принадлежащих исходным полигонам. В двумерной декартовой интерпретации это эквивалентно множеству:
A ∪ B = { x | x ∈ A или x ∈ B }
В геопространственном контексте дополнительно учитывается сферическая модель Земли (WGS84), что накладывает ограничения на вычисления и требует приближённых алгоритмов для работы с кривизной поверхности.
В Turf.js операция реализована через функцию:
turf.union(poly1, poly2)
и расширенные варианты через последовательное объединение или вспомогательные структуры.
Корректность результата зависит от структуры входных GeoJSON-объектов:
Особое значение имеет топология границ. Некорректные кольца (rings) приводят к ошибкам построения или деградации результата до некорректных геометрий.
Внутренняя реализация операции объединения опирается на комбинацию:
Ключевой этап — построение 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 без потери отдельных частей.
Полигональные отверстия представляются внутренними кольцами. При объединении:
Особенно критично поведение при касаниях по границе: даже точечный контакт может привести к слиянию областей.
Геометрические операции в Turf.js чувствительны к:
Типичные проблемы:
Для снижения ошибок применяются:
Сложность операции в худшем случае близка к O(n²), где n — количество сегментов.
Факторы замедления:
Оптимизации:
Несмотря на то, что Turf.js работает в географических координатах, многие операции внутри union приближённо используют планарные модели. Это означает:
Для задач высокой точности часто применяется предварительная проекция в локальную систему координат.
Операция объединения используется в:
Union часто комбинируется с другими операциями:
Типичная последовательность для сглаживания данных:
Некоторые геометрии приводят к нестабильному результату:
В таких случаях результат может:
После выполнения union геометрия проходит нормализацию:
Эта стадия критична для последующих операций рендеринга и анализа.
При интеграции в большие системы обработки данных union часто применяется после предварительного построения R-tree индексов. Это позволяет:
Такой подход особенно эффективен в GIS-системах с тысячами объектов.