Пространственные отношения: содержит, пересекает
Урок вводит словарь пространственных отношений между геометриями и операции буфера, пересечения и объединения, которыми оперирует векторный анализ.
Пространственный предикат — это вопрос вида «да/нет» об отношении двух геометрий: содержит ли 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.