从单个要素图层中选择相交多边形

时间:2019-10-08 10:06:14

标签: postgresql postgis

我有数百个多边形(圆形),其中一些多边形彼此相交。该多边形来自单个要素图层。我想做的是删除相交的圆。

它类似于以下问题:link,但它们使用的是两个不同的层。在我的情况下,交点来自单个要素图层。

2 个答案:

答案 0 :(得分:2)

如果我正确理解您的问题,则只需创建一个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 :(得分:1)

您可以使用EXISTS子句编写非常清晰的delete语句。从字面上看,您想删除行,其中存在与几何相交的其他行:

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