@@ -30,18 +30,28 @@ struct Ring {
30
30
pos : Vec < f64 >
31
31
}
32
32
33
- fn geom_to_ewkb ( geom : Geometry ) -> Vec < u8 > {
34
- let mut ewkb = Vec :: new ( ) ;
35
- ewkb. push ( 1 ) ;
36
- ewkb. push ( geom. gtype ) ;
37
- ewkb. push ( 0 ) ;
38
- ewkb. push ( 0 ) ;
39
- ewkb. push ( 32 ) ;
40
- ewkb. extend_from_slice ( & geom. srid . to_le_bytes ( ) ) ;
41
- for pos in geom. pos . iter ( ) {
42
- ewkb. extend_from_slice ( & pos. to_le_bytes ( ) ) ;
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 {
36
+ 2 => 32 ,
37
+ 3 => 32 | 128 ,
38
+ _ => {
39
+ eprintln ! ( "GML number of dimensions {} not supported" , gmldims) ;
40
+ 32
41
+ }
42
+ } ;
43
+ 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 ( ) {
49
+ ewkb. extend_from_slice ( & pos. to_le_bytes ( ) ) ;
50
+ }
51
+ }
52
+ for byte in ewkb. iter ( ) {
53
+ value. push_str ( & format ! ( "{:02X}" , byte) ) ;
43
54
}
44
- return ewkb;
45
55
}
46
56
47
57
fn main ( ) {
@@ -82,11 +92,11 @@ fn main() {
82
92
let mut xmltotext = false ;
83
93
let mut text = String :: new ( ) ;
84
94
let mut gmltoewkb = false ;
95
+ let mut gmltype: u8 = 0 ;
85
96
let mut gmlsrid: u32 = 4326 ;
86
97
let mut gmlrings: Vec < Ring > = Vec :: new ( ) ;
87
98
let mut gmldims: u8 = 2 ;
88
99
let mut gmlpos = false ;
89
- let mut ewkb: Vec < u8 > = Vec :: new ( ) ;
90
100
let start = Instant :: now ( ) ;
91
101
loop {
92
102
match reader. read_event ( & mut buf) {
@@ -129,9 +139,9 @@ fn main() {
129
139
match reader. decode ( e. name ( ) ) {
130
140
Err ( _) => ( ) ,
131
141
Ok ( tag) => match tag {
132
- "gml:Point" => ewkb . push ( 1 ) ,
133
- "gml:LineString" => ewkb . push ( 2 ) ,
134
- "gml:Polygon" => ewkb . push ( 3 ) ,
142
+ "gml:Point" => gmltype = 1 ,
143
+ "gml:LineString" => gmltype = 2 ,
144
+ "gml:Polygon" => gmltype = 3 ,
135
145
"gml:exterior" => ( ) ,
136
146
"gml:interior" => ( ) ,
137
147
"gml:LinearRing" => gmlrings. push ( Ring { pos : Vec :: new ( ) } ) ,
@@ -150,10 +160,7 @@ fn main() {
150
160
match columns[ i] . convert {
151
161
None => ( ) ,
152
162
Some ( "xml-to-text" ) => xmltotext = true ,
153
- Some ( "gml-to-ewkb" ) => {
154
- gmltoewkb = true ;
155
- ewkb. push ( 1 ) ;
156
- }
163
+ Some ( "gml-to-ewkb" ) => gmltoewkb = true ,
157
164
Some ( _) => ( ) ,
158
165
}
159
166
break ;
@@ -216,29 +223,7 @@ fn main() {
216
223
for i in 0 ..columns. len ( ) {
217
224
if path == columns[ i] . path {
218
225
gmltoewkb = false ;
219
- ewkb. push ( 0 ) ;
220
- ewkb. push ( 0 ) ;
221
- let code = match gmldims {
222
- 2 => 32 ,
223
- 3 => 32 | 128 ,
224
- _ => {
225
- eprintln ! ( "GML number of dimensions {} not supported" , gmldims) ;
226
- 32
227
- }
228
- } ;
229
- ewkb. push ( code) ;
230
- ewkb. extend_from_slice ( & gmlsrid. to_le_bytes ( ) ) ;
231
- ewkb. extend_from_slice ( & ( gmlrings. len ( ) as u32 ) . to_le_bytes ( ) ) ;
232
- for ring in gmlrings. iter ( ) {
233
- ewkb. extend_from_slice ( & ( ( ring. pos . len ( ) as u32 ) /gmldims as u32 ) . to_le_bytes ( ) ) ;
234
- for pos in ring. pos . iter ( ) {
235
- ewkb. extend_from_slice ( & pos. to_le_bytes ( ) ) ;
236
- }
237
- }
238
- for byte in ewkb. iter ( ) {
239
- columns[ i] . value . push_str ( & format ! ( "{:02X}" , byte) ) ;
240
- }
241
- ewkb. clear ( ) ;
226
+ gml_to_ewkb ( & mut columns[ i] . value , gmltype, gmldims, gmlsrid, & gmlrings) ;
242
227
gmlrings. clear ( ) ;
243
228
break ;
244
229
}
0 commit comments