Поиск всех областей, которые пересекаются с точкой и наоборот - PostGIS - PullRequest
1 голос
/ 17 ноября 2011

Я разрабатываю проект, использующий PostGIS для хранения пространственных данных, где у меня есть записи, которые содержат данные геометрических точек, и записи, которые содержат данные геометрической области. Чтобы решить мою проблему, я ищу два запроса, которые могут принимать географические формы, а не геометрические фигуры в качестве параметров.

Для запроса A мне нужно вернуть все точки, которые пересекаются с данной областью.

Для запроса B мне нужно вернуть все области, которые пересекаются с данной точкой.

1 Ответ

3 голосов
/ 22 ноября 2011

Запрос практически одинаков для любого направления, он зависит только от ваших критериев выбора. Предположим, у вас есть следующая таблица:

---------------------------------------------------
| id | name  | otherdata | geometry(MULTIPOLYGON) |
---------------------------------------------------
| 1  | poly1 | blah      | 1020304050......       |
---------------------------------------------------

с использованием следующего:

SELECT * FROM poly_table

или

SELECT id,name,otherdata,AsText(geometry)

отобразит эту таблицу как есть (позже будет получен более читабельный вывод на английском языке)

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

EG:

SELECT points.* FROM points_table points
INNER JOIN polygon_table polys ON ST_Within(points.geometry,polys.geometry)
WHERE polys.id = 1 -- Or some other where clause to restrict the polygon area to the one you want.

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

примечание: здесь я использую ST_With, но в PostGIS могут присутствовать другие геометрические операторы, которые могут выполнять много других типов проверок, которые бы делали ваши пересечения или ограничивающие измеренияточнее, но для всех них принцип один и тот же.

Для вашего второго запроса необходимый ГИС-SQL будет очень похож, но инстЧтобы вернуть точки для данного поли, вам нужно изменить критерии, чтобы вернуть поля для данной точки:

SELECT polys.* FROM polygon_table polys
INNER JOIN points_table points ON ST_Within(points.geometry,polys.geometry)
WHERE points.id = 1 -- Or some other where clause to restrict the point to the one you want.

ПРИМЕЧАНИЕ: мы сохраняем параметры в 'ST_Within в точно том же порядке, потому что ST_Withinобрабатывает, используя следующее правило:

returns true IF geometry A is within geometry B

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

...