@@ -25,6 +25,10 @@ struct Geometry {
25
25
pos : Vec < f64 >
26
26
}
27
27
28
+ struct Ring {
29
+ pos : Vec < f64 >
30
+ }
31
+
28
32
fn geom_to_ewkb ( geom : Geometry ) -> Vec < u8 > {
29
33
let mut ewkb = Vec :: new ( ) ;
30
34
ewkb. push ( 1 ) ;
@@ -78,11 +82,10 @@ fn main() {
78
82
let mut text = String :: new ( ) ;
79
83
let mut gmltoewkb = false ;
80
84
let mut gmlsrid: u32 = 4326 ;
81
- let mut gmlrings: u32 = 0 ;
85
+ let mut gmlrings: Vec < Ring > = Vec :: new ( ) ;
82
86
let mut gmldims: u8 = 2 ;
83
87
let mut gmlpos = false ;
84
- let mut gmlposlist: Vec < f64 > = Vec :: new ( ) ;
85
- let mut ewkb: Vec < u8 > = vec ! [ 1 ] ;
88
+ let mut ewkb: Vec < u8 > = Vec :: new ( ) ;
86
89
loop {
87
90
match reader. read_event ( & mut buf) {
88
91
Ok ( Event :: Start ( ref e) ) => {
@@ -128,22 +131,9 @@ fn main() {
128
131
"gml:LineString" => ewkb. push ( 2 ) ,
129
132
"gml:Polygon" => ewkb. push ( 3 ) ,
130
133
"gml:exterior" => ( ) ,
131
- "gml:LinearRing" => gmlrings += 1 ,
132
- "gml:posList" => {
133
- gmlpos = true ;
134
- ewkb. push ( 0 ) ;
135
- ewkb. push ( 0 ) ;
136
- let code = match gmldims {
137
- 2 => 32 ,
138
- 3 => 32 | 128 ,
139
- _ => {
140
- eprintln ! ( "GML number of dimensions {} not supported" , gmldims) ;
141
- 32
142
- }
143
- } ;
144
- ewkb. push ( code) ;
145
- ewkb. extend_from_slice ( & gmlsrid. to_le_bytes ( ) ) ;
146
- }
134
+ "gml:interior" => ( ) ,
135
+ "gml:LinearRing" => gmlrings. push ( Ring { pos : Vec :: new ( ) } ) ,
136
+ "gml:posList" => gmlpos = true ,
147
137
_ => eprintln ! ( "GML type {} not supported" , tag)
148
138
}
149
139
}
@@ -158,7 +148,10 @@ fn main() {
158
148
match columns[ i] . convert {
159
149
None => ( ) ,
160
150
Some ( "xml-to-text" ) => xmltotext = true ,
161
- Some ( "gml-to-ewkb" ) => gmltoewkb = true ,
151
+ Some ( "gml-to-ewkb" ) => {
152
+ gmltoewkb = true ;
153
+ ewkb. push ( 1 ) ;
154
+ }
162
155
Some ( _) => ( ) ,
163
156
}
164
157
break ;
@@ -175,7 +168,7 @@ fn main() {
175
168
if gmlpos {
176
169
let value = String :: from ( & e. unescape_and_decode ( & reader) . unwrap ( ) ) ;
177
170
for pos in value. split ( ' ' ) {
178
- gmlposlist . push ( pos. parse ( ) . unwrap ( ) ) ;
171
+ gmlrings . last_mut ( ) . unwrap ( ) . pos . push ( pos. parse ( ) . unwrap ( ) ) ;
179
172
}
180
173
}
181
174
continue ;
@@ -221,16 +214,30 @@ fn main() {
221
214
for i in 0 ..columns. len ( ) {
222
215
if path == columns[ i] . path {
223
216
gmltoewkb = false ;
224
- ewkb. extend_from_slice ( & gmlrings. to_le_bytes ( ) ) ;
225
- ewkb. extend_from_slice ( & ( ( gmlposlist. len ( ) as u32 ) /gmldims as u32 ) . to_le_bytes ( ) ) ;
226
- for pos in gmlposlist. iter ( ) {
227
- ewkb. extend_from_slice ( & pos. to_le_bytes ( ) ) ;
217
+ ewkb. push ( 0 ) ;
218
+ ewkb. push ( 0 ) ;
219
+ let code = match gmldims {
220
+ 2 => 32 ,
221
+ 3 => 32 | 128 ,
222
+ _ => {
223
+ eprintln ! ( "GML number of dimensions {} not supported" , gmldims) ;
224
+ 32
225
+ }
226
+ } ;
227
+ ewkb. push ( code) ;
228
+ ewkb. extend_from_slice ( & gmlsrid. to_le_bytes ( ) ) ;
229
+ ewkb. extend_from_slice ( & ( gmlrings. len ( ) as u32 ) . to_le_bytes ( ) ) ;
230
+ for ring in gmlrings. iter ( ) {
231
+ ewkb. extend_from_slice ( & ( ( ring. pos . len ( ) as u32 ) /gmldims as u32 ) . to_le_bytes ( ) ) ;
232
+ for pos in ring. pos . iter ( ) {
233
+ ewkb. extend_from_slice ( & pos. to_le_bytes ( ) ) ;
234
+ }
228
235
}
229
236
for byte in ewkb. iter ( ) {
230
237
columns[ i] . value . push_str ( & format ! ( "{:02X}" , byte) ) ;
231
238
}
232
239
ewkb. clear ( ) ;
233
- gmlposlist . clear ( ) ;
240
+ gmlrings . clear ( ) ;
234
241
break ;
235
242
}
236
243
}
0 commit comments