STIntersection结果为STIntersects = 0

时间:2018-12-28 22:33:02

标签: sql sql-server floating-point geometry geography

我有一条线Dim SapGuiAuto, application, connection, session,SapGui document.write(" SapGuiAuto " & SapGuiAuto &"<br/>") sOrderNumber = Replace(item3 , "[ss]", " ") 'espace document.write(" sOrderNumber " & sOrderNumber &"<br/>") ' Gestion des erreurs On Error Resume Next ' fin Ajout ------------------------------------------------- set WshShell = CreateObject("WScript.Shell") document.write("WshShell " & WshShell &"<br/>" ) Set proc = WshShell.Exec("C:\Program Files (x86)\SAP\FrontEnd\SAPgui\saplogon.exe") Do While proc.Status = 0 WScript.Sleep 100 Loop Set SapGui = GetObject("SAPGUI") document.write(" SapGui " & SapGui &"<br/>") Set application = SapGui.GetScriptingEngine document.write(" application" & application &"<br/>") Set connection = application.Openconnection("Test SAP", True) document.write(" Connection " & connection &"<br/>") Set session = connection.Children(0) document.write(" session " & session &"<br/>") 与另一条线@a相交。当我获取交点并检测它是否与@b相交时,它返回false

@b

2 个答案:

答案 0 :(得分:6)

可以归结为在计算中处理浮点数时应使用的一般方法。您不应该将相等性比较与浮点数一起使用,例如if a == b,而应将它们与在您的应用程序域中有意义的epsilon精度进行比较,例如if abs(a-b) < 1e-8

从概念上讲,它类似于执行一些非平凡的计算,例如:

double a = 2.0;
a = sqrt(a);
a = a*a;

,然后期望if a == 2.0返回true而不是写if abs(a-2.0) < 1e-8


SQL Server中的几何点用浮点数表示,这是不精确的。

DECLARE @intersectionPoint geometry = @a.STIntersection(@b)

尽最大可能计算交点,但永远不会精确。

因此,像@b.STIntersects(@intersectionPoint)这样的表达式在概念上等同于相等比较。它等效于if @b.STDistance(@intersectionPoint) == 0,仅在少数特殊情况下才适用。

您应该改用@b.STDistance(@intersectionPoint) < 1e-8之类的东西。

答案 1 :(得分:4)

这似乎是舍入错误。如果我在您的代码中添加以下内容:

SELECT @b.STDistance(@intersectionPoint);

我得到≈3飞米。除非您以原子级进行测量,否则它可能足以被视为“在线”。

出于好奇,您实际上想解决什么问题?