【问题标题】: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】:

    我的想法是做以下算法:

    1. 从最高排序顺序到最低排序顺序循环所有圆圈。这简化了重叠的生成,因为一个多边形不能被较低排序顺序的一个重叠
    2. 通过生成一个“巨型多边形”来跟踪所有以前的多边形,它是所有以前的联合。这简化了“较低”排序多边形的重叠。
    3. 当前多边形将是圆与“巨型多边形”的差异,即圆的其余部分不重叠。

    现在对于代码,我首先在#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)
            
    

    【讨论】:

    • 递归 CTE 是一个聪明的解决方案。不错!
    猜你喜欢
    • 2020-01-26
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多