我有一个名为Layer.cs的模型,它有一个名为几何学的属性,如下所示:
public NetTopologySuite.Geometries.Geometry Geometry { get; set; }我想将一个示例(NetTopologySuite.Features.FeatureCollection):文件(您可以发现它是这里)转换为特性集合GeoJson
// 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));但是,在调用了保存更改(在这两种情况下)之后,我得到了一个错误:
传入的表格数据流(TDS)远程过程调用(RPC)协议流不正确。参数3 ("@p2"):提供的值不是数据类型地理的有效实例。检查源数据中是否有无效值。无效值的一个示例是数值类型的数据,其比例尺大于精度。
是否有使用EF 5将GeoJson文件保存为NetTopologySuite.Geometries.Geometry的干净解决方案?
发布于 2021-05-12 11:28:11
经过一系列的尝试和错误之后,我找到了一个全面的解决方案。
数据库和模型
当我们处理一个GeoJson文件时,每个特性都可以(甚至应该!)保存在单独的NetTopologySuite.Geometries.Geometry类型中。(换句话说,我将表的结构从一个独立的表更改为两个具有父级子关系的表)
串行化
事实上,当我们使用NetTopologySuite.IO.GeoJSON4STJ.时,我们不需要手动序列化任何事情在我们的代码中,我们只需要在添加控制器时使用NetTopologySuite.Features.FeatureCollection并将NetTopologySuite.IO.Converters.GeoJsonConverterFactory添加到JSON转换器中。但是这里也有一个窍门,在注册的时候,我们应该使用NetTopologySuite.Geometries.GeometryFactoryEx而不是NetTopologySuite.Geometries.GeometryFactory (注意末尾的Ex单词)。原因是SQL server需要左手规则(CCW),但是GeoJson需要右规则(参照系),因此:
.AddJsonOptions(configure =>
{
var geometryFactoryEx = new GeometryFactoryEx(new PrecisionModel(), 4326)
{
OrientationOfExteriorRing = LinearRingOrientation.CounterClockwise,
};
configure.JsonSerializerOptions.Converters.Add(new GeoJsonConverterFactory(geometryFactoryEx));
})https://stackoverflow.com/questions/67456583
复制相似问题