Определение вложенности объектов

В геопространственных данных вложенность объектов означает топологическое отношение, при котором одна геометрия полностью содержится внутри другой. На практике это задачи вида: находится ли точка внутри полигона, лежит ли один полигон внутри другого, содержит ли мультиполигон набор вложенных областей, корректно ли интерпретируются внутренние «дыры» (holes) в полигонах.

В Turf.js такие проверки реализованы через набор булевых пространственных функций, основанных на вычислительной геометрии: алгоритмах лучевого пересечения, анализа рёбер полигона и проверки ориентации контуров.

Пространственная модель вложенности

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

  • within (внутри) — объект полностью находится внутри другого
  • contains (содержит) — обратное отношение к within
  • intersects (пересекается) — частичное пересечение без строгой вложенности

Эти отношения формируют основу анализа геометрических структур, включая иерархии объектов: точка → линия → полигон → мультиполигон.

Проверка точки внутри полигона

Классическая задача вложенности — определение принадлежности точки полигону.

В Turf.js используется функция:

  • booleanPointInPolygon

Принцип работы основан на алгоритме лучевого пересечения: из точки проводится воображаемый луч, и считается количество пересечений с рёбрами полигона. Чётное число пересечений означает, что точка снаружи, нечётное — внутри.

import booleanPointInPolygon from "@turf/boolean-point-in-polygon";

const point = {
  type: "Feature",
  geometry: {
    type: "Point",
    coordinates: [71.4304, 51.1281]
  }
};

const polygon = {
  type: "Feature",
  geometry: {
    type: "Polygon",
    coordinates: [[
      [71.0, 51.0],
      [72.0, 51.0],
      [72.0, 52.0],
      [71.0, 52.0],
      [71.0, 51.0]
    ]]
  }
};

const inside = booleanPointInPolygon(point, polygon);

Вложенность геометрий: within и contains

Для анализа вложенности объектов более высокого уровня используются функции:

  • booleanWithin — проверяет, находится ли один объект внутри другого
  • booleanContains — проверяет, содержит ли объект другой

Эти функции применимы к комбинациям:

  • точка → полигон
  • линия → полигон
  • полигон → полигон (с ограничениями топологии)
import booleanWithin from "@turf/boolean-within";
import booleanContains from "@turf/boolean-contains";

Внутренне проверки опираются на комбинацию:

  • анализ bounding box (предварительное отсечение)
  • проверка пересечений рёбер
  • проверка включения всех вершин внутреннего объекта

Полигон в полигоне: строгая вложенность

Для полигонов вложенность определяется не только фактом отсутствия пересечений, но и положением всех вершин внутреннего полигона относительно внешнего.

Условие строгой вложенности:

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

При несоблюдении хотя бы одного условия результат считается ложным.

Мультиполигоны и иерархия вложенности

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

  • не пересекаться
  • иметь внутренние пустоты
  • образовывать сложные структуры островов и анклавов

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

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

Внутренние дыры (holes) и их роль во вложенности

Полигон в GeoJSON может содержать:

  • внешний контур
  • внутренние кольца (holes)

В Turf.js внутренние кольца интерпретируются как области исключения.

Структура полигона:

{
  type: "Polygon",
  coordinates: [
    [ /* внешний контур */ ],
    [ /* hole 1 */ ],
    [ /* hole 2 */ ]
  ]
}

Алгоритм вложенности учитывает:

  • точки внутри внешнего кольца
  • точки вне внутренних колец
  • исключение областей дыр

Таким образом, точка может находиться внутри bounding polygon, но не принадлежать реальной области из-за hole.

Геометрическая предобработка: bounding box

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

  • быстрый тест пересечения
  • отсев очевидно внешних объектов

Если bounding box не пересекаются, дальнейшая проверка вложенности не выполняется.

Проверка сложных вложенных структур

Для сложных сцен (например, кадастровые данные или административные границы) применяется каскадная проверка:

  1. Проверка bounding box
  2. Проверка пересечений рёбер
  3. Проверка включения вершин
  4. Проверка дыр и исключений
  5. Финальная топологическая валидация

Пример анализа вложенности полигонов

import booleanContains from "@turf/boolean-contains";

const outer = {
  type: "Feature",
  geometry: {
    type: "Polygon",
    coordinates: [[
      [70, 50],
      [75, 50],
      [75, 55],
      [70, 55],
      [70, 50]
    ]]
  }
};

const inner = {
  type: "Feature",
  geometry: {
    type: "Polygon",
    coordinates: [[
      [71, 51],
      [74, 51],
      [74, 54],
      [71, 54],
      [71, 51]
    ]]
  }
};

const result = booleanContains(outer, inner);

Частичные пересечения и отсутствие вложенности

Вложенность считается нарушенной при следующих сценариях:

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

Для таких случаев используется:

  • booleanIntersects
  • booleanDisjoint

Иерархия пространственных отношений

В Turf.js пространственные отношения образуют логическую систему:

  • disjoint → отсутствует связь
  • intersects → частичное пересечение
  • within/contains → строгая вложенность
  • equals → геометрическое совпадение

Эта иерархия используется при построении пространственных индексов и фильтрации объектов в GIS-системах.

Практическая модель вложенности

При обработке реальных данных вложенность редко является бинарной характеристикой. Чаще она интерпретируется как:

  • строгая геометрическая вложенность
  • слабая (с допусками) вложенность
  • топологическая принадлежность с исключениями (holes, границы, мультигеометрии)

В Turf.js это отражается в комбинировании функций проверки и предварительных фильтров, обеспечивающих устойчивость к неточностям координат и сложным геометрическим конфигурациям.