Использование ST_Union в сочетании с ST_contains

У меня есть база данных многоугольников, где каждый многоугольник состоит из меньших бесшовных многоугольников одного типа. Каждый из этих полигонов (состоящий из меньших полигонов) также иногда пересекается с другими полигональными объектами, также состоящими из их собственных подполигонов.

введите здесь описание изображения

Также в базе есть набор полилиний. Моя цель состоит в том, чтобы объединить все многоугольники в один, а затем извлечь все те полилинии, которые полностью входят в большой многоугольник. Я просто хочу использовать запрос выбора для этой цели. Я пробовал скрипт ниже, но я мог реализовать ST_Union внутри этого патча скрипта.

> Select * From tbl.A a, tbl.b b  where
> ST_Contains(a.geometry,b.geometry) and pol_id in ('1','2','3')

Выше возвращаются полилинии внутри каждого полигона, но те полилинии, которые наполовину находятся в темно-зеленом многоугольнике, а половина в фиолетовом многоугольнике, не извлекаются. Я уверен, что ST_Union поможет здесь, но я не уверен, как это реализовать. Спасибо за вашу помощь.


person Eric    schedule 01.05.2020    source источник


Ответы (1)


Вы можете использовать CTE для создания "объединенного" полигона:

WITH polygon AS (
   SELECT ST_Union(polygon_table.geometry) from polygon_table
)
SELECT
  *
FROM
    linestring_table
  JOIN
    polygon ON ST_Contains(polygon.geometry, linestring_table.geometry)
person Avocado    schedule 01.05.2020
comment
Если polygon_table равно tbl.A, а linestring_table равно tbl.b, то это не работает, или я не могу заставить его работать. Я также не уверен, что polygon здесь в первой строке. - person Eric; 02.05.2020
comment
polygon — это псевдоним для запроса WITH, он содержит результат запроса, поэтому мы можем использовать его внизу в объединении. Не могли бы вы опубликовать схему для tbl? Я немного смущен тем, как вы могли выбирать из них, например: select * from tbl.A. Также, если вы используете postgres, вы должны удалить тег mysql из своего вопроса. - person Avocado; 02.05.2020