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