Skip to content

Commit c81771f

Browse files
committed
Refactor EWKB construction into a function
1 parent 0675321 commit c81771f

File tree

1 file changed

+27
-42
lines changed

1 file changed

+27
-42
lines changed

src/main.rs

Lines changed: 27 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -30,18 +30,28 @@ struct Ring {
3030
pos: Vec<f64>
3131
}
3232

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));
4354
}
44-
return ewkb;
4555
}
4656

4757
fn main() {
@@ -82,11 +92,11 @@ fn main() {
8292
let mut xmltotext = false;
8393
let mut text = String::new();
8494
let mut gmltoewkb = false;
95+
let mut gmltype: u8 = 0;
8596
let mut gmlsrid: u32 = 4326;
8697
let mut gmlrings: Vec<Ring> = Vec::new();
8798
let mut gmldims: u8 = 2;
8899
let mut gmlpos = false;
89-
let mut ewkb: Vec<u8> = Vec::new();
90100
let start = Instant::now();
91101
loop {
92102
match reader.read_event(&mut buf) {
@@ -129,9 +139,9 @@ fn main() {
129139
match reader.decode(e.name()) {
130140
Err(_) => (),
131141
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,
135145
"gml:exterior" => (),
136146
"gml:interior" => (),
137147
"gml:LinearRing" => gmlrings.push(Ring { pos: Vec::new() } ),
@@ -150,10 +160,7 @@ fn main() {
150160
match columns[i].convert {
151161
None => (),
152162
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,
157164
Some(_) => (),
158165
}
159166
break;
@@ -216,29 +223,7 @@ fn main() {
216223
for i in 0..columns.len() {
217224
if path == columns[i].path {
218225
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);
242227
gmlrings.clear();
243228
break;
244229
}

0 commit comments

Comments
 (0)