【问题标题】:How to fill holes in MULTIPOLYGON in SQL Server 2008 spatial CLR如何在 SQL Server 2008 空间 CLR 中填充 MULTIPOLYGON 中的孔
【发布时间】:2012-02-01 13:49:30
【问题描述】:

我有一个看起来像中间有一个空洞的星星的多面体: image

如何将此多面体转换为单个多边形或多面体,其中还包括中间的孔,例如填补漏洞(使用 SQL Server 2008 CLR)?

空星的WKT: MULTIPOLYGON (((-75.850724788384952 39.781027647924496, -75.847514688412119 39.777165541462658, -75.835440819564724 39.781232982437771, -75.850724788384952 39.781027647924496)), ((-75.861083592601616 39.772592386436379, -75.836642464570019 39.764081172000729, -75.847514688412119 39.777165541462658, -75.861083592601616 39.772592386436379, -75.861083592601616 39.772592386436379)), ((-75.866832035574916 39.780809081927849, -75.850724788384952 39.781027647924496, -75.857585145413083 39.78927966926625, -75.866832035574916 39.780809081927849)), ((-75.8843643235475 39.764740937261692, -75.861083592601616 39.772592386436379, -75.8717486771904 39.776304058191712, -75.8843643235475 39.764740937261692)), ((-75.884021002483152 39.780573380153484, -75.8717486771904 39.776304058191712, -75.866832035574916 39.780809081927849, -75.884021002483152 39.780573380153484)))

谢谢。

【问题讨论】:

    标签: sql-server-2008 spatial


    【解决方案1】:

    也许不是最快的方法,但你可以做到的一种方法:

    1. 计算包含输入的几何体:使用 STConvexHull,它会返回包含整个输入几何体的单个多边形,包括几何体内部的空白区域和几何体外部的凹面(例如你的星星点数)。
    2. 找到空白区域:使用 STDifference,从凸包中减去输入,这将返回前面提到的那些空白区域的多边形。
    3. 确定哪些空白区域在您的输入之外:使用 STBoundary 获取凸包的边界。当且仅当它不接触凸包的边界时,一个区域才在您的输入几何图形内。使用 STTouches 进行检查。
    4. 计算几何图形和内部空白区域的并集:使用 STUnion。

    这是一个示例脚本:

    DECLARE @g geometry;
    DECLARE @hull geometry;
    DECLARE @regions geometry;
    DECLARE @boundary geometry;
    
    SET @g = geometry::STGeomFromText(...);
    SET @hull = @g.STConvexHull();
    SET @regions = @hull.STDifference(@g);
    SET @boundary = @hull.STBoundary();
    
    WITH Geoms AS
    (
        SELECT 1 i
    
        UNION ALL 
    
        SELECT i + 1
        FROM Geoms
        WHERE i < @regions.STNumGeometries()
    )
    SELECT @g = @g.STUnion(@regions.STGeometryN(i))
    FROM Geoms
    WHERE @regions.STGeometryN(i).STTouches(@boundary) = 0
    
    SELECT @g
    

    【讨论】:

    • @user1181846 绝对 - 如果您满意,请考虑接受它作为答案。
    • 这是绝对的黄金。谢谢!
    • 很好的解决方案。对现有功能和巧妙的 CTE 进行富有想象力的使用。
    猜你喜欢
    • 2011-01-08
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-27
    • 1970-01-01
    相关资源
    最近更新 更多