【问题标题】:Why doesn't STDifference between a LINESTRING and a POINT on the line string yield a MULTILINESTRING of the two pieces?为什么线串上的 LINESTRING 和 POINT 之间的 STDifference 不会产生这两个部分的 MULTILINESTRING?
【发布时间】:2010-01-28 19:30:59
【问题描述】:
DECLARE @Route geography
SET @Route = geography::STLineFromText('LINESTRING(-0.175 51.0, -0.175 59.0)',4326)

DECLARE @Route2 geography
SET @Route2 = @Route.STDifference(geography::STPointFromText('POINT(-0.175 52)', 4326))

SELECT @Route2

为什么@Route2 的计算结果为LINESTRING (-0.175 59, -0.175 51),而不是由点两侧的线段组成的MULTILINESTRING

我能够做到这一点的唯一方法是创建第二个长度非常短 (0.0001) 的 LINESTRING 并使用它来减去。它可以工作,但不是很优雅。

【问题讨论】:

    标签: sql sql-server sql-server-2008 gis


    【解决方案1】:

    问题似乎源于引擎无法表示以下内容:(我使用 1D 语法以使其更易于理解。)

    [1, 3] - 2 = [1, 2) U (2, 3]

    相反,它执行[1, 3] - 2 = [1, 2] U [2, 3],然后将其简化回[1, 3]

    这种情况下的解决方案是手动进行计算,或者,如果您的应用程序允许,在减去的点周围添加一个非常小的缓冲区以使其占用空间。在问题的示例中,我这样做:

    DECLARE @Route geography
    

    SET @Route = geography::STLineFromText('LINESTRING(-0.175 51.0, -0.175 59.0)',4326)

    DECLARE @Route2 geography
    SET @Route2 = @Route.STDifference(geography::STPointFromText('POINT(-0.175 52)', 4326).STBuffer(0.01))
    
    SELECT @Route2
    

    这个 0.01 米的缓冲区在我的应用程序中是无关紧要的,但它解决了问题——我现在得到一个带有两块的 MULTILINESTRING。唯一的问题是它们不相交,但我认为这是意料之中的。

    【讨论】:

    • 完全是天才
    猜你喜欢
    • 2018-08-23
    • 2019-03-07
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多