SQL Server 地理 STGeomFromWKB 错误 - System.FormatException:24201

Posted

技术标签:

【中文标题】SQL Server 地理 STGeomFromWKB 错误 - System.FormatException:24201【英文标题】:SQL Server Geography STGeomFromWKB error - System.FormatException: 24201 【发布时间】:2016-03-27 23:36:24 【问题描述】:

在 SQL Server 2008 R2 中,我们有一个数据类型为 geography 的表。查询时使用

SELECT rowid,GeoCoor,
GeoCoor.STSrid as SRID,
GeoCoor.Lat as Lat,
GeoCoor.Long as Long
FROM dbo.Locations

我们得到这样的行:

╔═══════╦════════════════════════════════════════════════╦══════╦══════════════════╦═══════════════════╗
║ rowid ║                    GeoCoor                     ║ SRID ║       Lat        ║       Long        ║
╠═══════╬════════════════════════════════════════════════╬══════╬══════════════════╬═══════════════════╣
║  1092 ║ 0xE6100000010C82C540E751804240BA86EFD400B45BC0 ║ 4326 ║ 37.0024994913356 ║ -110.812550767815 ║
╚═══════╩════════════════════════════════════════════════╩══════╩══════════════════╩═══════════════════╝

我们所有的数据都是点,而不是线或多边形,我们使用的是 SRID 4326。

我正在尝试使用存储在表中的另一个地理点的二进制值来更新记录的 GeoCoor 字段。这是我的代码:

DECLARE @coor1 geography
SET @coor1 = geography::STGeomFromWKB(0xE6100000010C82C540E751804240BA86EFD400B45BC0,4326)

UPDATE dbo.Locations
SET GeoCoor = @coor1
WHERE RowID = 2657

但是,SET @coor1 = 语句会在 SQL Server Management Studio 中触发错误:

A .NET Framework error occurred during execution of user-defined routine or aggregate "geography": 
System.FormatException: 24201: Latitude values must be between -90 and 90 degrees.
System.FormatException: 
    at Microsoft.SqlServer.Types.GeographyValidator.ValidatePoint(Double x, Double y, Nullable`1 z, Nullable`1 m)
    at Microsoft.SqlServer.Types.Validator.BeginFigure(Double x, Double y, Nullable`1 z, Nullable`1 m)
    at Microsoft.SqlServer.Types.ForwardingGeoDataSink.BeginFigure(Double x, Double y, Nullable`1 z, Nullable`1 m)
    at Microsoft.SqlServer.Types.CoordinateReversingGeoDataSink.BeginFigure(Double x, Double y, Nullable`1 z, Nullable`1 m)
    at Microsoft.SqlServer.Types.OpenGisWkbReader.ReadFirstPoint(ByteOrder byteOrder)
    at Microsoft.SqlServer.Types.OpenGisWkbReader.ParseWkbPointWithoutHeader(ByteOrder byteOrder)
    at Microsoft.SqlServer.Types.OpenGisWkbReader.Read(OpenGisType type, Int32 srid)
    at Microsoft.SqlServer.Types.SqlGeography.GeographyFromBinary(OpenGisType type, SqlBytes binary, Int32 srid)

根据最初的查询结果,可以清楚地看到37.002499的纬度...确实在-90到90之间。是经度不在-90到90之间。

我相信这是 geography::STGeomFromWKB 方法中的一个 .NET 错误,它错误地从 WKB 数据中转置 Lat 和 Long(或者 .Lat.Long 方法可能有误?!)。我的问题是:

谁能告诉我我是否忽略了某些东西,或者我应该继续提交给Microsoft Connect吗? 有人可以在更高版本的 SQL Server (2016) 中重现此错误吗?还是修复了?

【问题讨论】:

【参考方案1】:

在浏览了其他网站后,我想颠倒我的纬度/经度的顺序。这似乎奏效了。

SELECT  Geography::Point(Latitude,Longitude, 4326) as c
FROM na.MyTable
where Latitude  Is Not Null

这会生成我正在寻找的空间数据(但当然还有其他问题):)

【讨论】:

欢迎来到 ***。请使用 4 个空格缩进您的代码,以便将其显示为代码并突出显示语法。最好的问候。

以上是关于SQL Server 地理 STGeomFromWKB 错误 - System.FormatException:24201的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 2008 地理空间查询

SQL Server - 地理

Microsoft SQL Server 上的地理数据

SQL Server 2008 - 从记录中获取地理位置

SQL Server 地理测试点是不是在范围内 - STWithin() 做啥?

SQL Server Spatial:是几何类型还是地理类型的变量?