如何在无SQL Server环境下用C#借助Microsoft.SqlServer.Types将gml:Polygon转换为SQL Server Geometry十六进制字符串
将SqlGeometry转换为SQL Server内部十六进制字符串的正确方法
你已经通过GeomFromGml成功生成了SqlGeometry对象,现在要得到和SSMS中convert(geometry, ...)返回完全一致的十六进制字符串,核心问题在于:STAsBinary()返回的是标准WKB格式,而你需要的是SQL Server专属的内部二进制存储格式。
解决方案
直接使用SqlGeometry的Serialize()方法获取SQL Server原生的二进制数据,再把它转换成带0x前缀的十六进制字符串就行,具体步骤如下:
- 调用
Serialize()获取SqlBytes,这就是SQL Server存储geometry时用的二进制内容 - 将
SqlBytes转成字节数组,再格式化为十六进制字符串(记得加0x前缀)
完整代码示例
using System; using System.Data.SqlTypes; using System.IO; using System.Text; class GeometryConversionDemo { static void Main() { // 你的GML多边形字符串 string gmlInput = "<gml:Polygon xmlns:gml=\"http://www.opengis.net/gml\"><gml:exterior><gml:LinearRing><gml:posList>1 2 3 4 5 6 1 2</gml:posList></gml:LinearRing></gml:exterior></gml:Polygon>"; // 转成SqlXml供GeomFromGml使用 SqlXml gmlXml = new SqlXml(new MemoryStream(Encoding.UTF8.GetBytes(gmlInput))); SqlGeometry targetGeometry = SqlGeometry.GeomFromGml(gmlXml, 4326); // 获取SQL Server内部格式的二进制数据 SqlBytes internalBinaryData = targetGeometry.Serialize(); byte[] byteArray = internalBinaryData.Value; // 转换为目标十六进制字符串 string sqlHexString = "0x" + BitConverter.ToString(byteArray).Replace("-", "").ToUpper(); // 输出结果和SSMS里的convert结果完全一致 Console.WriteLine(sqlHexString); } }
为什么之前的尝试不对?
你之前用STAsBinary()拿到的是**OGC标准的WKB(Well-Known Binary)**格式,这个格式只包含几何形状的基础信息,没有SQL Server额外存储的元数据(比如SRID的存储方式、内部结构标记等)。而Serialize()方法返回的是SQL Server为geometry类型定义的专属二进制格式,和数据库里存储的、SSMS显示的内容完全匹配。
内容的提问来源于stack exchange,提问作者Dejan Dozet
相关产品推荐
相关产品推荐

