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
并使用它来减去。它有效,但不是很优雅。
答案 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
两件。唯一的问题是他们没有相交,但我想这是可以预期的。