首页 > 解决方案 > 将表格的多个重叠多边形合并为一个并删除已合并的一个

问题描述

我有多个多边形,如果它们重叠,我想组合它们

id;geom
1;"POLYGON((2 1,4 1,4 4,2 4,2 1))"
2;"POLYGON((3 3,5 3,5 5,3 5,3 3))"
3;"POLYGON((1 0,3 0,3 2,1 2,1 0))"

这里所有的 1 都与其他两个 (1,2) 和 (1,3) 重叠,所以最终结果应该是一个大多边形,所以我希望现在表中只有 1 行。

我在查询中间的某个地方,我得到了重叠的多边形,但它被合并了,但是并结合在一起,而且已经合并的一个也没有被删除。

 SELECT a.id as a_id, b.id as b_id, ST_Overlaps(a.geom, b.geom), st_astext(ST_Union(a.geom, b.geom)) as new_geom
  FROM public.testpostgis a
  JOIN public.testpostgis b ON a.geom && b.geom AND ST_Overlaps(a.geom, b.geom)
 WHERE a.id <> b.id

这会像这样打印输出

a_id;b_id;overlap;new_geometry
1;2;t;"POLYGON((4 3,4 1,2 1,2 4,3 4,3 5,5 5,5 3,4 3))"
1;3;t;"POLYGON((2 2,2 4,4 4,4 1,3 1,3 0,1 0,1 2,2 2))"
2;1;t;"POLYGON((3 4,3 5,5 5,5 3,4 3,4 1,2 1,2 4,3 4))"
3;1;t;"POLYGON((3 1,3 0,1 0,1 2,2 2,2 4,4 4,4 1,3 1))"

最后,表格不应该包含重叠的多边形,所以这里应该只有 1 行合并几何。

标签: sqlpostgresqlpostgis

解决方案


我认为可以汇总如下:

select a_id, count(1) as union_cnt, st_astext(st_union(new_geom))
from (
  SELECT a.id as a_id, ST_Overlaps(a.geom, b.geom),
      ST_Union(a.geom, b.geom) as new_geom
  FROM gis1 a
  JOIN gis1 b ON a.geom && b.geom AND ST_Overlaps(a.geom, b.geom)
  WHERE a.id <> b.id
) x
group by a_id
order by count(1) DESC
LIMIT 1;

您的示例的结果是:

1|2|POLYGON((2 2,2 4,3 4,3 5,5 5,5 3,4 3,4 1,3 1,3 0,1 0,1 2,2 2))

高温高压


推荐阅读