Skip to content

Commit

Permalink
Move Envelope to its own converter
Browse files Browse the repository at this point in the history
  • Loading branch information
MizardX committed Oct 28, 2023
1 parent 0721747 commit 0393f41
Show file tree
Hide file tree
Showing 3 changed files with 75 additions and 33 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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))
Expand Down
Original file line number Diff line number Diff line change
@@ -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<Envelope>
{
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();
}
}
}
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -10,36 +8,14 @@ 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
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);
res = JsonSerializer.Deserialize<Envelope>(ref reader, options);
}

//reader.Read(); // move away from array end
Expand All @@ -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);
}
}
}

0 comments on commit 0393f41

Please sign in to comment.