为什么这个 SQL 服务器几何查询没有返回任何几何?

Why is this SQL Server geometry query returning no geometry?

我在 SQL Server 2017 中查询几何线上最接近给定点的点。以下适用于某些数据,但不适用于其他数据。我无法理解其中的矛盾。

declare @line geometry = 'LINESTRING(0 0, 10 10)' 
declare @p1 geometry = 'POINT(3 2)'
declare @p2 geometry = 'POINT(3 1)'

select @p1.STBuffer(@p1.STDistance(@line)).STIntersection(@line).ToString()
select @p2.STBuffer(@p2.STDistance(@line)).STIntersection(@line).ToString()

p1 的结果如预期的那样 POINT (2.500000 2.499999)。 p2 的结果是 GEOMETRYCOLLECTION EMPTY,我想知道为什么。点数没有什么不同。

空间类型坐标和距离计算结果均为浮点数,并非精确实数。因此,在进行比较时,您必须在浮点精度限制下测试舍入和截断差异的一些容差。

因此,如果您以较小的公差进行缓冲,则效果很好:

declare @line geometry = 'LINESTRING(0 0, 10 10)' 
declare @p1 geometry = 'POINT(3 2)'
declare @p2 geometry = 'POINT(3 1)'

select @p1.STBuffer(1.0000000001*@p1.STDistance(@line)).STIntersection(@line).ToString()
select @p2.STBuffer(1.0000000001*@p2.STDistance(@line)).STIntersection(@line).ToString()

这与

基本相同
select 'true' where 2 = power(sqrt(2),2)

从字面上看,几何点的 STDistance 是 sqrt((x1-x2)^2+(y1-x2)^2)