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
相关产品推荐
相关产品推荐

