【问题标题】:Use SQL geography field to initialize .NET DbGeography object [closed]使用 SQL 地理字段初始化 .NET DbGeography 对象 [关闭]
【发布时间】:2017-04-10 17:23:00
【问题描述】:

使用实体框架使用 Microsoft.SqlServer.Type 包中的 DbGeography 类型来存储空间数据(仅点)在 MSSQL DB 中显示如下:

0xE6100000010CAA00B9D75CA84740F4FDD478E926FA3F

这个十六进制字符串是如何格式化的,如何用来初始化一个新的DbGeography对象?

【问题讨论】:

    标签: c# sql .net sql-server entity-framework


    【解决方案1】:

    编辑

    我找到了一种将 HEX 字符串转换为 DbGeography 的方法,首先将其转换为 SqlGeography 类型 SqlGeography

    确保添加参考: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();
    
        }
    

    确认无误:

    【讨论】:

    • 您建议使用DbGeography.FromBinary 来初始化一个新的DbGeography 实例。你能告诉我这个转换如何与提供的十六进制字符串一起工作吗?我看不出所提供的示例与您答案的第一部分有何关联。
    • @CorstianBoerman 我的意思是你可以使用任何 DbGeography 扩展函数来创建一个新实例——这取决于你的要求。
    • 如果您已经有一个 DbGeography 对象,您可以使用 .FromText 方法作为我发布的示例。
    • 使用 Entity Framework 时,使用 DbGeography 类型完全没有问题。出于测试目的,我从所需的数据集中导出了一个 CSV,我想解析它并将其放入适当的数据模型中,因此希望从提供的十六进制字符串初始化一个 DbGeography 对象。
    • @CorstianBoerman 我认为您应该在问题中提及您的最后一条评论,以便清楚您要达到的目标
    【解决方案2】:

    MSSQL 存储地理数据的格式在[MS-SSCLRT]: Microsoft SQL Server CLR Types Serialization Formats 中定义。如 3.1.2 中的 the 5th revision 所示,格式如下:

    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})");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-22
      • 1970-01-01
      相关资源
      最近更新 更多