首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TSQL - STSymDifference

TSQL - STSymDifference
EN

Stack Overflow用户
提问于 2018-12-24 10:55:16
回答 2查看 93关注 0票数 0

这些文件指出:

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

给予@g3

代码语言:javascript
复制
LINESTRING (-122.348 47.649, -119.119263 46.18363401)

@g2

代码语言:javascript
复制
POINT (-119.119263 46.18363401)

为什么@g3.STSymDifference()是.STAsText()

代码语言:javascript
复制
LINESTRING (-122.348 47.649, -119.119263 46.18363401)

一个点都没有(-122.348 47.649)?

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

EN

回答 2

Stack Overflow用户

发布于 2018-12-24 14:09:29

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

四舍五入。坐标系具有有限的精度,所以当您从一条线中移除端点时,新的端点应该是什么?

没有很好的答案。这条线的长度不会改变。

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

例如

代码语言:javascript
复制
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()

输出

代码语言:javascript
复制
GEOMETRYCOLLECTION EMPTY
票数 1
EN

Stack Overflow用户

发布于 2018-12-24 14:32:40

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

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53912469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档