You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用NetTopologySuite将SQL Server Geography十六进制字符串转为Geometry?

解决SQL Server Geography十六进制字符串转NetTopologySuite Geometry的问题

错误原因

你遇到的问题根源有两个:

  1. SQL Server的Geography类型存储的十六进制字符串是自定义二进制格式,并非标准OGC WKB(Well-Known Binary)格式,WKBReader无法识别这种格式的标识(报错里的GeometryCode 784就是SQL Server的地理类型编码)。
  2. 你用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 13:02:53