diff --git a/src/NetTopologySuite.IO.GeoJSON4STJ/Converters/GeoJsonConverterFactory.cs b/src/NetTopologySuite.IO.GeoJSON4STJ/Converters/GeoJsonConverterFactory.cs index c966f91..7a3a94d 100644 --- a/src/NetTopologySuite.IO.GeoJSON4STJ/Converters/GeoJsonConverterFactory.cs +++ b/src/NetTopologySuite.IO.GeoJSON4STJ/Converters/GeoJsonConverterFactory.cs @@ -190,6 +190,7 @@ public GeoJsonConverterFactory(GeometryFactory factory, bool writeGeometryBBox, public override bool CanConvert(Type typeToConvert) { return GeometryTypes.Contains(typeToConvert) + || typeToConvert == typeof(Envelope) || typeof(IFeature).IsAssignableFrom(typeToConvert) || typeToConvert == typeof(FeatureCollection) || typeof(IAttributesTable).IsAssignableFrom(typeToConvert); @@ -200,6 +201,8 @@ public override JsonConverter CreateConverter(Type typeToConvert, JsonSerializer { if (GeometryTypes.Contains(typeToConvert)) return new StjGeometryConverter(_factory, _writeGeometryBBox, _ringOrientationOption); + if (typeToConvert == typeof(Envelope)) + return new StjEnvelopeConverter(); if (typeToConvert == typeof(FeatureCollection)) return new StjFeatureCollectionConverter(_writeGeometryBBox); if (typeof(IFeature).IsAssignableFrom(typeToConvert)) diff --git a/src/NetTopologySuite.IO.GeoJSON4STJ/Converters/StjEnvelopeConverter.cs b/src/NetTopologySuite.IO.GeoJSON4STJ/Converters/StjEnvelopeConverter.cs new file mode 100644 index 0000000..e3c866b --- /dev/null +++ b/src/NetTopologySuite.IO.GeoJSON4STJ/Converters/StjEnvelopeConverter.cs @@ -0,0 +1,69 @@ +using NetTopologySuite.Geometries; +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace NetTopologySuite.IO.Converters +{ + internal class StjEnvelopeConverter : JsonConverter + { + public override Envelope Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + Envelope res = null; + + if (reader.TokenType == JsonTokenType.Null) + { + // #57: callers expect us to have read past the last token + reader.Read(); + } + else + { + reader.ReadToken(JsonTokenType.StartArray); + + double minX = reader.GetDouble(); + reader.Read(); + double minY = reader.GetDouble(); + reader.Read(); + double maxX = reader.GetDouble(); + reader.Read(); + double maxY = reader.GetDouble(); + reader.Read(); + + if (reader.TokenType == JsonTokenType.Number) + { + maxX = maxY; + maxY = reader.GetDouble(); + reader.Read(); + reader.Read(); + } + + reader.ReadToken(JsonTokenType.EndArray); + + res = new Envelope(minX, maxX, minY, maxY); + } + + //reader.Read(); // move away from array end + return res; + } + + public override void Write(Utf8JsonWriter writer, Envelope value, JsonSerializerOptions options) + { + // if we don't want to write "null" bounding boxes, bail out. + if (value?.IsNull != false) + { + writer.WriteNullValue(); + + return; + } + + writer.WriteStartArray(); + writer.WriteNumberValue(value.MinX); + writer.WriteNumberValue(value.MinY); + writer.WriteNumberValue(value.MaxX); + writer.WriteNumberValue(value.MaxY); + writer.WriteEndArray(); + } + } +} diff --git a/src/NetTopologySuite.IO.GeoJSON4STJ/Converters/StjGeometryConverter.Envelope.cs b/src/NetTopologySuite.IO.GeoJSON4STJ/Converters/StjGeometryConverter.Envelope.cs index 75e5004..bda42da 100644 --- a/src/NetTopologySuite.IO.GeoJSON4STJ/Converters/StjGeometryConverter.Envelope.cs +++ b/src/NetTopologySuite.IO.GeoJSON4STJ/Converters/StjGeometryConverter.Envelope.cs @@ -1,6 +1,4 @@ -using System; -using System.Text.Json; -using System.Text.Json.Serialization; +using System.Text.Json; using NetTopologySuite.Geometries; namespace NetTopologySuite.IO.Converters @@ -10,7 +8,6 @@ internal partial class StjGeometryConverter internal static Envelope ReadBBox(ref Utf8JsonReader reader, JsonSerializerOptions options) { Envelope res = null; - if (reader.TokenType == JsonTokenType.Null) { // #57: callers expect us to have read past the last token @@ -18,28 +15,7 @@ internal static Envelope ReadBBox(ref Utf8JsonReader reader, JsonSerializerOptio } else { - reader.ReadToken(JsonTokenType.StartArray); - - double minX = reader.GetDouble(); - reader.Read(); - double minY = reader.GetDouble(); - reader.Read(); - double maxX = reader.GetDouble(); - reader.Read(); - double maxY = reader.GetDouble(); - reader.Read(); - - if (reader.TokenType == JsonTokenType.Number) - { - maxX = maxY; - maxY = reader.GetDouble(); - reader.Read(); - reader.Read(); - } - - reader.ReadToken(JsonTokenType.EndArray); - - res = new Envelope(minX, maxX, minY, maxY); + res = JsonSerializer.Deserialize(ref reader, options); } //reader.Read(); // move away from array end @@ -66,13 +42,7 @@ internal static void WriteBBox(Utf8JsonWriter writer, Envelope value, JsonSerial } writer.WritePropertyName("bbox"); - - writer.WriteStartArray(); - writer.WriteNumberValue(value.MinX); - writer.WriteNumberValue(value.MinY); - writer.WriteNumberValue(value.MaxX); - writer.WriteNumberValue(value.MaxY); - writer.WriteEndArray(); + JsonSerializer.Serialize(writer, value, typeof(Envelope), options); } } }