为啥 SQL Server GEOGRAPHY 允许 -15069° 和 +15069° 之间的经度?为啥是±15069°?

Posted

技术标签:

【中文标题】为啥 SQL Server GEOGRAPHY 允许 -15069° 和 +15069° 之间的经度?为啥是±15069°?【英文标题】:Why does SQL Server GEOGRAPHY allow longitudes between -15069° and +15069°? Why ±15069°?为什么 SQL Server GEOGRAPHY 允许 -15069° 和 +15069° 之间的经度?为什么是±15069°? 【发布时间】:2016-06-11 00:06:07 【问题描述】:

我在我的项目中使用 Microsoft.SqlServer.Types DLL 来验证纬度和经度。

库验证 -15069 到 15069 度之间的经度值,而不是 -180 到 180 度之间的经度值。 谁能解释微软检查经度值在 -15069 到 15069 度之间的意义或原因是什么?

Microsoft 在此网站上列出了地理空间标准的标准,其中提到经度值必须介于 -15069 到 15069 度之间。

https://msdn.microsoft.com/en-us/library/ee301753(v=sql.105).aspx

我们将不胜感激您在理解这个概念方面的投入!

【问题讨论】:

谷歌搜索 15069 度显示它非常接近 263 弧度。不知道这是否重要。 我找不到任何关于谷歌如何从 15069 到 40.5700° N、79.7700° W 的转换的任何信息,它也不适用于 0 到 15069 的所有值。它也不能这样做负整数值的转换。我实际上对他们为什么现在允许这些值很感兴趣。 我刚刚绘制了几个点,似乎对于传统 [-180, 180] 边界之外的经度值,它“包裹”在奇点处。那是因为 -180° = 180°,200° = -160°。从数学上讲,这两个数字模 360 相等。我只能推测为什么允许“越界”值。我的猜测是,你去世界各地进行不止一次从东到西的革命而不是从北到南的革命的可能性要大得多。也就是说,对于两极附近的纬度,经度圈很小。 感谢大家的投入。 @Ben:我也有同样的想法,但不确定我的假设是否正确,谢谢。 【参考方案1】:

为什么经度不限于[-180°..+180°]?

这是一个简短的思想实验。 LINESTRING (-180 0, 180 0) 代表以下哪三行?

    一条沿赤道向东环绕地球的线。

    沿赤道向西环绕地球的一条线。

    一条长度为 0 的线,因为 -180° 纬度表示与 +180° 纬度相同的子午线。

一旦您决定了这三种可能性中的任何一种,您就会发现您无法将其他两种情况建模为LINESTRING(试试看!)......至少当您将经度限制为(地理上正确)区间 [-180°..+180°]!

让我们看看放宽限制后会发生什么:

绕地球向东的线现在可以建模为LINESTRING (-180 0, 180 0)。 (这似乎符合我们的预期,因为增加经度意味着“向东”。)

环绕地球的西向线现在变为LINESTRING (-180 0, -540 0)。 (经度递减表示“向西”。)

长度为 0 的行变为LINESTRING (-180 0, -180 0)。 (坐标不变意味着“没有经过距离”。)

是的,但他们为什么选择正好±15069度?

那个,我不能说。它可能与浮点精度有关(即,如果您指定一个“环绕”地球超过 15,069° ÷ 360° = 41,8583... 次的点,空间计算变得过于不精确)或只是一个任意限制(即他们认为没有人需要能够构建一个环绕地球超过大约 42 次的螺旋)。

如果不限制经度,为什么纬度限制为 [-90°..+90°]?

让我们重复上面的思想实验:LINESTRING (0 90, 0 -90) 是什么意思?

    沿着本初子午线向南环绕半个地球的线。

    沿着本初子午线向北环绕半个地球的线。

    长度为 0 的行。

我们可以排除(3),因为POINT (0 90)POINT (0 -90) 是不同的点:即北极和南极。从一个到另一个的线绝对不会有零长度。

我们也可以排除(2),只是因为从北极开始说“向北走”没有任何意义。你只能呆在那里,或者往南走,已经被(1)覆盖了。

所以我们明确地以 (1) 结束。因此,将纬度限制在具有地理意义的 [-90°..+90°] 的原因是因为在对接触或跨越地理两极的线进行建模时不会有任何歧义。这是因为没有像经度那样突然的度数“跳跃”(其中一条子午线用-180°和+180°描述)。

【讨论】:

我不确定我是否理解这个推理。从赤道上的任何一点出发,绕地球一圈并返回该点的最短路径应该是越过两极,而不是沿着赤道。那么,为什么赤道上两个实际上相等的点之间的线串要描述赤道路线呢?一旦你越过两极,知道哪个等效点是“更东”或“更西”如何帮助你了解你是从正北还是正南开始导航? 或者换一种说法——为什么有一个“要求”才能使用LINESTRING 只用两个坐标来描述环球航行?如果我们想描述一个特定的大圆路线,那么肯定提供 3 个不同的坐标,等距并且返回到第一个坐标允许明确指定任何路线? @Damien_The_Unbeliever:您还可以使用LINESTRING (-179.5 0, 179.5 0) 进行稍微不同的思想实验。它不一定是完整的环球航行,当您想要一条穿过 +/-180° 子午线的线时,也会出现歧义。那种模棱两可(你的选择是沿着赤道还是穿过极地)是无关紧要的。重要的是,当您被限制在 -180°..+180° 时,会有 歧义。 但是通过声明你在任意两对点之间采用最短的大圆路线很容易解决这种歧义,如果这不是你想要/想要的,你插入更多坐标。 IE。将您的第二个有问题的思想实验更改为完整环球航行,从南极开始。如果我们只有两次南极坐标,我们怎么知道我们先走哪条子午线?简而言之,我看不出如何明确解决LINESTRING(coord, same coord),所以我不敢相信这是我的意图。 我不确定我明白你在说什么。您是指我回答中的第一部分(就像您上面的第一条评论所暗示的那样)?如果是这样,那么您将如何表示从 (-179 0) 向西(沿赤道)到 (179 0) 的一条线段?如果您指的是第三部分(就像您最后的评论所暗示的那样),那么是的,也许您的推理更合理。我试图将诸如“大圆圈”之类的地理术语排除在解释之外,因为我不太记得我的地理课,TBH。

以上是关于为啥 SQL Server GEOGRAPHY 允许 -15069° 和 +15069° 之间的经度?为啥是±15069°?的主要内容,如果未能解决你的问题,请参考以下文章

在 Django 中使用 GEOGRAPHY 列更新 SQL Server 表

确定一个 POINT 是不是位于 LINESTRING 上的两个其他 POINT 之间(SQL Server 2008 Geography)

如何测试 SQL Server Geography 列的值是不是为 POINT(0 0)?

在 F# 中,如何使用 Type Provider 访问 Sql Server Geography 数据类型?

SQL Server - 地理

SQL Server 地理