TSQL - STSymDifference - PullRequest
       8

TSQL - STSymDifference

0 голосов
/ 24 декабря 2018

Документация гласит:

Возвращает объект, который представляет все точки, которые находятся либо в одном экземпляре географии, либо в другом экземпляре географии, но не те точки, которые лежат в обоих экземплярах.

Дано @ g3

LINESTRING (-122.348 47.649, -119.119263 46.18363401)

И @ g2

POINT (-119.119263 46.18363401)

Почему @ g3.STSymDifference (). STAsText ()

LINESTRING (-122.348 47.649, -119.119263 46.18363401)

Ини одной точки (-122,348 47,649)?

Точка -119.119263 46.18363401 находится в @ g2 и @ g3 и не исключается.

Ответы [ 2 ]

0 голосов
/ 24 декабря 2018

Я нашел решение для вашего примера, преобразовав линейную строку в серию точек и сравнив точку с этой серией.Я надеюсь, что это поможет.

DECLARE @LinestringGeometry GEOMETRY;
DECLARE @PointGeometry GEOMETRY;
SET @LinestringGeometry = GEOMETRY::STGeomFromText('LINESTRING (-122.348 47.649, -119.119263 46.18363401)', 4269);
SET @PointGeometry = GEOMETRY::STGeomFromText('POINT (-119.119263 46.18363401)', 4269);

--Get series of points within the linestring
WITH GeometryPoints(N, Point) AS  
( 
   SELECT 1,  @LinestringGeometry.STPointN(1)
   UNION ALL
   SELECT N + 1, @LinestringGeometry.STPointN(N + 1)
   FROM GeometryPoints GP
   WHERE N < @LinestringGeometry.STNumPoints()  
)

--Compare the points
SELECT Point.STAsText() AS 'UniquePoint'
FROM GeometryPoints
WHERE Point.STEquals(@PointGeometry) = 0
0 голосов
/ 24 декабря 2018

Точка -119.119263 46.18363401 находится в @ g2 и @ g3 и не исключена.

Округление.Система координат имеет конечную точность, поэтому, когда вы удаляете конечную точку из линии, какой должна быть новая конечная точка?

На это нет большого ответа.Длина линии не меняется.

Вы получите схожую точность и странность округления, если попытаетесь определить, находится ли точка на линии.

EG

declare @g3 geography = geography::Parse('LINESTRING (-122.348 47.649, -119.119263 46.18363401)')
declare @g2 geography = @g3.STIntersection(geography::Parse('LINESTRING (-120.5 48, -120.5 46)'))

select @g3.STIntersection(@g2).STAsText()

вывод

GEOMETRYCOLLECTION EMPTY
...