Пространственные отношения: содержит, пересекает

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

Пространственный предикат — это вопрос вида «да/нет» об отношении двух геометрий: содержит ли A объект B, пересекаются ли они, касаются ли границами.

Когда вы спрашиваете «какие дома в зоне затопления» или «пересекает ли труба границу участка», вы используете пространственные отношения. У них есть строгий словарь, общий для всех ГИС, потому что он стандартизован консорциумом OGC. Зная этот словарь, вы формулируете анализ точными словами, а не «ну где-то рядом».

Основные предикаты

ПредикатСмысл
contains / withinодна геометрия целиком внутри другой
intersectsесть хотя бы одна общая точка
disjointнет ни одной общей точки
touchesсоприкасаются только границами, без общей площади
overlapsчастично перекрываются
crossesпересекаются «насквозь» (линия через полигон)

Важно различать intersects (хоть одна общая точка — самый широкий) и contains (полное вложение — самый строгий). «Дом пересекает зону» и «дом внутри зоны» — разные запросы с разными ответами.

Операции, порождающие геометрию

Кроме вопросов «да/нет» есть операции, которые строят новую геометрию из существующих:

  • Буфер (buffer) — зона на заданном расстоянии вокруг объекта. «500 метров от станции метро» — это буфер радиуса 500 м вокруг точки.
  • Пересечение (intersection) — общая часть двух фигур. Где зона затопления накладывается на жилой район.
  • Объединение (union) — слияние фигур в одну. Соединить районы в один округ.
  • Разность (difference) — вычесть одну фигуру из другой. Суша = страна минус водоёмы.
   A     B          intersection   union        difference (A-B)
  ###   ***            #*               ###***          ##
  ###***               #*               ###***          ##
  ###   ***            #*               ###***          ##

Как работает под капотом

Все предикаты выводятся из единой модели DE-9IM (Dimensionally Extended 9-Intersection Model): для двух геометрий рассматривают пересечения их внутренностей, границ и внешних областей — выходит матрица $3 \times 3$, и каждый предикат это определённый шаблон этой матрицы. На практике вы не работаете с матрицей напрямую — вызываете готовые методы shapely, которые внутри строят DE-9IM:

from shapely.geometry import Point, Polygon

zone = Polygon([(0, 0), (10, 0), (10, 10), (0, 10)])
house = Point(3, 4)

print(zone.contains(house))   # True: точка внутри зоны
print(zone.intersects(house)) # True

metro = Point(5, 5)
buf = metro.buffer(3)         # круг радиуса 3 вокруг метро
print(zone.intersection(buf).area)  # площадь пересечения

Частые ошибки

  • Путать intersects и contains. Первое — «хоть как-то задевает», второе — «целиком внутри»; это разные результаты.
  • Буферизовать в градусах. Буфер «500» в градусах — это сотни километров; буфер строят в метровой проекции.
  • Забыть про touches. Два соседних района «касаются», но не «перекрываются» — для подсчёта общих границ нужен правильный предикат.

Точность словаря экономит часы

Главная ценность стандартных предикатов в том, что они снимают двусмысленность из постановки задачи. «Дома рядом с дорогой» — фраза, которую каждый поймёт по-своему; «дома, которые intersects с буфером дороги 50 метров» — однозначная инструкция, дающая воспроизводимый результат. Когда заказчик и аналитик договариваются на языке предикатов, исчезает целый класс споров «я имел в виду другое». Поэтому опытный специалист первым делом переводит расплывчатое требование в точную комбинацию отношений и операций — и половина работы оказывается сделана уже на этом шаге.

Стоит держать в голове иерархию строгости. Самый широкий предикат — intersects: он истинен при любом касании, даже в одной точке границы. Строже идёт overlaps (частичное перекрытие площадей), затем contains/within (полное вложение). Особняком стоит touches — общие только границы, без общей площади: им считают соседство районов. Путаница между «задевает» и «целиком внутри» — самая частая логическая ошибка в пространственных запросах, и она не вызывает падения программы, а тихо даёт неверный ответ, что куда опаснее.

Итог

  • Пространственные предикаты — стандартный словарь отношений геометрий (OGC).
  • intersects — самый широкий, contains — самый строгий.
  • Буфер, пересечение, объединение, разность строят новую геометрию.
  • Все предикаты выводятся из модели DE-9IM; на практике их даёт shapely.
Проверьте себя
1. Чем отличается intersects от contains?
AНичем
Bintersects — есть хоть одна общая точка; contains — одна геометрия целиком внутри другой
Ccontains работает только с точками
Dintersects всегда ложно
2. Что такое буфер (buffer)?
AЦентр фигуры
BЗона на заданном расстоянии вокруг объекта
CПлощадь полигона
DТип файла
3. Из какой модели выводятся все пространственные предикаты?
AИз WGS84
BИз модели DE-9IM (матрицы пересечений внутренностей, границ и внешних областей)
CИз формулы гаверсинуса
DИз Shapefile