在 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.xp2.y > p1.y。即 p2p1 更靠右,而 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