1
- using Elasticsearch . Net . Utf8Json ;
1
+ using System . Globalization ;
2
+ using System . IO ;
3
+ using System . Text ;
4
+ using Elasticsearch . Net . Utf8Json ;
2
5
using Elasticsearch . Net . Utf8Json . Internal ;
3
6
4
-
5
7
namespace Nest
6
8
{
7
9
internal class GeoLocationFormatter : IJsonFormatter < GeoLocation >
@@ -14,35 +16,59 @@ internal class GeoLocationFormatter : IJsonFormatter<GeoLocation>
14
16
15
17
public GeoLocation Deserialize ( ref JsonReader reader , IJsonFormatterResolver formatterResolver )
16
18
{
17
- if ( reader . GetCurrentJsonToken ( ) == JsonToken . Null )
19
+ switch ( reader . GetCurrentJsonToken ( ) )
18
20
{
19
- reader . ReadNext ( ) ;
20
- return null ;
21
- }
21
+ case JsonToken . Null :
22
+ reader . ReadNext ( ) ;
23
+ return null ;
24
+ case JsonToken . String :
25
+ var wkt = reader . ReadString ( ) ;
26
+ using ( var tokenizer = new WellKnownTextTokenizer ( new StringReader ( wkt ) ) )
27
+ {
28
+ var token = tokenizer . NextToken ( ) ;
29
+ if ( token != TokenType . Word )
30
+ throw new GeoWKTException (
31
+ $ "Expected word but found { tokenizer . TokenString ( ) } ", tokenizer . LineNumber , tokenizer . Position ) ;
22
32
23
- var count = 0 ;
24
- double lat = 0 ;
25
- double lon = 0 ;
26
- while ( reader . ReadIsInObject ( ref count ) )
27
- {
28
- var propertyName = reader . ReadPropertyNameSegmentRaw ( ) ;
29
- if ( Fields . TryGetValue ( propertyName , out var value ) )
33
+ var type = tokenizer . TokenValue . ToUpperInvariant ( ) ;
34
+ if ( type != GeoShapeType . Point )
35
+ throw new GeoWKTException (
36
+ $ "Expected { GeoShapeType . Point } but found { type } ", tokenizer . LineNumber , tokenizer . Position ) ;
37
+
38
+ if ( GeoWKTReader . NextEmptyOrOpen ( tokenizer ) == TokenType . Word )
39
+ return null ;
40
+
41
+ var lon = GeoWKTReader . NextNumber ( tokenizer ) ;
42
+ var lat = GeoWKTReader . NextNumber ( tokenizer ) ;
43
+ return new GeoLocation ( lat , lon ) { Format = GeoFormat . WellKnownText } ;
44
+ }
45
+ default :
30
46
{
31
- switch ( value )
47
+ var count = 0 ;
48
+ double lat = 0 ;
49
+ double lon = 0 ;
50
+ while ( reader . ReadIsInObject ( ref count ) )
32
51
{
33
- case 0 :
34
- lat = reader . ReadDouble ( ) ;
35
- break ;
36
- case 1 :
37
- lon = reader . ReadDouble ( ) ;
38
- break ;
52
+ var propertyName = reader . ReadPropertyNameSegmentRaw ( ) ;
53
+ if ( Fields . TryGetValue ( propertyName , out var value ) )
54
+ {
55
+ switch ( value )
56
+ {
57
+ case 0 :
58
+ lat = reader . ReadDouble ( ) ;
59
+ break ;
60
+ case 1 :
61
+ lon = reader . ReadDouble ( ) ;
62
+ break ;
63
+ }
64
+ }
65
+ else
66
+ reader . ReadNextBlock ( ) ;
39
67
}
68
+
69
+ return new GeoLocation ( lat , lon ) { Format = GeoFormat . GeoJson } ;
40
70
}
41
- else
42
- reader . ReadNextBlock ( ) ;
43
71
}
44
-
45
- return new GeoLocation ( lat , lon ) ;
46
72
}
47
73
48
74
public void Serialize ( ref JsonWriter writer , GeoLocation value , IJsonFormatterResolver formatterResolver )
@@ -53,13 +79,31 @@ public void Serialize(ref JsonWriter writer, GeoLocation value, IJsonFormatterRe
53
79
return ;
54
80
}
55
81
56
- writer . WriteBeginObject ( ) ;
57
- writer . WritePropertyName ( "lat" ) ;
58
- writer . WriteDouble ( value . Latitude ) ;
59
- writer . WriteValueSeparator ( ) ;
60
- writer . WritePropertyName ( "lon" ) ;
61
- writer . WriteDouble ( value . Longitude ) ;
62
- writer . WriteEndObject ( ) ;
82
+ switch ( value . Format )
83
+ {
84
+ case GeoFormat . GeoJson :
85
+ writer . WriteBeginObject ( ) ;
86
+ writer . WritePropertyName ( "lat" ) ;
87
+ writer . WriteDouble ( value . Latitude ) ;
88
+ writer . WriteValueSeparator ( ) ;
89
+ writer . WritePropertyName ( "lon" ) ;
90
+ writer . WriteDouble ( value . Longitude ) ;
91
+ writer . WriteEndObject ( ) ;
92
+ break ;
93
+ case GeoFormat . WellKnownText :
94
+ var lon = value . Longitude . ToString ( CultureInfo . InvariantCulture ) ;
95
+ var lat = value . Latitude . ToString ( CultureInfo . InvariantCulture ) ;
96
+ var length = GeoShapeType . Point . Length + lon . Length + lat . Length + 4 ;
97
+ var builder = new StringBuilder ( length )
98
+ . Append ( GeoShapeType . Point )
99
+ . Append ( " (" )
100
+ . Append ( lon )
101
+ . Append ( " " )
102
+ . Append ( lat )
103
+ . Append ( ")" ) ;
104
+ writer . WriteString ( builder . ToString ( ) ) ;
105
+ break ;
106
+ }
63
107
}
64
108
}
65
109
}
0 commit comments