Sql Server 空间数据类型几何、STDistance 和单位:获取米?

Posted

技术标签:

【中文标题】Sql Server 空间数据类型几何、STDistance 和单位:获取米?【英文标题】:Sql Server spatial data type Geometry, STDistance and units : Get meters? 【发布时间】:2013-11-01 20:32:42 【问题描述】:

我正在使用 Sql server 2012 和谷歌地图客户端,我使用 SRID 3785,因为它是地图使用的墨卡托。 我使用几何点数据类型来存储位置。我读几何比地理快。但是当我试图计算点之间的距离时,特别是当我使用 STDistance 时,我得到一个距离......以十进制度为单位......这很好......但我真的需要米来向用户显示它们...... 因此,当您知道您的 SRID 时,当您知道您的目标准确定位在地球上的哪个位置时,您如何将十进制度的距离转换为米? 我知道地理处理米......但是你如何从几何距离计算中得到米?我真的很想知道在地理类型出现之前开发人员是怎么做的...... 谢谢!!

【问题讨论】:

您确定该 SRID 吗?当我查询本地 2012 实例的 sys.spatial_reference_systems 时,我没有看到具有该 ID 的实例... @Ben Thul - 您不会在那里找到该 SRID,原因有两个:1.) 因为它应该是 3857,而不是 3785 (alastaira.wordpress.com/2011/01/23/…) 2.) 因为只有 sys.spatial_reference_systems 表记录大地测量空间参考系统 - EPSG:3857 是一个投影参考系统。 【参考方案1】:

听起来您在这里遇到了几个问题:

首先,Google 地图投影的正确 EPSG 代码是 3857,而不是 3785。有关代码背后相当复杂的历史的解释,请参阅我的博客文章 http://alastaira.wordpress.com/2011/01/23/the-google-maps-bing-maps-spherical-mercator-projection/。

其次,如果您正确使用 SRS,您的坐标应该已经以米为单位。例如,伦敦大本钟的坐标(EPSG:3857)应约为 (-13900, 6710330)。如果你有像 (51.5, -0.12) 这样的坐标,那么这些是 WGS84 纬度/经度,你应该使用 SRID:4326 的地理数据类型

第三,3857 是谷歌地图用于显示空间数据的投影坐标系,但其 API 中的操作使用标准 WGS84 (SRID 4326),因此使用它来存储可能是有意义的你的数据。

非常简单:如果您想要以米为单位的结果,您应该使用以度为单位输入坐标的地理数据类型,或以米为单位输入坐标的几何数据类型。

【讨论】:

【参考方案2】:

地理数据类型的目的是让您可以轻松地执行这些类型的计算。几何数据类型适用于平面,因此它执行的计算相当简单,这可能是它们稍微快一点的原因。

如果提供正确的 SRID,地理数据类型将考虑地球的曲率,并为您提供准确的结果。根据两个对象之间的距离,曲率可能会导致显着差异。

我在 MSDN 上找到了一篇有很好解释的帖子。查看对用户问题的第二个响应。您可以使用“经验法则”计算将 STDistance 结果从度数转换为米数,但这并不精确:

http://social.msdn.microsoft.com/Forums/en-US/4f4648ef-9ef3-4a5c-974a-f34c5a325971/huge-difference-between-geography-and-geometry-results?forum=sqlspatial

【讨论】:

以上是关于Sql Server 空间数据类型几何、STDistance 和单位:获取米?的主要内容,如果未能解决你的问题,请参考以下文章

雪花是不是支持 sql server 中使用的几何数据类型?

MySQL数据类型 - 空间数据类型

MS SQL - 使用几何数据类型来查找距离明显更快吗?

Sql Server 2008 中 1 个几何列与 4 个小数的相对性能是多少?

如何在 SQL Server 中创建忽略 NULL 值的计算几何列

将 geoJson 数据转换为 sql server 空间数据类型(GIS)