2017-04-10 102 views
2

使用實體框架使用作爲Microsoft.SqlServer.Type包來存儲空間數據(只是點)找到了DbGeography類型顯示爲在MSSQL數據庫如下:使用SQL地理學領域初始化.NET DbGeography對象

0xE6100000010CAA00B9D75CA84740F4FDD478E926FA3F

這是怎麼十六進制字符串格式化,怎麼能用來初始化一個新的DbGeography對象?

回答

4

編輯

我找到了一種方法,首先將其轉換爲SqlGeography一個SqlGeography類型的十六進制字符串轉換爲DbGeography

確保添加引用:using Microsoft.SqlServer.Types;

static void Main(string[] args) 
    { 
     //0xE6100000010C3D7D04FEF012414034B275BA3D4E5240 
     var point = "E6100000010C3D7D04FEF012414034B275BA3D4E5240"; 

     var pointBytes = Enumerable.Range(0, point.Length) 
       .Where(x => x % 2 == 0) 
       .Select(x => Convert.ToByte(point.Substring(x, 2), 16)) 
       .ToArray(); 


     var sqlbytes = new SqlBytes(pointBytes); 


     var sqlPoint = SqlGeography.Deserialize(sqlbytes); 

     Console.WriteLine("SqlGeography = {0} - {1}", sqlPoint.Lat, sqlPoint.Long); 


     DbGeography newGeography = DbGeography.FromText(sqlPoint.ToString(), DbGeography.DefaultCoordinateSystemId); 

     Console.WriteLine("EF DBGeography = {0} - {1}", newGeography.Latitude, newGeography.Longitude); 


     Console.ReadKey(); 

    } 

確認它是正確的:

enter image description here

+0

您建議使用'DbGeography.FromBinary'來初始化一個新的'DbGeography'實例。你能告訴我這種轉換如何處理提供的十六進制字符串嗎?我沒有看到提供的示例與答案的第一部分是如何相關的。 –

+0

@CorstianBoerman我的意思是你可以使用任何的DbGeography擴展函數來創建一個新的實例 - 根據您的要求。 –

+0

如果您已有DbGeography對象,則可以使用.FromText方法作爲我發佈的示例。 –

0

MSSQL存儲地理數據的格式在[MS-SSCLRT]: Microsoft SQL Server CLR Types Serialization Formats中定義。正如the 5th revision上3.1.2中發現的格式如下:

0xE6100000010CAA00B9D75CA84740F4FDD478E926FA3F 

SRID:     E6 10 00 00    (4326, WGS84) 
VERSION:    01 
SERIALIZATION PROPS: 0C 
X (LONGITUDE):   AA 00 B9 D7 5C A8 47 40 (47.3153333333333) 
Y (LATITUDE):   F4 FD D4 78 E9 26 FA 3F (1.6345) 

這個數據可被轉換成可以被用來初始化一個新DbGeography實例的兩倍。

var x = BitConverter.ToDouble(new byte[] { 
    0xAA, 0x00, 0xB9, 0xD7, 0x5C, 0xA8, 0x47, 0x40 }, 0); 

var y = ...; 

DbGeography.FromText($"POINT({x} {y})");