Skip to content

Commit 0393f41

Browse files
committed
Move Envelope to its own converter
1 parent 0721747 commit 0393f41

File tree

3 files changed

+75
-33
lines changed

3 files changed

+75
-33
lines changed

src/NetTopologySuite.IO.GeoJSON4STJ/Converters/GeoJsonConverterFactory.cs

+3
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ public GeoJsonConverterFactory(GeometryFactory factory, bool writeGeometryBBox,
190190
public override bool CanConvert(Type typeToConvert)
191191
{
192192
return GeometryTypes.Contains(typeToConvert)
193+
|| typeToConvert == typeof(Envelope)
193194
|| typeof(IFeature).IsAssignableFrom(typeToConvert)
194195
|| typeToConvert == typeof(FeatureCollection)
195196
|| typeof(IAttributesTable).IsAssignableFrom(typeToConvert);
@@ -200,6 +201,8 @@ public override JsonConverter CreateConverter(Type typeToConvert, JsonSerializer
200201
{
201202
if (GeometryTypes.Contains(typeToConvert))
202203
return new StjGeometryConverter(_factory, _writeGeometryBBox, _ringOrientationOption);
204+
if (typeToConvert == typeof(Envelope))
205+
return new StjEnvelopeConverter();
203206
if (typeToConvert == typeof(FeatureCollection))
204207
return new StjFeatureCollectionConverter(_writeGeometryBBox);
205208
if (typeof(IFeature).IsAssignableFrom(typeToConvert))
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
using NetTopologySuite.Geometries;
2+
using System;
3+
using System.Collections.Generic;
4+
using System.Text;
5+
using System.Text.Json;
6+
using System.Text.Json.Serialization;
7+
8+
namespace NetTopologySuite.IO.Converters
9+
{
10+
internal class StjEnvelopeConverter : JsonConverter<Envelope>
11+
{
12+
public override Envelope Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
13+
{
14+
Envelope res = null;
15+
16+
if (reader.TokenType == JsonTokenType.Null)
17+
{
18+
// #57: callers expect us to have read past the last token
19+
reader.Read();
20+
}
21+
else
22+
{
23+
reader.ReadToken(JsonTokenType.StartArray);
24+
25+
double minX = reader.GetDouble();
26+
reader.Read();
27+
double minY = reader.GetDouble();
28+
reader.Read();
29+
double maxX = reader.GetDouble();
30+
reader.Read();
31+
double maxY = reader.GetDouble();
32+
reader.Read();
33+
34+
if (reader.TokenType == JsonTokenType.Number)
35+
{
36+
maxX = maxY;
37+
maxY = reader.GetDouble();
38+
reader.Read();
39+
reader.Read();
40+
}
41+
42+
reader.ReadToken(JsonTokenType.EndArray);
43+
44+
res = new Envelope(minX, maxX, minY, maxY);
45+
}
46+
47+
//reader.Read(); // move away from array end
48+
return res;
49+
}
50+
51+
public override void Write(Utf8JsonWriter writer, Envelope value, JsonSerializerOptions options)
52+
{
53+
// if we don't want to write "null" bounding boxes, bail out.
54+
if (value?.IsNull != false)
55+
{
56+
writer.WriteNullValue();
57+
58+
return;
59+
}
60+
61+
writer.WriteStartArray();
62+
writer.WriteNumberValue(value.MinX);
63+
writer.WriteNumberValue(value.MinY);
64+
writer.WriteNumberValue(value.MaxX);
65+
writer.WriteNumberValue(value.MaxY);
66+
writer.WriteEndArray();
67+
}
68+
}
69+
}
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
using System;
2-
using System.Text.Json;
3-
using System.Text.Json.Serialization;
1+
using System.Text.Json;
42
using NetTopologySuite.Geometries;
53

64
namespace NetTopologySuite.IO.Converters
@@ -10,36 +8,14 @@ internal partial class StjGeometryConverter
108
internal static Envelope ReadBBox(ref Utf8JsonReader reader, JsonSerializerOptions options)
119
{
1210
Envelope res = null;
13-
1411
if (reader.TokenType == JsonTokenType.Null)
1512
{
1613
// #57: callers expect us to have read past the last token
1714
reader.Read();
1815
}
1916
else
2017
{
21-
reader.ReadToken(JsonTokenType.StartArray);
22-
23-
double minX = reader.GetDouble();
24-
reader.Read();
25-
double minY = reader.GetDouble();
26-
reader.Read();
27-
double maxX = reader.GetDouble();
28-
reader.Read();
29-
double maxY = reader.GetDouble();
30-
reader.Read();
31-
32-
if (reader.TokenType == JsonTokenType.Number)
33-
{
34-
maxX = maxY;
35-
maxY = reader.GetDouble();
36-
reader.Read();
37-
reader.Read();
38-
}
39-
40-
reader.ReadToken(JsonTokenType.EndArray);
41-
42-
res = new Envelope(minX, maxX, minY, maxY);
18+
res = JsonSerializer.Deserialize<Envelope>(ref reader, options);
4319
}
4420

4521
//reader.Read(); // move away from array end
@@ -66,13 +42,7 @@ internal static void WriteBBox(Utf8JsonWriter writer, Envelope value, JsonSerial
6642
}
6743

6844
writer.WritePropertyName("bbox");
69-
70-
writer.WriteStartArray();
71-
writer.WriteNumberValue(value.MinX);
72-
writer.WriteNumberValue(value.MinY);
73-
writer.WriteNumberValue(value.MaxX);
74-
writer.WriteNumberValue(value.MaxY);
75-
writer.WriteEndArray();
45+
JsonSerializer.Serialize(writer, value, typeof(Envelope), options);
7646
}
7747
}
7848
}

0 commit comments

Comments
 (0)