diff --git a/backend/src/route.rs b/backend/src/route.rs index 508da8e..adbc20b 100644 --- a/backend/src/route.rs +++ b/backend/src/route.rs @@ -30,6 +30,10 @@ impl Router { if modal_filters.contains_key(&road.id) { continue; } + // Loops can't be part of a shortest path + if road.src_i == road.dst_i { + continue; + } let i1 = node_map.get_or_insert(road.src_i); let i2 = node_map.get_or_insert(road.dst_i); diff --git a/backend/src/scrape.rs b/backend/src/scrape.rs index ac66d82..f3ae55e 100644 --- a/backend/src/scrape.rs +++ b/backend/src/scrape.rs @@ -21,7 +21,7 @@ pub fn scrape_osm(input_bytes: &[u8]) -> Result { node_mapping.insert(id, pt); } Element::Way { id, node_ids, tags } => { - if tags.contains_key("highway") { + if tags.contains_key("highway") && tags.get("area") != Some(&"yes".to_string()) { highways.push(Way { id, node_ids, diff --git a/backend/src/shortcuts.rs b/backend/src/shortcuts.rs index c784ab5..6fe8f8e 100644 --- a/backend/src/shortcuts.rs +++ b/backend/src/shortcuts.rs @@ -23,8 +23,12 @@ impl Shortcuts { if map.modal_filters.contains_key(r) { continue; } - let road = map.get_r(*r); + // Loops can't be part of a shortest path + if road.src_i == road.dst_i { + continue; + } + let i1 = node_map.get_or_insert(road.src_i); let i2 = node_map.get_or_insert(road.dst_i); let cost = (road.length() * 100.0) as usize; @@ -73,7 +77,7 @@ impl Shortcuts { impl Path { pub fn geometry(&self, map: &MapModel) -> LineString { let mut pts = Vec::new(); - for (r, i1, i2) in &self.steps { + for (r, i1, _i2) in &self.steps { let road = map.get_r(*r); if *i1 == road.src_i { pts.extend(road.linestring.0.clone());