【问题标题】:Having trouble serializing NetTopologySuite FeaturesCollection to GeoJSON将 NetTopologySuite FeaturesCollection 序列化为 GeoJSON 时遇到问题
【发布时间】:2014-11-05 17:36:59
【问题描述】:

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

“检测到属性‘CoordinateValue’的自引用循环 键入“GeoAPI.Geometries.Coordinate”。小路 'Features[0].Geometry.Coordinates[0]'。”

查看类标题,Point 使用 Coordinate,它确实具有 Coordinate 属性,因此我可以看到为什么会有循环引用。问题是,大多数(如果不是全部)几何似乎都使用点,所以这将使得不可能序列化任何东西......除非我错过了一些东西。

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

仅用一个点进行测试并得到相同的错误,所以这里是代码:

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

【问题讨论】:

  • 这是什么Create() 方法?我没有看到它here
  • 如果你为GeoJsonSerializer使用一个修改过的构造函数,你需要确保一个CoordinateConverter被传递给它,如here所示。
  • Create() 是父类的一部分(显然。)切换到默认构造函数完美。随意将其作为实际答案,我会标记它。 :)

标签: c# .net nettopologysuite


【解决方案1】:

更新

GeoJsonSerializer 已移至 NetTopologySuite.IO.GeoJSON,现在拥有自己的静态 Create() 方法:

/// <summary>
/// Factory method to create a (Geo)JsonSerializer
/// </summary>
/// <remarks>Calls <see cref="GeoJsonSerializer.CreateDefault()"/> internally</remarks>
/// <returns>A <see cref="JsonSerializer"/></returns>
public new static JsonSerializer Create()
{
    return CreateDefault();
}

direct constructor 的使用已被弃用:

[Obsolete("Use GeoJsonSerializer.Create...() functions")]
public GeoJsonSerializer() : this(Wgs84Factory) { }

问题中的代码现在应该可以按预期工作了。


原答案

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

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

附加一个CoordinateConverter 可以防止出现问题。

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

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

【讨论】:

    【解决方案2】:

    您可以使用:

    ,而不是在您已经序列化后返回 Json
            return Content(sw.ToString, "application/Json");
    

    【讨论】:

      【解决方案3】:

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

      [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}
      

      【讨论】:

        猜你喜欢
        • 2023-01-25
        • 1970-01-01
        • 2015-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多