Пространственные отношения
- О чём это занятие
- Главный инструментарий пространственного SQL: предикаты отношений между геометриями — от ST_Intersects до ST_DWithin. Каждый предикат можно «пощупать» в интерактивной сцене, а затем применить к настоящим улицам, районам и станциям метро Нью-Йорка.
- Аннотация
- Занятие начинается с повторения функций свойств геометрии из практики 4 — координаты точки, длина и концы линии, площадь и кольца полигона. Затем вводится понятие пространственных отношений и их топологической природы. По одному разбираются предикаты PostGIS: ST_Intersects и его противоположность ST_Disjoint, ST_Overlaps для частичного перекрытия, ST_Touches для касания границами, пара ST_Within / ST_Contains для вложенности, ST_Distance для расстояния и ST_DWithin как индекс-дружественная замена сравнению расстояния. Интерактивная сцена позволяет двигать одну фигуру относительно другой и наблюдать, какие предикаты истинны в каждом положении. Практическая часть — три классические задачи на учебной базе: улицы, пересекающие Гринвич-Виллидж, районы-соседи Чайнатауна через самосоединение и улицы в 500 метрах от станции метро, с сохранением результата в таблицу и отображением в QGIS. Дополнительные задания — плотность населения Манхэттена и площадь Гарлема в трёх проекциях.
- Пререквизиты
- Практика 4 — геометрические типы и функции свойств; теория пространственного анализа — лекция 4.
- Материалы к занятию
- Учебная база nyc_data (восстановлена в практике 3). Работа ведётся в pgAdmin (Query Tool) и QGIS.
1. Повторение: свойства объектов
Выпишите основные свойства объектов и функции, которые их возвращают, — это разминка по практике 4:
| Геометрия | Функции | Свойства |
|---|---|---|
| точка | ST_X, ST_Y | координаты X (долгота) и Y (широта) |
| линия | ST_Length, ST_StartPoint, ST_EndPoint, ST_NPoints | длина, первая и последняя точки, число вершин |
| полигон | ST_Area, ST_NRings, ST_ExteriorRing | площадь, число колец, внешнее кольцо |
Запомните эти функции — они постоянно комбинируются с предикатами отношений: «длина улиц, пересекающих район», «площадь блоков в радиусе от станции».
2. Пространственные отношения
Пространственные отношения в ГИС — это внутренние взаимоотношения между пространственными объектами. Топологические пространственные отношения — отношения между географическими объектами, которые определяют, где и как точки и линии соединяются в узлах на карте, порядок соединения, форму дуги или полигона.
2.1. Предикаты PostGIS
Пересечение. ST_Intersects(геометрия A, геометрия B)
возвращает значение TRUE, если у двух фигур есть какое-либо общее пространство —
если их границы или внутренние области пересекаются.
Находится вне. Противоположность ST_Intersects —
ST_Disjoint(геометрия A, геометрия B): истинно, если две геометрии
не пересекаются.
Пересечение по области. ST_Overlaps(геометрия A, геометрия
B) сравнивает две геометрии одинаковой размерности и возвращает TRUE, если
при их пересечении получается геометрия, отличная от обеих, но той же размерности.
Имеет границу (соприкасается). ST_Touches(геометрия A,
геометрия B) проверяет, соприкасаются ли две геометрии на своих границах,
но не пересекаются ли внутренними областями: TRUE, если границы геометрий пересекаются
или если только одна из внутренних областей пересекает границу другой.
Находится внутри. ST_Within и ST_Contains
проверяют, полностью ли одна геометрия находится внутри другой:
ST_Within(A, B) возвращает TRUE, если первая геометрия полностью лежит во второй;
ST_Contains(A, B) — если вторая геометрия полностью содержится в первой.
ST_Within даёт результат, прямо противоположный ST_Contains (при переставленных
аргументах).
Расстояние между объектами. ST_Distance(A, B) вычисляет
кратчайшее расстояние между двумя геометриями и возвращает его числом с плавающей
точкой.
Находится на расстоянии. Используйте
ST_DWithin(A, B, R) вместо ST_Distance(A, B) < R,
чтобы получить преимущество от пространственного индекса.
2.2. Сводная таблица
| Функция | Описание |
|---|---|
| ST_Contains(A, B) | TRUE, если B полностью содержится в A, и хотя бы одна точка внутренней области B — внутри A |
| ST_Crosses(A, B) | TRUE, если геометрии имеют некоторые, но не все общие внутренние точки |
| ST_Disjoint(A, B) | TRUE, если геометрии не пересекаются — не имеют общих точек |
| ST_Distance(A, B) | минимальное евклидово расстояние между геометриями в проекционных единицах |
| ST_DWithin(A, B, R) | TRUE, если геометрии находятся на расстоянии не более R друг от друга |
| ST_Equals(A, B) | TRUE, если геометрии представляют одну и ту же геометрию, независимо от направления |
| ST_Intersects(A, B) | TRUE, если геометрии пересекаются — имеют общие области |
| ST_Overlaps(A, B) | TRUE, если геометрии имеют общую область, но не содержатся полностью друг в друге |
| ST_Touches(A, B) | TRUE, если геометрии касаются, но их внутренние области не пересекаются |
| ST_Within(A, B) | TRUE, если геометрия A полностью содержится внутри геометрии B |
2.3. Тренажёр: подвигайте геометрию
Перетаскивайте оранжевый квадрат B мышью относительно синего полигона A — панель показывает, какие предикаты истинны в текущем положении. Найдите положения, в которых: фигуры не связаны (Disjoint), касаются краями (Touches), частично перекрываются (Overlaps), B целиком внутри A (Within/Contains), и проследите, как меняется ST_Distance. Пунктирное кольцо — зона ST_DWithin с радиусом 80.
Фигуры — прямоугольники, предикаты вычисляются честно по их координатам; при сближении меньше 4 пикселей квадрат «прилипает» к границе, чтобы касание (Touches) было достижимо мышью.
3. Практика на базе Нью-Йорка
3.1. Улицы через Гринвич-Виллидж
Найдите все улицы, которые пересекают границы района Greenwich Village, и выведите их геометрию.
показать пошаговое решение
Шаг 1 — источники: районы и улицы лежат в разных таблицах, обе нужны в FROM:
FROM nyc_neighborhoods, nyc_streets
Шаг 2 — столбцы: название района, название улицы и геометрия улицы:
SELECT nyc_neighborhoods.name AS neighborhood, nyc_streets.name AS street, nyc_streets.wkb_geometry
Шаг 3 — условие: конкретный район и предикат пересечения:
SELECT nyc_neighborhoods.name AS neighborhood, nyc_streets.name AS street, nyc_streets.wkb_geometry FROM nyc_neighborhoods, nyc_streets WHERE nyc_neighborhoods.name = 'Greenwich Village' AND ST_Intersects(nyc_neighborhoods.geom, nyc_streets.wkb_geometry);
3.2. Соседи Чайнатауна
Найдите все районы, которые граничат с районом Chinatown, и выведите их геометрию.
показать решение
Районы сравниваются с районами — таблица соединяется сама с собой через псевдонимы (как в главе 2 РГР с регионами-соседями):
SELECT b.name, b.geom FROM nyc_neighborhoods a, nyc_neighborhoods b WHERE a.name = 'Chinatown' AND ST_Touches(a.geom, b.geom);
ST_Touches выбирает именно граничащие районы: границы соприкасаются, а внутренние области не пересекаются.
3.3. Улицы у станции метро
Найдите улицы, находящиеся на расстоянии менее 500 метров от станции метро East Broadway.
показать решение
SELECT st.name AS street, st.wkb_geometry FROM nyc_streets st, nyc_subway_stations s WHERE s.name = 'East Broadway' AND ST_DWithin(st.wkb_geometry, s.geom, 500);
Данные хранятся в метрической проекции, поэтому 500 — это метры.
Сохраним результат в таблицу и откроем её в QGIS:
DROP TABLE IF EXISTS streets_near_east_broadway; CREATE TABLE streets_near_east_broadway AS SELECT st.name AS street, st.wkb_geometry FROM nyc_streets st, nyc_subway_stations s WHERE s.name = 'East Broadway' AND ST_DWithin(st.wkb_geometry, s.geom, 500); SELECT * FROM streets_near_east_broadway;
После выполнения запроса в QGIS откройте «Подключения» и нажмите «Подключиться» — это работает как «обновить страницу»; новая таблица появится в списке слоёв.
3.4. Дополнительные задания
Вычислите плотность населения для каждого блока в районе Manhattan и сохраните результаты в новую таблицу.
подсказка
Плотность — это popn_total / ST_Area(geom). Отберите блоки WHERE boroname = 'Manhattan', результат оберните в CREATE TABLE … AS SELECT. Площадь возвращается в квадратных метрах — при желании переведите в км², умножив на 1 000 000.
Вычислите площадь Гарлема (Harlem) в разных проекциях: 2263, 32618 и 26918. Функции: ST_Area — расчёт площади, ST_Transform(геометрия, код_проекции) — преобразование проекции.
подсказка
SELECT ST_Area(ST_Transform(geom, 2263)) AS area_2263, ST_Area(ST_Transform(geom, 32618)) AS area_32618, ST_Area(ST_Transform(geom, 26918)) AS area_26918 FROM nyc_neighborhoods WHERE name = 'Harlem';
Обратите внимание на единицы: 2263 — футы, 32618 и 26918 — метры; о выборе проекций — лекция 4.
Контрольные вопросы
-
ST_Intersects истинно при любом общем пространстве — хоть точка касания, хоть полное вложение. ST_Overlaps требует частичного перекрытия геометрий одинаковой размерности: пересечение непусто, но ни одна фигура не содержит другую целиком и результат той же размерности.
-
Когда геометрии соприкасаются только границами: общая точка или общий отрезок границы есть, но внутренние области не пересекаются. Пример — соседние районы: у них общая граница, но нет общей площади.
-
Зеркально: ST_Within(A, B) = ST_Contains(B, A). Within — «A полностью внутри B», Contains — «A полностью содержит B» (при этом хотя бы одна внутренняя точка B должна лежать внутри A).
-
ST_DWithin использует пространственный GiST-индекс: сначала по индексу отбрасываются заведомо далёкие объекты, и расстояние честно считается только для кандидатов. ST_Distance в условии заставляет вычислять расстояние для каждой строки таблицы — полное сканирование.
-
Сравниваются объекты одного набора: «эталонный» район и кандидаты в соседи — обе роли играет nyc_neighborhoods. Псевдонимы a и b дают два независимых экземпляра таблицы; условие a.name = 'Chinatown' AND ST_Touches(a.geom, b.geom) находит все b, граничащие с a.
-
CREATE TABLE имя AS SELECT … (при повторном запуске перед этим DROP TABLE IF EXISTS). В QGIS затем обновить подключение к базе («Подключиться» в диалоге источников) — новая таблица появится в списке слоёв, если содержит столбец геометрии.
-
Во-первых, единицы: EPSG:2263 (State Plane Long Island) использует футы, а 32618 и 26918 (UTM 18N на WGS 84 и NAD83) — метры. Во-вторых, каждая проекция по-своему искажает площади. Сравнивать значения можно только после приведения к одним единицам — и различия останутся из-за искажений (лекция 4).
Источники
- PostGIS Documentation. Spatial Relationships : [сайт]. — URL: https://postgis.net/workshops/postgis-intro/spatial_relationships.html (дата обращения: 18.08.2026).
- PostGIS Reference. ST_DWithin : [сайт]. — URL: https://postgis.net/docs/ST_DWithin.html (дата обращения: 18.08.2026).
- Egenhofer, M. J. Point-Set Topological Spatial Relations / M. J. Egenhofer, R. D. Franzosa // International Journal of Geographical Information Systems. — 1991. — Vol. 5, № 2. — P. 161–174.