Sql server TSQL-stsym差分

Sql server TSQL-stsym差分,sql-server,tsql,spatial,Sql Server,Tsql,Spatial,文件规定: 返回一个对象,该对象表示一个地理实例或另一个地理实例中的所有点,但不表示位于两个实例中的点 给定@g3 LINESTRING (-122.348 47.649, -119.119263 46.18363401) 和@g2 POINT (-119.119263 46.18363401) 为什么是@g3.STSymDifference.statext LINESTRING (-122.348 47.649, -119.119263 46.18363401) 没有一点-122.348

文件规定:

返回一个对象,该对象表示一个地理实例或另一个地理实例中的所有点,但不表示位于两个实例中的点

给定@g3

LINESTRING (-122.348 47.649, -119.119263 46.18363401)
和@g2

POINT (-119.119263 46.18363401)
为什么是@g3.STSymDifference.statext

LINESTRING (-122.348 47.649, -119.119263 46.18363401)
没有一点-122.348 47.649

点-119.119263 46.18363401在@g2和@g3中,不排除在外

点-119.119263 46.18363401在@g2和@g3中,不排除在外

四舍五入。坐标系的精度是有限的,因此当从直线上删除端点时,新端点应该是什么

这个问题没有很好的答案。这条线的长度不变

如果你试图确定一个点是否在一条线上,你会得到类似的精度和舍入奇异性

乙二醇

输出

GEOMETRYCOLLECTION EMPTY
点-119.119263 46.18363401在@g2和@g3中,不排除在外

四舍五入。坐标系的精度是有限的,因此当从直线上删除端点时,新端点应该是什么

这个问题没有很好的答案。这条线的长度不变

如果你试图确定一个点是否在一条线上,你会得到类似的精度和舍入奇异性

乙二醇

输出

GEOMETRYCOLLECTION EMPTY

通过将线字符串转换为一系列点,并将该点与该系列进行比较,我找到了您的示例的解决方案。我希望这能有所帮助

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

通过将线字符串转换为一系列点,并将该点与该系列进行比较,我找到了您的示例的解决方案。我希望这能有所帮助

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

这不是我想要的答案。然而,您的回答包含了一个绝妙的技巧——您的CTE整齐地按顺序列举了地理对象中的点。这不是我想要的答案。然而,您的响应包含了一个绝妙的技巧——您的CTE整齐地按顺序枚举地理对象中的点。