如何用NetTopologySuite将SQL Server Geography十六进制字符串转为Geometry?
解决SQL Server Geography十六进制字符串转NetTopologySuite Geometry的问题
错误原因
你遇到的问题根源有两个:
- SQL Server的Geography类型存储的十六进制字符串是自定义二进制格式,并非标准OGC WKB(Well-Known Binary)格式,
WKBReader无法识别这种格式的标识(报错里的GeometryCode 784就是SQL Server的地理类型编码)。 - 你用
Encoding.ASCII.GetBytes(coor2)转换十六进制字符串的方式错误——这是把字符串的每个字符转成ASCII字节,而非将十六进制解析为对应的二进制数据,导致传入WKBReader的是无效内容。
正确转换步骤
1. 安装依赖包
确保项目引用了NetTopologySuite.IO.SqlServer NuGet包,这个包提供了专门读取SQL Server地理/几何二进制格式的工具类。
2. 代码实现
// 输入的SQL Server Geography十六进制字符串 string sqlServerGeoHex = "0xE61000000104040000005C8FC2F5280C54C0A01A2FDD24C639409CC420B0723050C00C022B8716294040643BDF4F8D8750C09EEFA7C64B7732405C8FC2F5280C54C0A01A2FDD24C6394001000000020000000001000000FFFFFFFF0000000003"; // 步骤1:去掉前缀"0x",将十六进制字符串解析为字节数组 byte[] sqlServerGeoBytes = Convert.FromHexString(sqlServerGeoHex.TrimStart('0', 'x')); // 步骤2:使用SqlServerBytesReader读取SQL Server自定义格式的二进制数据 var sqlReader = new NetTopologySuite.IO.SqlServerBytesReader(); NetTopologySuite.Geometries.Geometry ntsGeometry = sqlReader.Read(sqlServerGeoBytes);
备选方案(数据库层面转换)
如果能直接从SQL Server查询数据,可以在查询时将Geography转成标准WKB,再用WKBReader读取:
SELECT YourGeographyColumn.STAsBinary() AS WkbData FROM YourTable
客户端拿到WKB字节数组后,直接用WKBReader读取即可:
var wkbReader = new NetTopologySuite.IO.WKBReader(); NetTopologySuite.Geometries.Geometry ntsGeometry = wkbReader.Read(wkbBytes);
内容的提问来源于stack exchange,提问作者Yuri Morales
相关产品推荐
相关产品推荐

