我有一个名为Layer.cs的模型,它有一个名称为Geometry的属性,如:
public NetTopologySuite.Geometries.Geometry Geometry { get; set; }
我想将示例GeoJson文件(您可以在此处找到(转换为功能集合(NetTopologySuite.Features.FeatureCollection(:
// create NetTopology JSON reader
var reader = new NetTopologySuite.IO.GeoJsonReader();
// pass geoJson's FeatureCollection to read all the features
var featureCollection = reader.Read<NetTopologySuite.Features.FeatureCollection>(josnData);
然后将其保存到Layer。Geomerty使用:
layer.Geometry =
NetTopologySuite.Geometries.Geometry.DefaultFactory.CreateGeometryCollection(featureCollection.Select(c => c.Geometry).ToArray());
或
layer.Geometry =
NetTopologySuite.Geometries.Geometry.DefaultFactory.BuildGeometry(featureCollection.Select(c => c.Geometry));
但在调用save change(在这两种情况下(后,我得到了一个闲置的错误:
传入的表格格式数据流(TDS(远程过程调用(RPC(协议流不正确。参数3("@p2"(:提供的值不是数据类型geography的有效实例。请检查源数据中的无效值。无效值的示例是小数位数大于精度的数字类型的数据。
是否有任何干净的解决方案可以使用EF Core 5将GeoJson文件保存为NetTopologySuite.Geometries.Geometry?
经过一系列的尝试和错误,我找到了一个全面的解决方案。
数据库和模型
当我们处理GeoJson文件时,每个功能都可以(甚至应该!(保存在单独的NetTopologySuite.Geometrys.Geometry类型。(换句话说,我将我的表的结构从一个独立表更改为两个具有父子关系的表(
序列化
事实上,当我们使用NetTopologySuite.IO.GeoJSON4STJ时,我们不需要手动序列化任何东西。在我们的代码中,我们只需要使用NetTopologySuite.Features.FeatureCollection,并在添加控制器时将netTopologySSuite.IO.Converters.GeoJsonConverterFactory添加到JSON转换器中。但这里也有一个技巧,在注册时,我们应该使用NetTopologySuite.Geometries.GeometryFactoryEx,而不是NetTopologeSuite.Geometrys.GeometryFactory(注意末尾的Ex词(。原因是SQL server需要左手规则(CCW(,而GeoJson需要右手规则(REFERENCE(,所以:
.AddJsonOptions(configure =>
{
var geometryFactoryEx = new GeometryFactoryEx(new PrecisionModel(), 4326)
{
OrientationOfExteriorRing = LinearRingOrientation.CounterClockwise,
};
configure.JsonSerializerOptions.Converters.Add(new GeoJsonConverterFactory(geometryFactoryEx));
})