Возникли проблемы при сериализации 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");