Выберите Пересечь полигон из одного слоя объектов - PullRequest
1 голос
/ 08 октября 2019

У меня есть сотни многоугольников (кругов), где некоторые многоугольники пересекаются друг с другом. Этот многоугольник происходит из одного векторного слоя. Я пытаюсь удалить пересекающиеся круги.

Это похоже на вопрос: ссылка , но в них использовались два разных слоя. В моем случае это пересечение из отдельных слоев объектов.

Ответы [ 2 ]

2 голосов
/ 08 октября 2019

Если я правильно понял ваш вопрос, вам просто нужно создать CTE или простой подзапрос.

Это может дать вам хорошее представление о том, как решить вашу проблему:

CREATE TABLE t (id INTEGER, geom GEOMETRY);

INSERT INTO t VALUES
(1,'POLYGON((-4.54 54.30,-4.46 54.30,-4.46 54.29,-4.54 54.29,-4.54 54.30))'),
(2,'POLYGON((-4.66 54.16,-4.56 54.16,-4.56 54.14,-4.66 54.14,-4.66 54.16))'),
(3,'POLYGON((-4.60 54.19,-4.57 54.19,-4.57 54.15,-4.60 54.15,-4.60 54.19))'),
(4,'POLYGON((-4.40 54.40,-4.36 54.40,-4.36 54.38,-4.40 54.38,-4.40 54.40))');

Этот набор данных содержит всего 4 многоугольника, и два из них перекрываются, как показано на следующем рисунке:

enter image description here

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

SELECT id, ST_AsText(geom) FROM t
WHERE id NOT IN (
 WITH j AS (SELECT * FROM t)
  SELECT j.id
  FROM j
  JOIN t ON t.id <> j.id
  WHERE ST_Intersects(j.geom,t.geom) 
);

 id |                              st_astext                              
----+---------------------------------------------------------------------
  1 | POLYGON((-4.54 54.3,-4.46 54.3,-4.46 54.29,-4.54 54.29,-4.54 54.3))
  4 | POLYGON((-4.4 54.4,-4.36 54.4,-4.36 54.38,-4.4 54.38,-4.4 54.4))
(2 rows)

enter image description here

1 голос
/ 08 октября 2019

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

DELETE 
FROM myTable t1 
WHERE EXISTS (SELECT 1 FROM myTable t2 WHERE t2.id <> t1.id AND ST_Intersects(t1.geom, t2.geom))
...