Пересечение геометрий — это пространственное отношение, при котором две геометрические фигуры имеют хотя бы одну общую точку. В геоинформационных системах это базовая операция, от которой зависят пространственные фильтры, анализ зон влияния, проверка коллизий объектов и построение сложных геопространственных запросов.
В модели GeoJSON, используемой в Turf.js, геометрии представлены как
стандартизированные объекты: Point,
LineString, Polygon, а также их коллекции
(FeatureCollection). Пересечение определяется не только
визуальным наложением, но и строгими топологическими правилами.
Две геометрии A и B считаются пересекающимися, если выполняется условие:
p, такая что
p ∈ A и p ∈ B.Это определение охватывает несколько случаев:
Точка считается пересекающейся с полигоном, если она находится внутри или на границе полигона. В Turf.js это проверяется через пространственные предикаты, основанные на алгоритме луча (ray casting) или winding number.
Линия пересекает полигон, если:
Пересечение полигонов — наиболее сложный случай. Оно может включать:
Функция определяет, пересекаются ли две геометрии в любом смысле.
import booleanIntersects from '@turf/boolean-intersects';
const result = booleanIntersects(featureA, featureB);
Поведение:
true, если существует хотя бы одна общая
точкаОсобенность: является наиболее общей и быстрой проверкой пространственного взаимодействия.
Функция вычисляет фактическую геометрию пересечения.
import intersect from '@turf/intersect';
const result = intersect(polygonA, polygonB);
Возвращаемое значение:
Feature<Polygon> или
Feature<MultiPolygon>null, если пересечения нетОсобенность: в отличие от
booleanIntersects, возвращает не булево значение, а новую
геометрию, образованную общей областью.
Перед точными вычислениями Turf.js часто использует упрощённую проверку ограничивающих прямоугольников (BBox).
Если bounding box двух геометрий не пересекается, дальнейшие вычисления не выполняются.
Это резко снижает вычислительную сложность:
Для линий и полигонов используется анализ пересечений отрезков.
Каждый линейный сегмент сравнивается с сегментами другой геометрии.
Ключевая операция — проверка пересечения двух отрезков:
Для определения попадания точки внутрь полигона используется метод луча:
Turf.js работает в географических координатах (WGS84), где:
Это вносит дополнительные сложности:
Геометрии считаются пересекающимися, даже если:
Пример: два полигона, соприкасающиеся по ребру.
Если один полигон полностью находится внутри другого:
intersect будет внутренний полигонДля MultiPolygon и MultiLineString проверка
выполняется поэлементно:
Проверяет, содержит ли одна геометрия другую полностью.
Обратная операция к contains.
Определяет пересечение с пересечением границ, характерное для линий.
Противоположность пересечения: отсутствие общих точек.
При работе с большим количеством объектов применяются:
simplify)Общий процесс выглядит как последовательность:
intersect)Из-за особенностей чисел с плавающей точкой:
Поэтому в критических задачах часто применяется:
buffer)Пересечение геометрий является фундаментом для: