sql - 将表格的多个重叠多边形合并为一个并删除已合并的一个
问题描述
我有多个多边形,如果它们重叠,我想组合它们
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 行合并几何。
解决方案
我认为可以汇总如下:
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))
高温高压
推荐阅读
- javascript - 网络音频振荡器非常响亮?
- javascript - 隐藏的 JavaScript 负载
- macos - 修复 xnu 构建后的 kextcache“找不到符号”错误
- sql-server - 如果存在相同的值(例如给定的产品名称),如何在 SQL Server 中组合行?
- c# - 按钮文本在按下时更改,再次按下时更改回来
- python - 截断日期时间对象熊猫
- postcss - 找不到带有 postcss 的模块 styles.css
- css - CSS网格 - 元素的可变跨度
- python - 创建一个 Python 生成器,从两个大列表中生成整数的有序乘积
- django - wagtail 为 parentalkey 定制生成的管理员