1
- using System ;
2
- using System . Collections . Generic ;
3
- using GeoAPI . Geometries ;
4
- using NetTopologySuite . Features ;
5
- using Newtonsoft . Json ;
6
-
7
- namespace NetTopologySuite . IO . Converters
8
- {
9
- public class TopoFeatureConverter : CoordinateConverter
10
- {
11
- public override void WriteJson ( JsonWriter writer , object value , JsonSerializer serializer )
12
- {
13
- if ( writer == null )
14
- throw new ArgumentNullException ( "writer" ) ;
15
- if ( value == null )
16
- throw new ArgumentNullException ( "value" ) ;
17
- if ( serializer == null )
18
- throw new ArgumentNullException ( "serializer" ) ;
19
- if ( ! ( value is IFeature ) )
20
- {
21
- string s = String . Format ( "IFeature expected but was {0}" , value . GetType ( ) . Name ) ;
22
- throw new ArgumentException ( s ) ;
23
- }
24
-
25
- writer . WriteStartObject ( ) ;
26
- writer . WritePropertyName ( "type" ) ;
27
- writer . WriteValue ( "Topology" ) ;
28
-
29
- writer . WritePropertyName ( "objects" ) ;
30
- writer . WriteStartObject ( ) ;
31
- writer . WritePropertyName ( "data" ) ;
32
- IEnumerable < Coordinate [ ] > arcs = WriteFeature ( writer , serializer , ( IFeature ) value ) ;
33
- writer . WriteEndObject ( ) ;
34
-
35
- WriteArcs ( writer , serializer , arcs ) ;
36
- writer . WriteEndObject ( ) ;
37
- }
38
-
39
- private IEnumerable < Coordinate [ ] > WriteFeature ( JsonWriter writer , JsonSerializer serializer , IFeature feature )
40
- {
41
- if ( writer == null )
42
- throw new ArgumentNullException ( "writer" ) ;
43
- if ( serializer == null )
44
- throw new ArgumentNullException ( "serializer" ) ;
45
- if ( feature == null )
46
- throw new ArgumentNullException ( "feature" ) ;
47
-
48
- Coordinate [ ] [ ] arcs ;
49
- writer . WriteStartObject ( ) ;
50
- IGeometry geom = feature . Geometry ;
51
- writer . WritePropertyName ( "type" ) ;
52
- writer . WriteValue ( geom . GeometryType ) ;
53
- OgcGeometryType type = geom . OgcGeometryType ;
54
- switch ( type )
55
- {
56
- case OgcGeometryType . Point :
57
- WriteGeom ( writer , serializer , ( IPoint ) geom ) ;
58
- arcs = null ;
59
- break ;
60
- case OgcGeometryType . LineString :
61
- arcs = WriteGeom ( writer , ( ILineString ) geom ) ;
62
- break ;
63
- case OgcGeometryType . Polygon :
64
- arcs = WriteGeom ( writer , ( IPolygon ) geom ) ;
65
- break ;
66
- default :
67
- string err = String . Format ( "type unsupported: {0}" , type ) ;
68
- throw new ArgumentOutOfRangeException ( err ) ;
69
- }
70
- serializer . Serialize ( writer , feature . Attributes ) ;
71
- writer . WriteEndObject ( ) ;
72
- return arcs ;
73
- }
74
-
75
- private void WriteGeom ( JsonWriter writer , JsonSerializer serializer , IPoint pt )
76
- {
77
- if ( pt == null )
78
- throw new ArgumentNullException ( "pt" ) ;
79
-
80
- writer . WritePropertyName ( "coordinates" ) ;
81
- WriteJsonCoordinate ( writer , pt . Coordinate , serializer ) ;
82
- }
83
-
84
- private Coordinate [ ] [ ] WriteGeom ( JsonWriter writer , ILineString ls )
85
- {
86
- if ( ls == null )
87
- throw new ArgumentNullException ( "ls" ) ;
88
-
89
- writer . WritePropertyName ( "arcs" ) ;
90
- writer . WriteStartArray ( ) ;
91
- writer . WriteValue ( 0 ) ;
92
- writer . WriteEndArray ( ) ;
93
- return new [ ] { ls . Coordinates } ;
94
- }
95
-
96
- private Coordinate [ ] [ ] WriteGeom ( JsonWriter writer , IPolygon poly )
97
- {
98
- if ( poly == null )
99
- throw new ArgumentNullException ( "poly" ) ;
100
-
101
- int numHoles = poly . NumInteriorRings ;
102
- Coordinate [ ] [ ] arr = new Coordinate [ numHoles + 1 ] [ ] ;
103
- writer . WritePropertyName ( "arcs" ) ;
104
- writer . WriteStartArray ( ) ;
105
- writer . WriteStartArray ( ) ;
106
- // shell
107
- writer . WriteValue ( 0 ) ;
108
- arr [ 0 ] = poly . Shell . Coordinates ;
109
- // holes
110
- for ( int i = 0 ; i < numHoles ; i ++ )
111
- {
112
- writer . WriteValue ( i + 1 ) ;
113
- arr [ i + 1 ] = poly . GetInteriorRingN ( i ) . Coordinates ;
114
- }
115
- writer . WriteEndArray ( ) ;
116
- writer . WriteEndArray ( ) ;
117
- return arr ;
118
- }
119
-
120
- private void WriteArcs ( JsonWriter writer , JsonSerializer serializer , IEnumerable < Coordinate [ ] > arcs )
121
- {
122
- if ( arcs == null )
123
- return ;
124
-
125
- writer . WritePropertyName ( "arcs" ) ;
126
- WriteJsonCoordinatesEnumerable ( writer , arcs , serializer ) ;
127
- }
128
-
129
- public override object ReadJson ( JsonReader reader , Type objectType , object existingValue , JsonSerializer serializer )
130
- {
131
- throw new NotSupportedException ( "used only in serialization" ) ;
132
- }
133
-
134
- public override bool CanConvert ( Type objectType )
135
- {
136
- return typeof ( IFeature ) . IsAssignableFrom ( objectType ) ;
137
- }
138
- }
1
+ using System ;
2
+ using System . Collections . Generic ;
3
+ using GeoAPI . Geometries ;
4
+ using NetTopologySuite . Features ;
5
+ using Newtonsoft . Json ;
6
+
7
+ namespace NetTopologySuite . IO . Converters
8
+ {
9
+ public class TopoFeatureConverter : CoordinateConverter
10
+ {
11
+ public override void WriteJson ( JsonWriter writer , object value , JsonSerializer serializer )
12
+ {
13
+ if ( writer == null )
14
+ throw new ArgumentNullException ( "writer" ) ;
15
+ if ( value == null )
16
+ throw new ArgumentNullException ( "value" ) ;
17
+ if ( serializer == null )
18
+ throw new ArgumentNullException ( "serializer" ) ;
19
+ if ( ! ( value is IFeature ) )
20
+ {
21
+ string s = String . Format ( "IFeature expected but was {0}" , value . GetType ( ) . Name ) ;
22
+ throw new ArgumentException ( s ) ;
23
+ }
24
+
25
+ writer . WriteStartObject ( ) ;
26
+ writer . WritePropertyName ( "type" ) ;
27
+ writer . WriteValue ( "Topology" ) ;
28
+
29
+ writer . WritePropertyName ( "objects" ) ;
30
+ writer . WriteStartObject ( ) ;
31
+ writer . WritePropertyName ( "data" ) ;
32
+ IEnumerable < Coordinate [ ] > arcs = WriteFeature ( writer , serializer , ( IFeature ) value ) ;
33
+ writer . WriteEndObject ( ) ;
34
+
35
+ WriteArcs ( writer , serializer , arcs ) ;
36
+ writer . WriteEndObject ( ) ;
37
+ }
38
+
39
+ private IEnumerable < Coordinate [ ] > WriteFeature ( JsonWriter writer , JsonSerializer serializer , IFeature feature )
40
+ {
41
+ if ( writer == null )
42
+ throw new ArgumentNullException ( "writer" ) ;
43
+ if ( serializer == null )
44
+ throw new ArgumentNullException ( "serializer" ) ;
45
+ if ( feature == null )
46
+ throw new ArgumentNullException ( "feature" ) ;
47
+
48
+ Coordinate [ ] [ ] arcs ;
49
+ writer . WriteStartObject ( ) ;
50
+ IGeometry geom = feature . Geometry ;
51
+ writer . WritePropertyName ( "type" ) ;
52
+ writer . WriteValue ( geom . GeometryType ) ;
53
+ OgcGeometryType type = geom . OgcGeometryType ;
54
+ switch ( type )
55
+ {
56
+ case OgcGeometryType . Point :
57
+ WriteGeom ( writer , serializer , ( IPoint ) geom ) ;
58
+ arcs = null ;
59
+ break ;
60
+ case OgcGeometryType . LineString :
61
+ arcs = WriteGeom ( writer , ( ILineString ) geom ) ;
62
+ break ;
63
+ case OgcGeometryType . Polygon :
64
+ arcs = WriteGeom ( writer , ( IPolygon ) geom ) ;
65
+ break ;
66
+ default :
67
+ string err = String . Format ( "type unsupported: {0}" , type ) ;
68
+ throw new ArgumentOutOfRangeException ( err ) ;
69
+ }
70
+ // properties
71
+ writer . WritePropertyName ( "properties" ) ;
72
+ serializer . Serialize ( writer , feature . Attributes ) ;
73
+
74
+ writer . WriteEndObject ( ) ;
75
+ return arcs ;
76
+ }
77
+
78
+ private void WriteGeom ( JsonWriter writer , JsonSerializer serializer , IPoint pt )
79
+ {
80
+ if ( pt == null )
81
+ throw new ArgumentNullException ( "pt" ) ;
82
+
83
+ writer . WritePropertyName ( "coordinates" ) ;
84
+ WriteJsonCoordinate ( writer , pt . Coordinate , serializer ) ;
85
+ }
86
+
87
+ private Coordinate [ ] [ ] WriteGeom ( JsonWriter writer , ILineString ls )
88
+ {
89
+ if ( ls == null )
90
+ throw new ArgumentNullException ( "ls" ) ;
91
+
92
+ writer . WritePropertyName ( "arcs" ) ;
93
+ writer . WriteStartArray ( ) ;
94
+ writer . WriteValue ( 0 ) ;
95
+ writer . WriteEndArray ( ) ;
96
+ return new [ ] { ls . Coordinates } ;
97
+ }
98
+
99
+ private Coordinate [ ] [ ] WriteGeom ( JsonWriter writer , IPolygon poly )
100
+ {
101
+ if ( poly == null )
102
+ throw new ArgumentNullException ( "poly" ) ;
103
+
104
+ int numHoles = poly . NumInteriorRings ;
105
+ Coordinate [ ] [ ] arr = new Coordinate [ numHoles + 1 ] [ ] ;
106
+ writer . WritePropertyName ( "arcs" ) ;
107
+ writer . WriteStartArray ( ) ;
108
+ writer . WriteStartArray ( ) ;
109
+ // shell
110
+ writer . WriteValue ( 0 ) ;
111
+ arr [ 0 ] = poly . Shell . Coordinates ;
112
+ // holes
113
+ for ( int i = 0 ; i < numHoles ; i ++ )
114
+ {
115
+ writer . WriteValue ( i + 1 ) ;
116
+ arr [ i + 1 ] = poly . GetInteriorRingN ( i ) . Coordinates ;
117
+ }
118
+ writer . WriteEndArray ( ) ;
119
+ writer . WriteEndArray ( ) ;
120
+ return arr ;
121
+ }
122
+
123
+ private void WriteArcs ( JsonWriter writer , JsonSerializer serializer , IEnumerable < Coordinate [ ] > arcs )
124
+ {
125
+ if ( arcs == null )
126
+ return ;
127
+
128
+ writer . WritePropertyName ( "arcs" ) ;
129
+ WriteJsonCoordinatesEnumerable ( writer , arcs , serializer ) ;
130
+ }
131
+
132
+ public override object ReadJson ( JsonReader reader , Type objectType , object existingValue , JsonSerializer serializer )
133
+ {
134
+ throw new NotSupportedException ( "used only in serialization" ) ;
135
+ }
136
+
137
+ public override bool CanConvert ( Type objectType )
138
+ {
139
+ return typeof ( IFeature ) . IsAssignableFrom ( objectType ) ;
140
+ }
141
+ }
139
142
}
0 commit comments