【问题标题】:A bug in SQL Geography POINT Lat, Long [closed]SQL Geography POINT Lat, Long 中的一个错误 [关闭]
【发布时间】:2015-04-07 14:28:17
【问题描述】:

更新:这已报告给 Microsoft。


在一个简单的 (SQL Server 2012) 表中,该表具有一个 geography 列(名称 geopoint),其中填充了一些与此类似的简单行点。 POINT (-0.120875610750927 54.1165118880234)等正在执行

select [geopoint].[STAsText](),
       [geopoint].Lat lat,
       [geopoint].Long long 
from mytable 

产生这个

Untitled1   lat long
POINT (-0.120875610750927 54.1165118880234) 54.1165118880234    -0.120875610750927

这看起来像一个错误,但它太基础了,应该在发布之前就被捕获。那我做错了吗?

添加信息

IT 专业人员应在 MSDN 上查找 Microsoft 实施 SQL Server 的详细信息。因为实施上可能存在差异。按照这个案例。为了证明这一点,我刚刚检查了 PostGist 的 ST_AsText 实现以获取 geographic 列。这很好用!结果正如人们所期望的那样。因此,该错误在 SQL 的实现中。上面例子的正确结果应该是

POINT (54.1165118880234 -0.120875610750927 ) 54.1165118880234 -0.120875610750927

我敢说很有可能还有其他与工作geographic 列的函数相关的错误。由于该领域的基本功能尚未经过全面测试。

【问题讨论】:

  • 为什么你认为有一些错误,我觉得很好!
  • “我做错了吗?” - 猜测一下,您假设POINT 的参数是纬度后经度,而不是经度后纬度。
  • 当显示 [geopoint].[STAsText]() Lat 和 Long 应该是其他方式。我仔细检查了地理点和几何点的 STAsText() 返回值。对于几何点,根据 STX 和 STY 属性扩展,返回的值是正确的。对于地理点 [STAsText]() 返回错误的 POINT 值。它应该是 POINT (lat, long) 这是一个我会报告的错误。
  • 好的。我们会尝试用另一种方式说出来。看STPointFromText中的例子:SET @g = geography::STPointFromText('POINT(-122.34900 47.65100)', 4326);。如果您可以向我提供显示该点在地球上位置的地图链接(如您所声称的,在-122纬度),那么您可能有一个点。
  • @Farjad - 我已经向您指出了一个示例,其中使用-122.34900 的第一个参数 众所周知的文本构造地理。你认为这个点在地球上的什么地方? WKT 中的约定是long lat,而不是lat long。这与您可能期望的约定不同,但它不是 一个错误。它可能表明因为您假设它是lat long,所以您输入的数据不正确。

标签: sql-server geospatial


【解决方案1】:

这是按预期工作的。

根据您的问题,您以这种模式存储数据:

POINT (-0.120875610750927 54.1165118880234)

然后你声称根据MSDN documentationMSDN documentation颠倒了纬度/经度

Point(Lat, Long, SRID).

您可能意识到您使用的语法与您声称的不同:

POINT(aValue anotherValue)Point(Lat, Long, SRID)

现在的问题是,MS SQL 对数据做了什么?

事实证明,MS SQL 将数据解释为开放地理空间联盟 (OGC) 知名文本 (WKT),因此使用 STPointFromText 函数,因为该格式最适合二维点:

POINT(x y)

接下来的问题是POINT(Lat Long)吗?

来自示例代码

SET @g = geography::STPointFromText('POINT(-122.34900 47.65100)', 4326);

应该清楚第一个参数不是纬度,而是经度(纬度范围仅从-90到90),所以现在我们猜测格式是POINT(Long Lat)。但为什么呢?

this article 中所述,

如您所见 [...],经度首先指定在纬度之前。原因是因为在开放地理空间联盟 (OGC) 众所周知的文本 (WKT) 表示中,格式为 (x, y)。地理坐标通常由 Lat/Long 指定,但在这两者之间,X 是经度,Y 是纬度。

您可能想知道为什么 X 坐标是经度,而 Y 坐标是纬度。将地球赤道视为 x 轴,而本初子午线为 Y 轴。经度定义为从本初子午线沿 x 轴(或赤道)的距离。同样,纬度定义为沿 Y 轴到赤道的距离。

【讨论】:

  • 注:这只是研究和收集相关信息的结果。我根本不是 MS SQL 或 GIS 专家。
  • Andrew 感谢您抽出宝贵时间回复此主题。安德鲁,您提到我使用的语法与我声称的不同。报告的列表只不过是 sql 引擎生成的列表。语法仅仅是 STAsText() 的返回值。所以改变任何事情的不是我。它是sql引擎函数的返回值。根据 MSDN 定义,point 的返回值不正确。应该能够选择此文本并使用它来将点(经纬度)转换为几何版本。
  • 我明白了……那么请说明您是如何输入数据的。您使用的是Point(Lat, Long, SRID) 还是POINT (-0.120875610750927 54.1165118880234)?目前我假设您使用了后者,并且从您的输出中,它打印了后者。但是,我仍然认为它不是一个错误。你可以用前者输入,但如果它打印为后者,那就没有错了。类似于我输入 2014-12-6 然后输出 12/6/2014 的方式。重点是,只要格式正确,就没有问题。
【解决方案2】:

这是一个错误。地理列的 STAsText 的返回值交换 Lat 和 Long 值。绝对是人们应该注意的错误。

【讨论】:

  • 不,你倒过来了,y坐标是经度。人们谈论纬度/经度,但它被实现为经度/纬度。这不是错误。
  • -约翰·巴萨和其他人。 MSDN 清楚地将点定义为 Point ( Lat, Long, SRID )。正如我之前提到的。 STAsText 的几何版本可以正常工作,但地理版本不能正常工作。所以在测试这个问题的时候注意不要混淆这两个版本。
  • 我认为可能有问题。看看我的单元测试:latitude = 40.584474F;经度 = -111.633491F; var location = SqlGeography.Point(纬度,经度,4326); var point = location .ToString();此时,变量点的值为:POINT (-111.63349151611328 40.58447265625) 这对我来说似乎是一个错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-09
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多