map_model/make/
bridges.rs

1use abstutil::Timer;
2use geom::{Distance, FindClosest};
3
4use crate::{Road, RoadID};
5
6/// Look for roads underneath bridges, then lower their z-order. OSM tags bridges and tunnels, but
7/// not the roads that pass under bridges.
8pub fn find_bridges(roads: &mut Vec<Road>, timer: &mut Timer) {
9    let mut closest: FindClosest<RoadID> = FindClosest::new();
10    let mut bridges = Vec::new();
11    for r in roads.iter() {
12        closest.add(r.id, r.center_pts.points());
13        if r.osm_tags.contains_key("bridge") {
14            bridges.push(r.id);
15        }
16    }
17
18    timer.start_iter("find roads underneath bridge", bridges.len());
19    for bridge in bridges {
20        timer.next();
21        let bridge_pts = roads[bridge.0].center_pts.clone();
22        for (r, _, _) in closest.all_close_pts(bridge_pts.middle(), Distance::meters(500.0)) {
23            #[allow(clippy::collapsible_if)]
24            if bridge != r
25                && bridge_pts != roads[r.0].center_pts
26                && bridge_pts.intersection(&roads[r.0].center_pts).is_some()
27            {
28                if roads[r.0].zorder == 0 {
29                    roads[r.0].zorder = -1;
30                }
31            }
32        }
33    }
34}