为什么行字符串上的LINESTRING和POINT之间的STDifference不会产生两个部分的MULTILINESTRING?

时间:2010-01-28 19:31:00

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

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并使用它来减去。它有效,但不是很优雅。

1 个答案:

答案 0 :(得分: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两件。唯一的问题是他们没有相交,但我想这是可以预期的。