在 SQL 服务器中存储自定义坐标
Storing custom coordinates in SQL Server
我在 SQL 服务器数据库中有一个 table,它有 2 个字段 X、Y。这些字段代表场地(美式足球场)上的坐标。 0,0(X,Y)为起点,最大值最远点为145,90(X,Y)。
table 中的每一行都是球场的坐标。
我希望能够测量场上不同坐标(数据库中的不同行)之间的距离,例如。 3,9 至 15,20。我也希望能够测量坐标之间的角度。
我查看了 SQL 服务器中的空间类型等,但在我看来这与纬度、经度有关。
在 SQL 服务器中有什么方法可以让我在 SQL 中使用自定义地图在自定义点、角度等之间进行测量?
你还记得代数中的勾股定理吗class? http://betterexplained.com/articles/measure-any-distance-with-the-pythagorean-theorem/ 这就是您在这里测量的三角形 "long" 边的测量值。你不需要任何特别的东西,其他一些基本的数学。您知道从 (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
如果你想存储这个值,你可以很容易地创建一个可以为你计算这个值的计算列。
--编辑--
我不记得计算头顶斜边角的公式了,不过网上应该很容易找到。
作为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 中有所说明。
但是,我们可以很容易地将角度定义为上一段的 arctan
加上 180 度的结果,如下面的案例 2 所示!所以角度的概念并不那么清楚,除非你有一个特定的点列你想用作你的锚点。
好吧,但假设我们确实有一个点的锚点列,用 p1 标记,那么我们可以使用 arctan
公式和一些 fandangling。与以下四种情况一样,对于情况 1,我们仅使用上面的 arctan
公式。对于案例 2,我们必须添加 270 度(考虑单位圆)。对于案例 3,我们添加了 180 度,对于案例 4,我们添加了 90 度。
只是为了展示定义角度的另一种可能方式,如果我们有一个列我们认为很重要。
您可以使用几何类型。
https://msdn.microsoft.com/en-us/library/bb895270.aspx
这里有一些简单的例子。
使用派生列创建点:
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
类型时,此功能应该可以正常工作
Determining cardinal (compass) direction between points
我在 SQL 服务器数据库中有一个 table,它有 2 个字段 X、Y。这些字段代表场地(美式足球场)上的坐标。 0,0(X,Y)为起点,最大值最远点为145,90(X,Y)。
table 中的每一行都是球场的坐标。
我希望能够测量场上不同坐标(数据库中的不同行)之间的距离,例如。 3,9 至 15,20。我也希望能够测量坐标之间的角度。
我查看了 SQL 服务器中的空间类型等,但在我看来这与纬度、经度有关。
在 SQL 服务器中有什么方法可以让我在 SQL 中使用自定义地图在自定义点、角度等之间进行测量?
你还记得代数中的勾股定理吗class? http://betterexplained.com/articles/measure-any-distance-with-the-pythagorean-theorem/ 这就是您在这里测量的三角形 "long" 边的测量值。你不需要任何特别的东西,其他一些基本的数学。您知道从 (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
如果你想存储这个值,你可以很容易地创建一个可以为你计算这个值的计算列。
--编辑--
我不记得计算头顶斜边角的公式了,不过网上应该很容易找到。
作为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 中有所说明。
但是,我们可以很容易地将角度定义为上一段的 arctan
加上 180 度的结果,如下面的案例 2 所示!所以角度的概念并不那么清楚,除非你有一个特定的点列你想用作你的锚点。
好吧,但假设我们确实有一个点的锚点列,用 p1 标记,那么我们可以使用 arctan
公式和一些 fandangling。与以下四种情况一样,对于情况 1,我们仅使用上面的 arctan
公式。对于案例 2,我们必须添加 270 度(考虑单位圆)。对于案例 3,我们添加了 180 度,对于案例 4,我们添加了 90 度。
只是为了展示定义角度的另一种可能方式,如果我们有一个列我们认为很重要。
您可以使用几何类型。 https://msdn.microsoft.com/en-us/library/bb895270.aspx
这里有一些简单的例子。
使用派生列创建点:
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
类型时,此功能应该可以正常工作
Determining cardinal (compass) direction between points