首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法将NetTopologySuite FeaturesCollection序列化为GeoJSON

无法将NetTopologySuite FeaturesCollection序列化为GeoJSON
EN

Stack Overflow用户
提问于 2014-11-05 17:36:59
回答 3查看 6.8K关注 0票数 12

试图返回一些非常简单的GeoJSON数据。我找到了NetTopologySuite,并设置了一个简单的FeaturesCollection,并尝试将其序列化为GeoJson字符串,但只得到以下错误:

为属性'CoordinateValue‘检测到的自引用循环,类型为’detected .Geometries.Schedate‘. Path’Features.Getimey.Traates‘。

在查看类标题时,Point使用了坐标,它有一个坐标属性,所以我可以看到为什么会有一个循环引用。问题是,大多数(如果不是全部)几何图形似乎都使用了Point,这样就不可能序列化任何东西.除非我遗漏了什么。

这是个窃听器还是我漏掉了什么?

只使用一个Point进行测试,得到相同的错误,下面是代码:

代码语言:javascript
复制
using NTS = NetTopologySuite;

var ret = new NTS.Geometries.Point(42.9074, -78.7911);

var jsonSerializer = NTS.IO.GeoJsonSerializer.Create();

var sw = new System.IO.StringWriter();
jsonSerializer.Serialize(sw, ret);

var json = sw.ToString();
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-11-05 22:02:15

更新

GeoJsonSerializer已经转移到NetTopologySuite.IO.GeoJSON,现在有了自己的静态Create()方法:

/工厂方法,用于在内部创建(Geo)JsonSerializer /一个公开的新静态JsonSerializer创建(){返回CreateDefault();}

直接构造函数的使用已被废弃:

过时(“使用GeoJsonSerializer.Create.()函数”)公共GeoJsonSerializer():this(Wgs84Factory) {}

问题中的代码现在应该像预期的那样工作。

原始答案

使用GeoJsonSerializer类的默认构造函数:

代码语言:javascript
复制
var jsonSerializer = new NetTopologySuite.IO.GeoJsonSerializer();

它附加了一个防止问题的CoordinateConverter

GeoJsonSerializer实际上没有静态的Create()方法,因此您将回到基类的JsonSerializer.Create()上。实际上,以下情况会导致编译器错误:

代码语言:javascript
复制
GeoJsonSerializer jsonSerializer = NTS.IO.GeoJsonSerializer.Create();
票数 6
EN

Stack Overflow用户

发布于 2015-12-16 17:46:21

不必在序列化之后返回Json,您可以使用:

代码语言:javascript
复制
        return Content(sw.ToString, "application/Json");
票数 0
EN

Stack Overflow用户

发布于 2020-03-09 04:24:33

聚会有点晚了,但我的看法是:您可以轻松地使Point与您当前的Json序列化程序设置兼容。

代码语言:javascript
复制
[DataContract]
public class GeoLocation : NetTopologySuite.Geometries.Point
{
    const int GoogleMapsSRID = 4326 ;

    public GeoLocation(double latitude, double longitude)
        : base(x: longitude, y: latitude) =>
          base.SRID = GoogleMapsSRID;

    [DataMember]
    public double Longitude => base.X;

    [DataMember]
    public double Latitude => base.Y;
}

DataContractDataMember是这里的关键:

代码语言:javascript
复制
new GeoLocation(42.9074, -78.7911).ToJson() => {"longitude":42.9074,"latitude":-78.7911}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26763564

复制
相关文章

相似问题

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