【问题标题】:merge multiple overlapping polygons of table into one and remove the one already merged将表格的多个重叠多边形合并为一个并删除已合并的一个
【发布时间】:2020-11-27 13:51:42
【问题描述】:

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

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 行合并几何。

【问题讨论】:

    标签: sql postgresql postgis


    【解决方案1】:

    我认为可以汇总如下:

    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))
    

    HTH

    【讨论】:

    • 它应该删除已经合并的,所以最终结果应该只有 1 行。
    • 其实我找到了这个解决方案。选择 st_astext((ST_DUMP(ST_UNION(ST_SNAPTOGRID(geom,0.0000000)))).geom) 作为 geom FROM public.testpostgis
    • 如果您假设或能够确保您的所有数据总是具有重叠区域,那么,是的,这可能是解决方案。但是您提到“我有多个多边形,如果它们重叠,我想组合它们”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-10
    • 2012-11-24
    • 2021-06-18
    • 2017-07-22
    • 2015-08-26
    • 2015-11-15
    • 1970-01-01
    相关资源
    最近更新 更多