首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ef核5将GeoJson转换为FeatureCollection并保存在NetTopologySuite.Geometries.Geometry列中

使用ef核5将GeoJson转换为FeatureCollection并保存在NetTopologySuite.Geometries.Geometry列中
EN

Stack Overflow用户
提问于 2021-05-09 10:20:11
回答 1查看 1.4K关注 0票数 0

我有一个名为Layer.cs的模型,它有一个名为几何学的属性,如下所示:

代码语言:javascript
复制
public NetTopologySuite.Geometries.Geometry Geometry { get; set; }

我想将一个示例(NetTopologySuite.Features.FeatureCollection):文件(您可以发现它是这里)转换为特性集合GeoJson

代码语言:javascript
复制
// 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:

代码语言:javascript
复制
layer.Geometry = 
 NetTopologySuite.Geometries.Geometry.DefaultFactory.CreateGeometryCollection(featureCollection.Select(c => c.Geometry).ToArray());

代码语言:javascript
复制
layer.Geometry = 
 NetTopologySuite.Geometries.Geometry.DefaultFactory.BuildGeometry(featureCollection.Select(c => c.Geometry));

但是,在调用了保存更改(在这两种情况下)之后,我得到了一个错误:

传入的表格数据流(TDS)远程过程调用(RPC)协议流不正确。参数3 ("@p2"):提供的值不是数据类型地理的有效实例。检查源数据中是否有无效值。无效值的一个示例是数值类型的数据,其比例尺大于精度。

是否有使用EF 5将GeoJson文件保存为NetTopologySuite.Geometries.Geometry的干净解决方案?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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需要右规则(参照系),因此:

代码语言:javascript
复制
.AddJsonOptions(configure =>
{
  var geometryFactoryEx = new GeometryFactoryEx(new PrecisionModel(), 4326)
  {
    OrientationOfExteriorRing = LinearRingOrientation.CounterClockwise,
  };

  configure.JsonSerializerOptions.Converters.Add(new GeoJsonConverterFactory(geometryFactoryEx));
})
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67456583

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档