Возникли проблемы при сериализации NetTopologySuite FeaturesCollection в GeoJSON

Попытка вернуть некоторые довольно простые данные GeoJSON. Я нашел NetTopologySuite, настроил простую коллекцию FeaturesCollection и попытался сериализовать ее в строку GeoJson только для того, чтобы получить следующую ошибку:

"Обнаружен цикл самоссылки для свойства 'CoordinateValue' с типом 'GeoAPI.Geometries.Coordinate'. Path 'Features[0].Geometry.Coordinates[0]'."

Просматривая заголовки классов, Point использует Coordinate, у которого действительно есть свойство Coordinate, поэтому я понимаю, почему существует циклическая ссылка. Дело в том, что большинство (если не все) Geometries, кажется, используют 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();

2 ответа

Решение

Используйте конструктор по умолчанию для GeoJsonSerializer учебный класс:

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

Это придает CoordinateConverter что предотвращает проблему.

Немного поздно на вечеринку, но вот мой взгляд на это: вы легко можете 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;
}

В DataContract а также DataMember являются ключевыми здесь:

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

Вместо возврата Json после того, как вы уже выполнили сериализацию, вы можете использовать:

        return Content(sw.ToString, "application/Json");
Другие вопросы по тегам