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

NetTopologySuite 6与8生成Geometry的二进制差异及旧格式生成问询

解决EF Core 8升级后NetTopologySuite生成Geometry二进制格式兼容问题

问题根源

对比新旧二进制格式差异:

  • 旧版二进制以0D开头,对应OGC WKB的仅XY坐标的Point类型
  • 新版二进制以0F开头,对应带M坐标的Point类型,末尾额外8字节是M坐标的NaN值(000000000000F8FF)

EF Core 8或升级后的NetTopologySuite默认序列化时包含了M坐标,导致二进制格式变化,但WKT不受影响。

解决方法

1. 实体配置中显式指定几何类型

在OnModelCreating里为几何字段指定不带Z/M的类型:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<YourEntity>()
        .Property(e => e.YourGeometryProperty)
        .HasColumnType("geometry(Point)"); // 仅保留XY坐标,不包含Z/M
}

如果有指定SRID,可写成"geometry(Point, 4326)"(替换为你的实际SRID)。

2. 自定义WKB序列化转换器

通过自定义值转换器,强制NetTopologySuite仅序列化XY坐标:

public class GeometryXYConverter : ValueConverter<Geometry, byte[]>
{
    public GeometryXYConverter()
        : base(
            geometry => geometry.AsBinary(ByteOrder.Ndr, HandleOrdinates.XY),
            bytes => GeometryFactory.Default.CreateFromBinary(bytes))
    {
    }
}

// 在DbContext中配置
protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder)
{
    configurationBuilder.Properties<Geometry>()
        .HaveConversion<GeometryXYConverter>()
        .HaveColumnType("geometry");
}

核心是HandleOrdinates.XY参数,限制仅序列化XY维度,生成的WKB将与旧版格式完全一致。

3. 验证结果

生成二进制后检查:

  • 开头应为0D而非0F
  • 长度与旧版一致(无末尾额外8字节)

内容的提问来源于stack exchange,提问作者Pipelynx

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 15:56:06