Skip to content

Commit 15e3094

Browse files
committed
Add support for holes in polygons
1 parent 6a57157 commit 15e3094

File tree

1 file changed

+33
-26
lines changed

1 file changed

+33
-26
lines changed

src/main.rs

Lines changed: 33 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ struct Geometry {
2525
pos: Vec<f64>
2626
}
2727

28+
struct Ring {
29+
pos: Vec<f64>
30+
}
31+
2832
fn geom_to_ewkb(geom: Geometry) -> Vec<u8> {
2933
let mut ewkb = Vec::new();
3034
ewkb.push(1);
@@ -78,11 +82,10 @@ fn main() {
7882
let mut text = String::new();
7983
let mut gmltoewkb = false;
8084
let mut gmlsrid: u32 = 4326;
81-
let mut gmlrings: u32 = 0;
85+
let mut gmlrings: Vec<Ring> = Vec::new();
8286
let mut gmldims: u8 = 2;
8387
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();
8689
loop {
8790
match reader.read_event(&mut buf) {
8891
Ok(Event::Start(ref e)) => {
@@ -128,22 +131,9 @@ fn main() {
128131
"gml:LineString" => ewkb.push(2),
129132
"gml:Polygon" => ewkb.push(3),
130133
"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,
147137
_ => eprintln!("GML type {} not supported", tag)
148138
}
149139
}
@@ -158,7 +148,10 @@ fn main() {
158148
match columns[i].convert {
159149
None => (),
160150
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+
}
162155
Some(_) => (),
163156
}
164157
break;
@@ -175,7 +168,7 @@ fn main() {
175168
if gmlpos {
176169
let value = String::from(&e.unescape_and_decode(&reader).unwrap());
177170
for pos in value.split(' ') {
178-
gmlposlist.push(pos.parse().unwrap());
171+
gmlrings.last_mut().unwrap().pos.push(pos.parse().unwrap());
179172
}
180173
}
181174
continue;
@@ -221,16 +214,30 @@ fn main() {
221214
for i in 0..columns.len() {
222215
if path == columns[i].path {
223216
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+
}
228235
}
229236
for byte in ewkb.iter() {
230237
columns[i].value.push_str(&format!("{:02X}", byte));
231238
}
232239
ewkb.clear();
233-
gmlposlist.clear();
240+
gmlrings.clear();
234241
break;
235242
}
236243
}

0 commit comments

Comments
 (0)