Skip to content

Commit 29ddc7e

Browse files
committed
Abstract GML data into custom Geometry type
1 parent c81771f commit 29ddc7e

File tree

1 file changed

+31
-27
lines changed

1 file changed

+31
-27
lines changed

src/main.rs

Lines changed: 31 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -21,31 +21,38 @@ struct Column<'a> {
2121

2222
struct Geometry {
2323
gtype: u8,
24+
dims: u8,
2425
srid: u32,
25-
num: u32,
26-
pos: Vec<f64>
26+
rings: Vec<Vec<f64>>
2727
}
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+
}
3138
}
3239

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 {
3643
2 => 32,
3744
3 => 32 | 128,
3845
_ => {
39-
eprintln!("GML number of dimensions {} not supported", gmldims);
46+
eprintln!("GML number of dimensions {} not supported", geom.dims);
4047
32
4148
}
4249
};
4350
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() {
4956
ewkb.extend_from_slice(&pos.to_le_bytes());
5057
}
5158
}
@@ -92,11 +99,8 @@ fn main() {
9299
let mut xmltotext = false;
93100
let mut text = String::new();
94101
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;
99102
let mut gmlpos = false;
103+
let mut gmlgeom = Geometry::new();
100104
let start = Instant::now();
101105
loop {
102106
match reader.read_event(&mut buf) {
@@ -120,14 +124,14 @@ fn main() {
120124
value = value.split_off(i+2);
121125
}
122126
match value.parse::<u32>() {
123-
Ok(int) => gmlsrid = int,
127+
Ok(int) => gmlgeom.srid = int,
124128
Err(_) => eprintln!("Invalid srsName {} in GML", value)
125129
}
126130
},
127131
Ok("srsDimension") => {
128132
let value = reader.decode(&attr.value).unwrap();
129133
match value.parse::<u8>() {
130-
Ok(int) => gmldims = int,
134+
Ok(int) => gmlgeom.dims = int,
131135
Err(_) => eprintln!("Invalid srsDimension {} in GML", value)
132136
}
133137
}
@@ -139,12 +143,12 @@ fn main() {
139143
match reader.decode(e.name()) {
140144
Err(_) => (),
141145
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,
145149
"gml:exterior" => (),
146150
"gml:interior" => (),
147-
"gml:LinearRing" => gmlrings.push(Ring { pos: Vec::new() } ),
151+
"gml:LinearRing" => gmlgeom.rings.push(Vec::new()),
148152
"gml:posList" => gmlpos = true,
149153
_ => eprintln!("GML type {} not supported", tag)
150154
}
@@ -177,7 +181,7 @@ fn main() {
177181
if gmlpos {
178182
let value = String::from(&e.unescape_and_decode(&reader).unwrap());
179183
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());
181185
}
182186
}
183187
continue;
@@ -223,8 +227,8 @@ fn main() {
223227
for i in 0..columns.len() {
224228
if path == columns[i].path {
225229
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();
228232
break;
229233
}
230234
}

0 commit comments

Comments
 (0)