@@ -21,31 +21,38 @@ struct Column<'a> {
21
21
22
22
struct Geometry {
23
23
gtype : u8 ,
24
+ dims : u8 ,
24
25
srid : u32 ,
25
- num : u32 ,
26
- pos : Vec < f64 >
26
+ rings : Vec < Vec < f64 > >
27
27
}
28
-
29
- struct Ring {
30
- pos : Vec < f64 >
28
+ impl Geometry {
29
+ fn new ( ) -> Geometry {
30
+ Geometry { gtype : 0 , dims : 2 , srid : 4326 , rings : Vec :: new ( ) }
31
+ }
32
+ fn reset ( & mut self ) {
33
+ self . gtype = 0 ;
34
+ self . dims = 2 ;
35
+ self . srid = 4326 ;
36
+ self . rings . clear ( ) ;
37
+ }
31
38
}
32
39
33
- fn gml_to_ewkb ( value : & mut String , gmltype : u8 , gmldims : u8 , gmlsrid : u32 , gmlrings : & Vec < Ring > ) {
34
- let mut ewkb = vec ! [ 1 , gmltype , 0 , 0 ] ;
35
- let code = match gmldims {
40
+ fn gml_to_ewkb ( value : & mut String , geom : & Geometry ) {
41
+ let mut ewkb = vec ! [ 1 , geom . gtype , 0 , 0 ] ;
42
+ let code = match geom . dims {
36
43
2 => 32 ,
37
44
3 => 32 | 128 ,
38
45
_ => {
39
- eprintln ! ( "GML number of dimensions {} not supported" , gmldims ) ;
46
+ eprintln ! ( "GML number of dimensions {} not supported" , geom . dims ) ;
40
47
32
41
48
}
42
49
} ;
43
50
ewkb. push ( code) ;
44
- ewkb. extend_from_slice ( & gmlsrid . to_le_bytes ( ) ) ;
45
- ewkb. extend_from_slice ( & ( gmlrings . len ( ) as u32 ) . to_le_bytes ( ) ) ;
46
- for ring in gmlrings . iter ( ) {
47
- ewkb. extend_from_slice ( & ( ( ring. pos . len ( ) as u32 ) /gmldims as u32 ) . to_le_bytes ( ) ) ;
48
- for pos in ring. pos . iter ( ) {
51
+ ewkb. extend_from_slice ( & geom . srid . to_le_bytes ( ) ) ;
52
+ ewkb. extend_from_slice ( & ( geom . rings . len ( ) as u32 ) . to_le_bytes ( ) ) ;
53
+ for ring in geom . rings . iter ( ) {
54
+ ewkb. extend_from_slice ( & ( ( ring. len ( ) as u32 ) /geom . dims as u32 ) . to_le_bytes ( ) ) ;
55
+ for pos in ring. iter ( ) {
49
56
ewkb. extend_from_slice ( & pos. to_le_bytes ( ) ) ;
50
57
}
51
58
}
@@ -92,11 +99,8 @@ fn main() {
92
99
let mut xmltotext = false ;
93
100
let mut text = String :: new ( ) ;
94
101
let mut gmltoewkb = false ;
95
- let mut gmltype: u8 = 0 ;
96
- let mut gmlsrid: u32 = 4326 ;
97
- let mut gmlrings: Vec < Ring > = Vec :: new ( ) ;
98
- let mut gmldims: u8 = 2 ;
99
102
let mut gmlpos = false ;
103
+ let mut gmlgeom = Geometry :: new ( ) ;
100
104
let start = Instant :: now ( ) ;
101
105
loop {
102
106
match reader. read_event ( & mut buf) {
@@ -120,14 +124,14 @@ fn main() {
120
124
value = value. split_off ( i+2 ) ;
121
125
}
122
126
match value. parse :: < u32 > ( ) {
123
- Ok ( int) => gmlsrid = int,
127
+ Ok ( int) => gmlgeom . srid = int,
124
128
Err ( _) => eprintln ! ( "Invalid srsName {} in GML" , value)
125
129
}
126
130
} ,
127
131
Ok ( "srsDimension" ) => {
128
132
let value = reader. decode ( & attr. value ) . unwrap ( ) ;
129
133
match value. parse :: < u8 > ( ) {
130
- Ok ( int) => gmldims = int,
134
+ Ok ( int) => gmlgeom . dims = int,
131
135
Err ( _) => eprintln ! ( "Invalid srsDimension {} in GML" , value)
132
136
}
133
137
}
@@ -139,12 +143,12 @@ fn main() {
139
143
match reader. decode ( e. name ( ) ) {
140
144
Err ( _) => ( ) ,
141
145
Ok ( tag) => match tag {
142
- "gml:Point" => gmltype = 1 ,
143
- "gml:LineString" => gmltype = 2 ,
144
- "gml:Polygon" => gmltype = 3 ,
146
+ "gml:Point" => gmlgeom . gtype = 1 ,
147
+ "gml:LineString" => gmlgeom . gtype = 2 ,
148
+ "gml:Polygon" => gmlgeom . gtype = 3 ,
145
149
"gml:exterior" => ( ) ,
146
150
"gml:interior" => ( ) ,
147
- "gml:LinearRing" => gmlrings . push ( Ring { pos : Vec :: new ( ) } ) ,
151
+ "gml:LinearRing" => gmlgeom . rings . push ( Vec :: new ( ) ) ,
148
152
"gml:posList" => gmlpos = true ,
149
153
_ => eprintln ! ( "GML type {} not supported" , tag)
150
154
}
@@ -177,7 +181,7 @@ fn main() {
177
181
if gmlpos {
178
182
let value = String :: from ( & e. unescape_and_decode ( & reader) . unwrap ( ) ) ;
179
183
for pos in value. split ( ' ' ) {
180
- gmlrings . last_mut ( ) . unwrap ( ) . pos . push ( pos. parse ( ) . unwrap ( ) ) ;
184
+ gmlgeom . rings . last_mut ( ) . unwrap ( ) . push ( pos. parse ( ) . unwrap ( ) ) ;
181
185
}
182
186
}
183
187
continue ;
@@ -223,8 +227,8 @@ fn main() {
223
227
for i in 0 ..columns. len ( ) {
224
228
if path == columns[ i] . path {
225
229
gmltoewkb = false ;
226
- gml_to_ewkb ( & mut columns[ i] . value , gmltype , gmldims , gmlsrid , & gmlrings ) ;
227
- gmlrings . clear ( ) ;
230
+ gml_to_ewkb ( & mut columns[ i] . value , & gmlgeom ) ;
231
+ gmlgeom . reset ( ) ;
228
232
break ;
229
233
}
230
234
}
0 commit comments