我在SQL Server数据库中有一个表,其中包含2个字段X,Y。这些字段表示字段(美式足球场)上的坐标。 0,0(X,Y)是具有最大值且最远点的起点为145,90(X,Y)的起点。
表格中的每一行都是音高的坐标。
我希望能够测量场上不同坐标之间的距离(数据库中的不同行),例如。 3,9至15,20。我还希望能够测量坐标之间的角度。
我查看了SQL Server中的空间类型等,但在我看来它与Latitude,Longitude有关。
在SQL Server中是否有任何方法可以在SQL中使用自定义映射在自定义点,角度等之间进行测量?
答案 0 :(得分:1)
你还记得代数课中的毕达哥拉斯定理吗? http://betterexplained.com/articles/measure-any-distance-with-the-pythagorean-theorem/这就是用来测量三角形“长”边的尺度,这是你在这里测量的。你不需要任何特别的其他基本数学。你知道从(3,9)到(15,50)的距离是12.这是左右两边的距离,或者X.然后你也知道向下的距离是41(50 - 9)。确定这些点之间的距离是简单的X(2)+ y(2)= c(2)。所以在这个例子中它将是12(2)+ 41(2)= x(2)。
简化为144 + 574 = x(2)
要解决你取718的平方根。这将解析为26.795
如果您想存储此值,您可以轻松制作一个可以为您计算此值的计算列。
- 编辑 -
我不记得从头顶算出斜边角度的公式,但它应该很容易在网上找到。
答案 1 :(得分:1)
作为Sean Lange关于距离的答案的补充,角度部分有点模棱两可。如果p1位于原点,那么您只需编写arctan(p2.y/p2.x)
即可找到该角度。但如果这两点没有固定,那么事情可能会有些含糊不清。
要定义相对于x轴的角度,您需要使用arctan(abs(p2.y-p1.y)/abs(p2.x-p1.x))
,p2.x > p1.x
和p2.y > p1.y
。这是p2
比p1
更正确,而p2
位于p1
之上。这在下面的案例1中说明。
但是,我们可以很容易地将角度定义为上一段加上180度arctan
的结果,如下面的情况2所示!所以角度的概念并不那么清楚,除非你有一个特定的点列要用作锚点。
好的,但是我们假设我们有一个点的锚点,用p1标记,那么我们可以使用arctan
公式和一些fandangling。与下面的四种情况一样,对于案例1,我们只使用上面的arctan
公式。对于案例2,我们必须添加270度(想想单位圆)。对于情况3,我们添加180度,在情况4中我们添加90度。
答案 2 :(得分:1)
您可以使用几何类型。 https://msdn.microsoft.com/en-us/library/bb895270.aspx
以下是一些简单的例子。
使用派生列创建一个Point:
CREATE TABLE #Test (
X INT,
Y INT,
POINT AS GEOMETRY::STGeomFromText('POINT('+CONVERT(VARCHAR(20),X)+' '+CONVERT(VARCHAR(20),Y)+')',0 )
)
INSERT INTO #Test( X, Y) VALUES (3, 9),(15,20)
如果您想在SSMS中查看您的积分,添加缓冲区可以让您更容易看到:
SELECT *,POINT.STBuffer(5) Pt FROM #Test
距离很简单(比如起源):
SELECT X, Y, POINT.STDistance(GEOMETRY::STGeomFromText('POINT(0 0)',0)) DistFromOrigin FROM #Test
X Y DistFromOrigin
----------- ----------- ----------------------
3 9 9.48683298050514
15 20 25
在任意两点之间只需选择点并进行
Point1.STDistance(Point2)
对于角度,当更改为Geometry
类型