【问题标题】:how to split overlapping ring polygons by priority order in SQL Server如何在 SQL Server 中按优先级顺序分割重叠的环形多边形
【发布时间】:2021-08-30 12:01:17
【问题描述】:
我有一个包含 750 个圆形多边形的 SQL Server 空间层。每个多边形都有一个优先级编号“siteorder”)并且一些多边形重叠(在某些情况下,与多个其他多边形重叠)。我想分割重叠区域,只保留具有最高站点顺序的圆圈。
理想情况下,我希望在 SQL Server 中执行此操作,因为在此之后我还需要执行几个步骤。
我在 QGIS 中生成了下面的图像,但它不能轻松地重新加入。
有人可以帮忙吗?
谢谢
抢
【问题讨论】:
标签:
sql-server
spatial
intersection
overlap
【解决方案1】:
我的想法是做以下算法:
- 从最高排序顺序到最低排序顺序循环所有圆圈。这简化了重叠的生成,因为一个多边形不能被较低排序顺序的一个重叠
- 通过生成一个“巨型多边形”来跟踪所有以前的多边形,它是所有以前的联合。这简化了“较低”排序多边形的重叠。
- 当前多边形将是圆与“巨型多边形”的差异,即圆的其余部分不重叠。
现在对于代码,我首先在#t-table 中创建一些测试数据,然后进行递归 cte 以生成多边形。如果更简单,您还可以使用 while 循环或光标
-- Generate some test data
create table #t_polygons (id int identity, sortorder INT, geomPoint geometry)
declare @i int = 0
, @geom GEOMETRY
, @str NVARCHAR(30)
while @i < 700
begin
set @str = 'POINT (' + CAST(RAND() * 200 AS VARCHAR(10)) + ' '
set @str = @str + CAST(RAND() * 200 AS VARCHAR(10)) + ')'
set @geom = @str
insert into #t_polygons (
sortorder, geomPoint
)
select rand() * 5
, @geom.STBuffer(RAND() * 10)
set @i = @i + 1
end
select *
from #t_polygons
-- Loop through polygons one by one
;with cte as (
select row_number() OVER(ORDER BY sortorder DESC, id) AS sort
, *
FROM #t_polygons
)
, cte2 AS (
select id
, geomPoint as mergedPoint
, geomPoint AS thisPoint
, sort
from cte
WHERE sort = 1
union all
select c.id
, mergedPoint.STUnion(geomPoint)
, geomPoint.STDifference(mergedPoint) AS newPoint
, c.sort
from cte2 c2
inner join cte c
ON c.sort = c2.sort + 1
)
select id, thisPoint, sort
from cte2
option (maxrecursion 0)