2015-12-21 64 views
1

在SQL Server 2008 R2中,我們有一個數據類型爲geography的字段的表。當SQL Server Geography STGeomFromWKB錯誤 - System.FormatException:24201

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之間。

我相信這是一個.NET錯誤,在geography::STGeomFromWKB方法中,錯誤地將Lat和Long轉置爲WKB數據(或者也許是t他.Lat.Long方法是錯誤?!)。我的問題是:

  • 任何人都可以告訴我,如果我忽略了某些東西,還是應該繼續並將其提交給Microsoft Connect
  • 有人可以在SQL Server(2016)的更高版本中重現此錯誤嗎?或者它已被修復?

回答

1

在仔細閱讀了其他網站之後,我認爲要顛倒我的緯度/長度的順序。這似乎工作。

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

這產生空間數據我要找(當然別的東西壞了):)

+0

歡迎StackOverflow上。請用4個空格縮進您的代碼,以便將其顯示爲代碼並且語法高亮。最好的祝福。 – YakovL