使用實體框架使用作爲Microsoft.SqlServer.Type
包來存儲空間數據(只是點)找到了DbGeography
類型顯示爲在MSSQL數據庫如下:使用SQL地理學領域初始化.NET DbGeography對象
0xE6100000010CAA00B9D75CA84740F4FDD478E926FA3F
這是怎麼十六進制字符串格式化,怎麼能用來初始化一個新的DbGeography
對象?
使用實體框架使用作爲Microsoft.SqlServer.Type
包來存儲空間數據(只是點)找到了DbGeography
類型顯示爲在MSSQL數據庫如下:使用SQL地理學領域初始化.NET DbGeography對象
0xE6100000010CAA00B9D75CA84740F4FDD478E926FA3F
這是怎麼十六進制字符串格式化,怎麼能用來初始化一個新的DbGeography
對象?
編輯
我找到了一種方法,首先將其轉換爲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();
}
確認它是正確的:
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})");
您建議使用'DbGeography.FromBinary'來初始化一個新的'DbGeography'實例。你能告訴我這種轉換如何處理提供的十六進制字符串嗎?我沒有看到提供的示例與答案的第一部分是如何相關的。 –
@CorstianBoerman我的意思是你可以使用任何的DbGeography擴展函數來創建一個新的實例 - 根據您的要求。 –
如果您已有DbGeography對象,則可以使用.FromText方法作爲我發佈的示例。 –