无法将NetTopologySuite FeaturesCollection序列化为GeoJSON

时间:2014-11-05 17:37:00

标签: c# .net nettopologysuite

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

  

"检测到属性的自引用循环' CoordinateValue'同   类型' GeoAPI.Geometries.Coordinate'。路径   '特点[0] .Geometry.Coordinates [0]'"

查看类标题,Point使用Coordinate,它具有Coordinate属性,因此我可以看到为什么会有循环引用。问题是,大多数(如果不是全部)几何图形似乎都使用了Point,这样就无法对任何内容进行序列化......除非我遗漏了某些东西。

这是一个错误还是我错过了什么?

仅使用Point测试并得到相同的错误,所以这里的代码是:

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();

3 个答案:

答案 0 :(得分:4)

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

var jsonSerializer = new NetTopologySuite.IO.GeoJsonSerializer();

附加CoordinateConverter以防止出现此问题。

答案 1 :(得分:0)

在您已经序列化之后,您可以使用:

,而不是返回Json
        return Content(sw.ToString, "application/Json");

答案 2 :(得分:0)

聚会晚了一点,但这是我的看法: 您可以轻松地使Point与您当前的Json Serializer设置兼容。

[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是关键:

new GeoLocation(42.9074, -78.7911).ToJson() => {"longitude":42.9074,"latitude":-78.7911}