Почему STDifference между LINESTRING и POINT в строке строки не приводит к MULTILINESTRING из двух частей? - PullRequest
1 голос
/ 28 января 2010
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, состоящего из отрезков по обе стороны от точки?

Единственный способ, которым я смог сделать это, это создать второй LINESTRING с очень маленькой длиной (0,0001) и использовать его для вычитания. Это работает, но не очень элегантно.

1 Ответ

1 голос
/ 29 января 2010

Похоже, проблема возникает из-за того, что у движка нет способа представить следующее: (Я использую 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 с двумя частями. Единственное, что нужно, это то, что они не пересекаются, но я полагаю, этого следовало ожидать.

...