From 2d3ab269063f729ea6be842180a83a0b18b2e51c Mon Sep 17 00:00:00 2001 From: Dustin Carlino Date: Wed, 17 Nov 2021 18:39:27 -0800 Subject: [PATCH] Rip out all old broken code for importing OSM bus stops and routes. #372 This code stopped working around July 2020 when I attempted to tackle #190. It's sat dormant since then, with most bus and light rail routes not imported correctly at all. I'm going to (eventually) start another attempt at public transit in A/B Street by treating GTFS as the main source of truth, not trying to understand route relations mapped in OSM. It's simplest to just rip out all this old code first. Some of it may be useful later, but version control preserves it. Regenerating everything; this is a binary format change. --- convert_osm/src/clip.rs | 70 +- convert_osm/src/extract.rs | 41 +- convert_osm/src/lib.rs | 18 +- convert_osm/src/split_ways.rs | 22 +- convert_osm/src/transit.rs | 317 -------- data/MANIFEST.json | 1118 ++++++++++++++--------------- importer/src/lib.rs | 14 +- importer/src/seattle.rs | 94 +-- map_model/src/make/mod.rs | 14 - map_model/src/make/transit.rs | 351 --------- map_model/src/objects/bus_stop.rs | 1 + map_model/src/raw.rs | 28 - 12 files changed, 542 insertions(+), 1546 deletions(-) delete mode 100644 convert_osm/src/transit.rs delete mode 100644 map_model/src/make/transit.rs diff --git a/convert_osm/src/clip.rs b/convert_osm/src/clip.rs index a3436942ce..3844dfe8b9 100644 --- a/convert_osm/src/clip.rs +++ b/convert_osm/src/clip.rs @@ -1,7 +1,7 @@ use std::collections::BTreeMap; use abstutil::Timer; -use geom::{Distance, PolyLine, Ring}; +use geom::{PolyLine, Ring}; use map_model::raw::{OriginalRoad, RawMap}; use map_model::{osm, IntersectionType}; @@ -165,73 +165,5 @@ pub fn clip_map(map: &mut RawMap, timer: &mut Timer) { panic!("There are no roads inside the clipping polygon"); } - let all_routes = map.bus_routes.drain(..).collect::>(); - for mut r in all_routes { - if r.stops[0].vehicle_pos == r.stops.last().unwrap().vehicle_pos { - // A loop? - map.bus_routes.push(r); - continue; - } - - let mut borders: Vec = Vec::new(); - for (node, _) in &r.all_pts { - if let Some(i) = map.intersections.get(node) { - if i.intersection_type == IntersectionType::Border { - borders.push(*node); - } - } - if let Some(i) = extra_borders.get(node) { - borders.push(*i); - } - } - - // Guess which border is for the beginning and end of the route. - let start_i = map.closest_intersection(r.stops[0].vehicle_pos.1); - let end_i = map.closest_intersection(r.stops.last().unwrap().vehicle_pos.1); - let mut best_start: Option<(osm::NodeID, Distance)> = None; - let mut best_end: Option<(osm::NodeID, Distance)> = None; - for i in borders { - // closest_intersection might snap to the wrong end, so try both directions - if let Some(d1) = map - .path_dist_to(i, start_i) - .or_else(|| map.path_dist_to(start_i, i)) - { - if best_start.map(|(_, d2)| d1 < d2).unwrap_or(true) { - best_start = Some((i, d1)); - } - } - if let Some(d1) = map.path_dist_to(end_i, i) { - if best_end.map(|(_, d2)| d1 < d2).unwrap_or(true) { - best_end = Some((i, d1)); - } - } - } - - // If both matched to the same border, probably the route properly starts or ends inside - // the map. (If it was both, then we shouldn't have even had any borders at all.) - match (best_start, best_end) { - (Some((i1, d1)), Some((i2, d2))) => { - if i1 == i2 { - if d1 < d2 { - r.border_start = Some(i1); - } else { - r.border_end = Some(i2); - } - } else { - r.border_start = Some(i1); - r.border_end = Some(i2); - } - } - (Some((i1, _)), None) => { - r.border_start = Some(i1); - } - (None, Some((i2, _))) => { - r.border_end = Some(i2); - } - (None, None) => {} - } - map.bus_routes.push(r); - } - timer.stop("clipping map to boundary"); } diff --git a/convert_osm/src/extract.rs b/convert_osm/src/extract.rs index 06f08989b5..2ea89daee8 100644 --- a/convert_osm/src/extract.rs +++ b/convert_osm/src/extract.rs @@ -10,7 +10,7 @@ use map_model::raw::{RawArea, RawBuilding, RawMap, RawParkingLot, RawRoad, Restr use map_model::{osm, Amenity, AreaType, Direction, DrivingSide, NamePerLanguage}; use crate::osm_geom::{get_multipolygon_members, glue_multipolygon, multipoly_geometry}; -use crate::{transit, Options}; +use crate::Options; pub struct OsmExtract { /// Unsplit roads @@ -186,8 +186,6 @@ pub fn extract_osm( let boundary = map.boundary_polygon.clone().into_ring(); let mut amenity_areas: Vec<(Polygon, Amenity)> = Vec::new(); - // Vehicle position (stop) -> pedestrian position (platform) - let mut stop_areas: Vec<((osm::NodeID, Pt2D), Pt2D)> = Vec::new(); // TODO Fill this out in a separate loop to keep a mutable borrow short. Maybe do this in // reader, or stop doing this entirely. @@ -285,9 +283,6 @@ pub fn extract_osm( osm_tags: rel.tags.clone(), }); } - } else if rel.tags.is("type", "route") { - map.bus_routes - .extend(transit::extract_route(id, rel, &doc, &map.boundary_polygon)); } else if rel.tags.is("type", "multipolygon") && rel.tags.contains_key("amenity") { let amenity = Amenity { names: NamePerLanguage::new(&rel.tags).unwrap_or_else(NamePerLanguage::unnamed), @@ -304,28 +299,6 @@ pub fn extract_osm( } } } - } else if rel.tags.is("public_transport", "stop_area") { - let mut stops = Vec::new(); - let mut platform: Option = None; - for (role, member) in &rel.members { - if let OsmID::Node(n) = member { - let pt = doc.nodes[n].pt; - if role == "stop" { - stops.push((*n, pt)); - } else if role == "platform" { - platform = Some(pt); - } - } else if let OsmID::Way(w) = member { - if role == "platform" { - platform = Some(Pt2D::center(&doc.ways[w].pts)); - } - } - } - if let Some(ped_pos) = platform { - for vehicle_pos in stops { - stop_areas.push((vehicle_pos, ped_pos)); - } - } } } @@ -364,18 +337,6 @@ pub fn extract_osm( } } - // Match platforms from stop_areas. Not sure what order routes and stop_areas will appear in - // relations, so do this after reading all of them. - for (vehicle_pos, ped_pos) in stop_areas { - for route in &mut map.bus_routes { - for stop in &mut route.stops { - if stop.vehicle_pos == vehicle_pos { - stop.ped_pos = Some(ped_pos); - } - } - } - } - // Hack to fix z-ordering for Green Lake (and probably other places). Put water and islands // last. I think the more proper fix is interpreting "inner" roles in relations. map.areas.sort_by_key(|a| match a.area_type { diff --git a/convert_osm/src/lib.rs b/convert_osm/src/lib.rs index 273f70c1cf..d65400bb1d 100644 --- a/convert_osm/src/lib.rs +++ b/convert_osm/src/lib.rs @@ -21,7 +21,6 @@ pub mod osm_geom; mod parking; pub mod reader; mod split_ways; -mod transit; /// Configures the creation of a RawMap from OSM and other input data. pub struct Options { @@ -93,28 +92,13 @@ pub fn convert( } let extract = extract::extract_osm(&mut map, &osm_input_path, clip_path, &opts, timer); - let (amenities, crosswalks, pt_to_road) = split_ways::split_up_roads(&mut map, extract, timer); + let (amenities, crosswalks) = split_ways::split_up_roads(&mut map, extract, timer); clip::clip_map(&mut map, timer); // Need to do a first pass of removing cul-de-sacs here, or we wind up with loop PolyLines when // doing the parking hint matching. map.roads.retain(|r, _| r.i1 != r.i2); - let all_routes = map.bus_routes.drain(..).collect::>(); - let mut routes = Vec::new(); - for route in all_routes { - let name = format!("{} ({})", route.osm_rel_id, route.full_name); - match transit::snap_bus_stops(route, &mut map, &pt_to_road) { - Ok(r) => { - routes.push(r); - } - Err(err) => { - error!("Skipping {}: {}", name, err); - } - } - } - map.bus_routes = routes; - use_amenities(&mut map, amenities, timer); parking::apply_parking(&mut map, &opts, timer); diff --git a/convert_osm/src/split_ways.rs b/convert_osm/src/split_ways.rs index 3f0dde4faf..889bf3cccf 100644 --- a/convert_osm/src/split_ways.rs +++ b/convert_osm/src/split_ways.rs @@ -7,17 +7,12 @@ use map_model::{osm, Amenity, Direction, IntersectionType}; use crate::extract::OsmExtract; -/// Returns amenities, a set of crosswalk locations, and a mapping of all points to split road. -/// (Some internal points on roads get removed in this call, so this mapping isn't redundant.) +/// Returns amenities and a set of crosswalk locations. pub fn split_up_roads( map: &mut RawMap, mut input: OsmExtract, timer: &mut Timer, -) -> ( - Vec<(Pt2D, Amenity)>, - HashSet, - HashMap, -) { +) -> (Vec<(Pt2D, Amenity)>, HashSet) { timer.start("splitting up roads"); let mut roundabout_centers: HashMap = HashMap::new(); @@ -227,19 +222,8 @@ pub fn split_up_roads( } timer.stop("match traffic signals to intersections"); - // For the transit snapping that later uses this, we have to make pt_to_road only refer to - // points currently on the roads, not any deduped internal points. - pt_to_road.clear(); - for (id, r) in &map.roads { - for (idx, pt) in r.center_points.iter().enumerate() { - if idx != 0 && idx != r.center_points.len() - 1 { - pt_to_road.insert(pt.to_hashable(), *id); - } - } - } - timer.stop("splitting up roads"); - (input.amenities, input.crosswalks, pt_to_road) + (input.amenities, input.crosswalks) } // TODO Consider doing this in PolyLine::new always. extend() there does this too. diff --git a/convert_osm/src/transit.rs b/convert_osm/src/transit.rs deleted file mode 100644 index 8293a9ca2a..0000000000 --- a/convert_osm/src/transit.rs +++ /dev/null @@ -1,317 +0,0 @@ -use std::collections::HashMap; - -use anyhow::Result; - -use geom::{HashablePt2D, Polygon, Pt2D}; -use map_model::osm::{NodeID, OsmID, RelationID, WayID}; -use map_model::raw::{OriginalRoad, RawBusRoute, RawBusStop, RawMap}; -use map_model::{osm, Direction}; - -use crate::reader::{Document, Relation}; - -pub fn extract_route( - rel_id: RelationID, - rel: &Relation, - doc: &Document, - boundary: &Polygon, -) -> Option { - let full_name = rel.tags.get("name")?.clone(); - let short_name = rel - .tags - .get("ref") - .cloned() - .unwrap_or_else(|| full_name.clone()); - let is_bus = match rel.tags.get("route")?.as_ref() { - "bus" => true, - "light_rail" => false, - x => { - if !vec!["bicycle", "foot", "railway", "road", "tracks", "train"].contains(&x) { - // TODO Handle these at some point - println!( - "Skipping route {} of unknown type {}: {}", - full_name, x, rel_id - ); - } - return None; - } - }; - - // Gather stops in order. Platforms may exist or not; match them up by name. - let mut stops = Vec::new(); - let mut platforms = HashMap::new(); - let mut all_ways = Vec::new(); - for (role, member) in &rel.members { - if role == "stop" { - if let OsmID::Node(n) = member { - let node = &doc.nodes[n]; - stops.push(RawBusStop { - name: node - .tags - .get("name") - .cloned() - .unwrap_or_else(|| format!("stop #{}", stops.len() + 1)), - vehicle_pos: (*n, node.pt), - matched_road: None, - ped_pos: None, - }); - } - } else if role == "platform" { - let (platform_name, pt) = match member { - OsmID::Node(n) => { - let node = &doc.nodes[n]; - ( - node.tags - .get("name") - .cloned() - .unwrap_or_else(|| format!("stop #{}", platforms.len() + 1)), - node.pt, - ) - } - OsmID::Way(w) => { - let way = &doc.ways[w]; - ( - way.tags - .get("name") - .cloned() - .unwrap_or_else(|| format!("stop #{}", platforms.len() + 1)), - Pt2D::center(&way.pts), - ) - } - _ => continue, - }; - platforms.insert(platform_name, pt); - } else if let OsmID::Way(w) = member { - all_ways.push(*w); - } - } - for stop in &mut stops { - if let Some(pt) = platforms.remove(&stop.name) { - stop.ped_pos = Some(pt); - } - } - - let all_pts: Vec<(NodeID, Pt2D)> = match glue_route(all_ways, doc) { - Ok(nodes) => nodes - .into_iter() - .map(|osm_node_id| (osm_node_id, doc.nodes[&osm_node_id].pt)) - .collect(), - Err(err) => { - error!("Skipping route {} ({}): {}", rel_id, full_name, err); - return None; - } - }; - - // Remove stops that're out of bounds. Once we find the first in-bound point, keep all in-bound - // stops and halt as soon as we go out of bounds again. If a route happens to dip in and out of - // the boundary, we don't want to leave gaps. - let mut keep_stops = Vec::new(); - let orig_num = stops.len(); - for stop in stops { - if boundary.contains_pt(stop.vehicle_pos.1) { - keep_stops.push(stop); - } else if !keep_stops.is_empty() { - // That's the end of them - break; - } - } - println!( - "Kept {} / {} contiguous stops from route {}", - keep_stops.len(), - orig_num, - rel_id - ); - - if keep_stops.len() < 2 { - // Routes with only 1 stop are pretty much useless, and it makes border matching quite - // confusing. - return None; - } - - Some(RawBusRoute { - full_name, - short_name, - is_bus, - osm_rel_id: rel_id, - gtfs_trip_marker: rel.tags.get("gtfs:trip_marker").cloned(), - stops: keep_stops, - border_start: None, - border_end: None, - all_pts, - }) -} - -// Figure out the actual order of nodes in the route. We assume the ways are at least listed in -// order. Match them up by endpoints. There are gaps sometimes, though! -fn glue_route(all_ways: Vec, doc: &Document) -> Result> { - if all_ways.len() == 1 { - bail!("route only has one way: {}", all_ways[0]); - } - let mut nodes = Vec::new(); - let mut extra = Vec::new(); - for pair in all_ways.windows(2) { - let way1 = &doc.ways[&pair[0]]; - let way2 = &doc.ways[&pair[1]]; - let (nodes1, nodes2) = if way1.nodes[0] == way2.nodes[0] { - ( - way1.nodes.iter().rev().cloned().collect(), - way2.nodes.clone(), - ) - } else if way1.nodes[0] == *way2.nodes.last().unwrap() { - ( - way1.nodes.iter().rev().cloned().collect(), - way2.nodes.iter().rev().cloned().collect(), - ) - } else if *way1.nodes.last().unwrap() == way2.nodes[0] { - (way1.nodes.clone(), way2.nodes.clone()) - } else if *way1.nodes.last().unwrap() == *way2.nodes.last().unwrap() { - ( - way1.nodes.clone(), - way2.nodes.iter().rev().cloned().collect(), - ) - } else { - bail!("gap between {} and {}", pair[0], pair[1]); - }; - if let Some(n) = nodes.pop() { - if n != nodes1[0] { - bail!( - "{} and {} match up, but last piece was {}", - pair[0], - pair[1], - n - ); - } - } - nodes.extend(nodes1); - extra = nodes2; - } - // And the last lil bit - if nodes.is_empty() { - bail!("empty? ways: {:?}", all_ways); - } - assert_eq!(nodes.pop().unwrap(), extra[0]); - nodes.extend(extra); - Ok(nodes) -} - -pub fn snap_bus_stops( - mut route: RawBusRoute, - raw: &mut RawMap, - pt_to_road: &HashMap, -) -> Result { - // TODO RawBusStop should have an osm_node_id() - - // For every stop, figure out what road segment and direction it matches up to. - for stop in &mut route.stops { - let idx_in_route = route - .all_pts - .iter() - .position(|(node, _)| stop.vehicle_pos.0 == *node) - .ok_or_else(|| anyhow!("{} missing from route?!", stop.vehicle_pos.0))?; - - let road = if raw.intersections.contains_key(&stop.vehicle_pos.0) { - // Prefer to match just before an intersection, instead of just after - let mut found = None; - for idx in (0..idx_in_route).rev() { - let (i, pt) = route.all_pts[idx]; - if !raw.intersections.contains_key(&i) { - if let Some(r) = pt_to_road.get(&pt.to_hashable()) { - found = Some(*r); - break; - } else { - bail!("Some point on the route isn't even on a road?!"); - } - } - } - if let Some(r) = found { - r - } else { - bail!( - "stop {} right at an intersection near the beginning of the route", - stop.vehicle_pos.0 - ); - } - } else { - *pt_to_road - .get(&stop.vehicle_pos.1.to_hashable()) - .ok_or_else(|| anyhow!("{} isn't on a road", stop.vehicle_pos.0))? - }; - - // Scan backwards and forwards in the route for the nearest intersections. - // TODO Express better with iterators - let mut i1 = None; - for idx in (0..idx_in_route).rev() { - let i = route.all_pts[idx].0; - if raw.intersections.contains_key(&i) { - i1 = Some(i); - break; - } - } - let mut i2 = None; - // If we're at an intersection, i2 should be the intersection, because earlier we preferred - // a road starting before it. - for idx in idx_in_route..route.all_pts.len() { - let i = route.all_pts[idx].0; - if raw.intersections.contains_key(&i) { - i2 = Some(i); - break; - } - } - - let i1 = i1.unwrap(); - let i2 = i2.unwrap(); - let dir = if road.i1 == i1 && road.i2 == i2 { - Direction::Fwd - } else if road.i1 == i2 && road.i2 == i1 { - Direction::Back - } else { - bail!( - "Can't figure out where {} is along route. At {}, between {:?} and {:?}. {} of {}", - stop.vehicle_pos.0, - road, - i1, - i2, - idx_in_route, - route.all_pts.len() - ); - }; - - stop.matched_road = Some((road, dir)); - if false { - println!("{} matched to {}, {}", stop.vehicle_pos.0, road, dir); - } - - // If this road is missing a sidewalk (likely because it's a motorway), add one. - // https://www.openstreetmap.org/way/325148569 is a motivating example. When we understand - // bus platforms properly, won't need this hack. - let tags = &mut raw - .roads - .get_mut(&road) - .ok_or_else(|| anyhow!("{} isn't an extracted road", road))? - .osm_tags; - #[allow(clippy::if_same_then_else)] - if tags.is(osm::INFERRED_SIDEWALKS, "true") { - let current = tags.get(osm::SIDEWALK).unwrap(); - if current == "none" { - tags.insert( - osm::SIDEWALK, - if dir == Direction::Fwd { - "right" - } else { - "left" - }, - ); - } else if current == "right" && dir == Direction::Back { - tags.insert(osm::SIDEWALK, "both"); - } else if current == "left" && dir == Direction::Fwd { - tags.insert(osm::SIDEWALK, "both"); - } else { - continue; - } - info!( - "Inferring a sidewalk on {} for bus stop {}", - road, stop.vehicle_pos.0 - ); - } - } - Ok(route) -} diff --git a/data/MANIFEST.json b/data/MANIFEST.json index e68bc139b0..a68dd06e44 100644 --- a/data/MANIFEST.json +++ b/data/MANIFEST.json @@ -26,24 +26,24 @@ "compressed_size_bytes": 5191004 }, "data/input/at/salzburg/raw_maps/east.bin": { - "checksum": "4923a6ae20287f03b70ef11cfae99e34", - "uncompressed_size_bytes": 1538584, - "compressed_size_bytes": 355796 + "checksum": "6f3840e1304f32035c9e1606296383df", + "uncompressed_size_bytes": 1486584, + "compressed_size_bytes": 350252 }, "data/input/at/salzburg/raw_maps/north.bin": { - "checksum": "c0c695e17f623f55c4b2fa781be383e5", - "uncompressed_size_bytes": 3604002, - "compressed_size_bytes": 796016 + "checksum": "f11acefcc162af95a82815ebc879b10a", + "uncompressed_size_bytes": 3603994, + "compressed_size_bytes": 796025 }, "data/input/at/salzburg/raw_maps/south.bin": { - "checksum": "9689647e22aff56bf6e6ac313170df00", - "uncompressed_size_bytes": 3634501, - "compressed_size_bytes": 849615 + "checksum": "1709787dfc7149c6daeeae5826c5de42", + "uncompressed_size_bytes": 3622396, + "compressed_size_bytes": 846984 }, "data/input/at/salzburg/raw_maps/west.bin": { - "checksum": "b32c9397b2e55a7ed8451a6432419fef", - "uncompressed_size_bytes": 8792873, - "compressed_size_bytes": 2005527 + "checksum": "217d02833c194337c9baffcede7bff75", + "uncompressed_size_bytes": 8787437, + "compressed_size_bytes": 2002619 }, "data/input/br/sao_paulo/osm/aricanduva.osm": { "checksum": "3708fb4be649c4f16d1de7f7c99369b6", @@ -61,14 +61,14 @@ "compressed_size_bytes": 649718446 }, "data/input/br/sao_paulo/raw_maps/aricanduva.bin": { - "checksum": "1da879d247fc5b223de200ebd4f876fe", - "uncompressed_size_bytes": 34459708, - "compressed_size_bytes": 8650175 + "checksum": "7c247df778842a91024b300268286760", + "uncompressed_size_bytes": 34459700, + "compressed_size_bytes": 8650180 }, "data/input/br/sao_paulo/raw_maps/center.bin": { - "checksum": "3b50b3a7760d45d711cece4db376faa5", - "uncompressed_size_bytes": 9459934, - "compressed_size_bytes": 2513886 + "checksum": "1faa49c6a311d09b0f64f495de3b4654", + "uncompressed_size_bytes": 9459926, + "compressed_size_bytes": 2513874 }, "data/input/ca/ca/osm/plateau.osm": { "checksum": "d41d8cd98f00b204e9800998ecf8427e", @@ -86,9 +86,9 @@ "compressed_size_bytes": 476801596 }, "data/input/ca/montreal/raw_maps/plateau.bin": { - "checksum": "28cf71840e13d51dbe843e2a07242c0c", - "uncompressed_size_bytes": 4129533, - "compressed_size_bytes": 959384 + "checksum": "d37cb731d2b02472661e3dbea0df87fa", + "uncompressed_size_bytes": 4129525, + "compressed_size_bytes": 959382 }, "data/input/ch/geneva/osm/center.osm": { "checksum": "df4faee0b720d9eb9c010180713f0103", @@ -101,9 +101,9 @@ "compressed_size_bytes": 375492248 }, "data/input/ch/geneva/raw_maps/center.bin": { - "checksum": "2382cf1ce6dc67ffeb4d74148c6fa33b", - "uncompressed_size_bytes": 12437368, - "compressed_size_bytes": 2805989 + "checksum": "bc6ac90711484232395a184dc85adcb3", + "uncompressed_size_bytes": 12413910, + "compressed_size_bytes": 2796142 }, "data/input/ch/zurich/osm/center.osm": { "checksum": "c2851c4c0904eb0514299840f567c27d", @@ -136,29 +136,29 @@ "compressed_size_bytes": 4556499 }, "data/input/ch/zurich/raw_maps/center.bin": { - "checksum": "81bccfa2733d4aff7598c886cf96fad0", - "uncompressed_size_bytes": 12050359, - "compressed_size_bytes": 2305371 + "checksum": "ba25a0726a1fc40dc6c8c7b223a1af63", + "uncompressed_size_bytes": 12045909, + "compressed_size_bytes": 2303379 }, "data/input/ch/zurich/raw_maps/east.bin": { - "checksum": "0f9cebf1a2485d04aa59385c521690b2", - "uncompressed_size_bytes": 11684072, - "compressed_size_bytes": 2210566 + "checksum": "5592a25432c396a87e1870c8ba04f9ff", + "uncompressed_size_bytes": 11679225, + "compressed_size_bytes": 2207179 }, "data/input/ch/zurich/raw_maps/north.bin": { - "checksum": "efa5f3cbb589240798fbb2aa07beba60", - "uncompressed_size_bytes": 7749498, - "compressed_size_bytes": 1531174 + "checksum": "d1c7773b74c72b690563969fc3316c3b", + "uncompressed_size_bytes": 7740467, + "compressed_size_bytes": 1524949 }, "data/input/ch/zurich/raw_maps/south.bin": { - "checksum": "aa0b20dd5d1edfc44a3405056939b9fa", - "uncompressed_size_bytes": 8983771, - "compressed_size_bytes": 1844599 + "checksum": "fb8fc0e70f8c1037a6e74c1e3d254437", + "uncompressed_size_bytes": 8981675, + "compressed_size_bytes": 1843114 }, "data/input/ch/zurich/raw_maps/west.bin": { - "checksum": "bea687739081a2b0d845efba510f0b57", - "uncompressed_size_bytes": 9538526, - "compressed_size_bytes": 1931775 + "checksum": "a6754bcf8c36af7a487b8cbc042da445", + "uncompressed_size_bytes": 9533557, + "compressed_size_bytes": 1928329 }, "data/input/cz/frydek_mistek/osm/czech-republic-latest.osm.pbf": { "checksum": "3253ca53e2d50acddfaebe195eb3b870", @@ -171,9 +171,9 @@ "compressed_size_bytes": 3330633 }, "data/input/cz/frydek_mistek/raw_maps/huge.bin": { - "checksum": "f24de826c669b264d5cca7b6bd83521f", - "uncompressed_size_bytes": 7200557, - "compressed_size_bytes": 1804293 + "checksum": "3e6aad51d69dfe4a6789888690785934", + "uncompressed_size_bytes": 7200549, + "compressed_size_bytes": 1804291 }, "data/input/de/berlin/EWR201812E_Matrix.csv": { "checksum": "7966d3e37c45e7ffa4ee26bb6c8cec28", @@ -206,14 +206,14 @@ "compressed_size_bytes": 896845 }, "data/input/de/berlin/raw_maps/center.bin": { - "checksum": "6539ad26a563fe909c9c7d6c7a047c9a", - "uncompressed_size_bytes": 11709709, - "compressed_size_bytes": 2799045 + "checksum": "3bc3960735c083127828c935a4d6c39a", + "uncompressed_size_bytes": 11708808, + "compressed_size_bytes": 2798442 }, "data/input/de/berlin/raw_maps/neukolln.bin": { - "checksum": "448d5eaa69b2ceb857aa29361469ae0e", - "uncompressed_size_bytes": 31909835, - "compressed_size_bytes": 7617859 + "checksum": "3ea7451f6d41edf4a697875ecce3a814", + "uncompressed_size_bytes": 31900253, + "compressed_size_bytes": 7613926 }, "data/input/de/bonn/osm/center.osm": { "checksum": "b38426dde3822d9030f0a7cb8822133c", @@ -236,19 +236,19 @@ "compressed_size_bytes": 329690 }, "data/input/de/bonn/raw_maps/center.bin": { - "checksum": "10ad5ee2cd5b9c871019f4d6af90ffc4", - "uncompressed_size_bytes": 9089066, - "compressed_size_bytes": 2018764 + "checksum": "2511a061cec73d6211601fb86392ceba", + "uncompressed_size_bytes": 9067046, + "compressed_size_bytes": 2013253 }, "data/input/de/bonn/raw_maps/nordstadt.bin": { - "checksum": "f170220bfdbf916890ca709d75ab5fa1", - "uncompressed_size_bytes": 4622694, - "compressed_size_bytes": 867724 + "checksum": "720589f25ef0b74ee9c4c618e0721543", + "uncompressed_size_bytes": 4622686, + "compressed_size_bytes": 867722 }, "data/input/de/bonn/raw_maps/venusberg.bin": { - "checksum": "4630309581a7fd2db6b972cdd3a89a7a", - "uncompressed_size_bytes": 609267, - "compressed_size_bytes": 140281 + "checksum": "2fe5fd9d5eafd46f4b0579c992cb6f50", + "uncompressed_size_bytes": 606312, + "compressed_size_bytes": 138381 }, "data/input/de/rostock/osm/center.osm": { "checksum": "abba2d14c1883e1622a882cc508bbb5d", @@ -261,9 +261,9 @@ "compressed_size_bytes": 99907924 }, "data/input/de/rostock/raw_maps/center.bin": { - "checksum": "ae0f2fe73b60b0f0b214cdf6cc4ad089", - "uncompressed_size_bytes": 10231631, - "compressed_size_bytes": 1808934 + "checksum": "f4798dd69ecdefcdb3f15e4b6b4b7b7d", + "uncompressed_size_bytes": 10231623, + "compressed_size_bytes": 1808927 }, "data/input/fr/charleville_mezieres/osm/champagne-ardenne-latest.osm.pbf": { "checksum": "f1c9149c597c01b6bfb6de42bd1523d0", @@ -296,28 +296,28 @@ "compressed_size_bytes": 889604 }, "data/input/fr/charleville_mezieres/raw_maps/secteur1.bin": { - "checksum": "b6ed636e6e3a36f90bf33310ff52398c", - "uncompressed_size_bytes": 772954, - "compressed_size_bytes": 167825 + "checksum": "41dd05ab463ad357a00d44f2241b2d29", + "uncompressed_size_bytes": 772946, + "compressed_size_bytes": 167823 }, "data/input/fr/charleville_mezieres/raw_maps/secteur2.bin": { - "checksum": "229fff82b2800d60aa982cead98ab44e", - "uncompressed_size_bytes": 2223468, + "checksum": "d3d7583a257d25c6693ac74cc74c1f63", + "uncompressed_size_bytes": 2223460, "compressed_size_bytes": 459081 }, "data/input/fr/charleville_mezieres/raw_maps/secteur3.bin": { - "checksum": "53c47f578dec7aff2a8fa3ec0a0a625a", - "uncompressed_size_bytes": 1663643, - "compressed_size_bytes": 339409 + "checksum": "2d3f7386d3471827e78841f0fedf9444", + "uncompressed_size_bytes": 1663635, + "compressed_size_bytes": 339407 }, "data/input/fr/charleville_mezieres/raw_maps/secteur4.bin": { - "checksum": "4c56b596c2435a11025e67817b064757", - "uncompressed_size_bytes": 3055595, - "compressed_size_bytes": 662304 + "checksum": "e5364f8601b700c16cbc75d0f279e11c", + "uncompressed_size_bytes": 3055587, + "compressed_size_bytes": 662305 }, "data/input/fr/charleville_mezieres/raw_maps/secteur5.bin": { - "checksum": "bf599b0c0887e2fe2a0a49b7e7cda233", - "uncompressed_size_bytes": 2428168, + "checksum": "ed9dfc237a46a8f1d34f971901e85b57", + "uncompressed_size_bytes": 2428160, "compressed_size_bytes": 496315 }, "data/input/fr/lyon/osm/center.osm": { @@ -331,9 +331,9 @@ "compressed_size_bytes": 396388513 }, "data/input/fr/lyon/raw_maps/center.bin": { - "checksum": "db2399307cbe4b52bf42d8602a2bab93", - "uncompressed_size_bytes": 44883304, - "compressed_size_bytes": 9885401 + "checksum": "d7717912ba5e69669931c505a724d90c", + "uncompressed_size_bytes": 44861391, + "compressed_size_bytes": 9878402 }, "data/input/fr/paris/osm/center.osm": { "checksum": "224841aa32fafd0212b0b2e3cc200e9a", @@ -366,29 +366,29 @@ "compressed_size_bytes": 10557623 }, "data/input/fr/paris/raw_maps/center.bin": { - "checksum": "ded32a7fdda4b9435ce0242084ac2b12", - "uncompressed_size_bytes": 21929811, - "compressed_size_bytes": 5641932 + "checksum": "9ce8c96f30def389b34bdc6d7db98a2d", + "uncompressed_size_bytes": 21914252, + "compressed_size_bytes": 5633740 }, "data/input/fr/paris/raw_maps/east.bin": { - "checksum": "c711b54cc11ca36a3a1a423ed85a8145", - "uncompressed_size_bytes": 18411512, - "compressed_size_bytes": 4515528 + "checksum": "e50dd47051e533704fabc15e084fa75e", + "uncompressed_size_bytes": 18400695, + "compressed_size_bytes": 4509626 }, "data/input/fr/paris/raw_maps/north.bin": { - "checksum": "125a515803dcdb20a919bb36c8b5b91a", - "uncompressed_size_bytes": 22238335, - "compressed_size_bytes": 5643684 + "checksum": "936c5ac37fc89f048a4d479bf8957944", + "uncompressed_size_bytes": 22223889, + "compressed_size_bytes": 5635446 }, "data/input/fr/paris/raw_maps/south.bin": { - "checksum": "45d2f6252c99d813d915c7fef684b821", - "uncompressed_size_bytes": 16987565, - "compressed_size_bytes": 4195029 + "checksum": "0a0fee331c5e19016e15682bf8f2870c", + "uncompressed_size_bytes": 16985160, + "compressed_size_bytes": 4193236 }, "data/input/fr/paris/raw_maps/west.bin": { - "checksum": "4db562a04546266593b0ce8c7f02a3b1", - "uncompressed_size_bytes": 21485595, - "compressed_size_bytes": 5626318 + "checksum": "0ec3c3f946d7e97c9ad72fc7db5b470c", + "uncompressed_size_bytes": 21469498, + "compressed_size_bytes": 5615699 }, "data/input/gb/allerton_bywater/osm/center.osm": { "checksum": "4e43541e0094d2a8d54d0abad4921829", @@ -406,9 +406,9 @@ "compressed_size_bytes": 316976 }, "data/input/gb/allerton_bywater/raw_maps/center.bin": { - "checksum": "07c2da24ac074cc68c2241d1c3f76f58", - "uncompressed_size_bytes": 23098817, - "compressed_size_bytes": 4839663 + "checksum": "5d5063a2a29b2177c6d8199172fe1915", + "uncompressed_size_bytes": 23098809, + "compressed_size_bytes": 4839666 }, "data/input/gb/ashton_park/osm/center.osm": { "checksum": "f0bc18ddf4f20a33b2289c2459e9f316", @@ -426,8 +426,8 @@ "compressed_size_bytes": 614596 }, "data/input/gb/ashton_park/raw_maps/center.bin": { - "checksum": "83aca3cecf9c5e53deabec335ff95721", - "uncompressed_size_bytes": 3014273, + "checksum": "159a6249629892e4874273b113c1e454", + "uncompressed_size_bytes": 3014265, "compressed_size_bytes": 704182 }, "data/input/gb/aylesbury/osm/buckinghamshire-latest.osm.pbf": { @@ -446,9 +446,9 @@ "compressed_size_bytes": 897738 }, "data/input/gb/aylesbury/raw_maps/center.bin": { - "checksum": "b17a948e146fcf1ade29eaaccd63a2ce", - "uncompressed_size_bytes": 4860695, - "compressed_size_bytes": 1068355 + "checksum": "a6420b0f80307d1da69711dff2ae2f33", + "uncompressed_size_bytes": 4860687, + "compressed_size_bytes": 1068356 }, "data/input/gb/aylesham/osm/center.osm": { "checksum": "39f60a4a35991d3fd8b92681c935f3c6", @@ -466,9 +466,9 @@ "compressed_size_bytes": 404371 }, "data/input/gb/aylesham/raw_maps/center.bin": { - "checksum": "59b6813acbe1b342acd15d712df6d1ef", - "uncompressed_size_bytes": 7774305, - "compressed_size_bytes": 1493065 + "checksum": "ad47aad9d392deba0e52bc783a37d2b8", + "uncompressed_size_bytes": 7774297, + "compressed_size_bytes": 1493068 }, "data/input/gb/bailrigg/osm/center.osm": { "checksum": "76eeaae1600b70f6d833ffa9242a4d10", @@ -486,9 +486,9 @@ "compressed_size_bytes": 93174 }, "data/input/gb/bailrigg/raw_maps/center.bin": { - "checksum": "ee35f5d52f0e57f6fdb6455842172307", - "uncompressed_size_bytes": 9049944, - "compressed_size_bytes": 1631314 + "checksum": "f49288fd8134a9d118fcad91f4951867", + "uncompressed_size_bytes": 8976536, + "compressed_size_bytes": 1618985 }, "data/input/gb/bath_riverside/osm/center.osm": { "checksum": "27a14f402d0e728efd5c2efde36bd53c", @@ -506,9 +506,9 @@ "compressed_size_bytes": 113277 }, "data/input/gb/bath_riverside/raw_maps/center.bin": { - "checksum": "6458e8a776ad996a73b5097f6e45b8e3", - "uncompressed_size_bytes": 8664309, - "compressed_size_bytes": 1855336 + "checksum": "5f76b00fbde68b56a12d00554269e4f8", + "uncompressed_size_bytes": 8664301, + "compressed_size_bytes": 1855337 }, "data/input/gb/bicester/osm/center.osm": { "checksum": "a10db73a33c1b74248fefd5fc006cfca", @@ -526,9 +526,9 @@ "compressed_size_bytes": 986704 }, "data/input/gb/bicester/raw_maps/center.bin": { - "checksum": "2391db8190c1c8903ab25ee97cca23ed", - "uncompressed_size_bytes": 12256096, - "compressed_size_bytes": 2898053 + "checksum": "691087b7ed95a870bd35cdf782e2852e", + "uncompressed_size_bytes": 12256088, + "compressed_size_bytes": 2898054 }, "data/input/gb/cambridge/osm/cambridgeshire-latest.osm.pbf": { "checksum": "fc78b2ebc96bfcd24d5117926c7b9e87", @@ -541,9 +541,9 @@ "compressed_size_bytes": 2741727 }, "data/input/gb/cambridge/raw_maps/north.bin": { - "checksum": "cc6ba2c5202035cfe844a368bae4f8d7", - "uncompressed_size_bytes": 8340107, - "compressed_size_bytes": 1484008 + "checksum": "1d3ff68068151fb66835d6abee5e0f2b", + "uncompressed_size_bytes": 8340099, + "compressed_size_bytes": 1484003 }, "data/input/gb/castlemead/osm/center.osm": { "checksum": "c31876a64151061d07bc97c940ed5d55", @@ -561,9 +561,9 @@ "compressed_size_bytes": 615333 }, "data/input/gb/castlemead/raw_maps/center.bin": { - "checksum": "4ee96c11f65eddd78ad69f75f4f8c773", - "uncompressed_size_bytes": 3019466, - "compressed_size_bytes": 705260 + "checksum": "97cd5674ef9cf5d34f45b8b45fadc50d", + "uncompressed_size_bytes": 3019458, + "compressed_size_bytes": 705257 }, "data/input/gb/chapelford/osm/center.osm": { "checksum": "b6e58784729a98bacd69067b3e14add1", @@ -581,9 +581,9 @@ "compressed_size_bytes": 1274247 }, "data/input/gb/chapelford/raw_maps/center.bin": { - "checksum": "347acd48b3ef6724327adbf08294166a", - "uncompressed_size_bytes": 12010168, - "compressed_size_bytes": 2369391 + "checksum": "76c0a5a9e436ba9f7e4d0278953d7e07", + "uncompressed_size_bytes": 12010160, + "compressed_size_bytes": 2369390 }, "data/input/gb/chapeltown_cohousing/osm/center.osm": { "checksum": "c73820911ef687b0c6d2cae9fe140bf5", @@ -601,9 +601,9 @@ "compressed_size_bytes": 91645 }, "data/input/gb/chapeltown_cohousing/raw_maps/center.bin": { - "checksum": "efe1f6e7accf235ccdb2fe52876ae9ae", - "uncompressed_size_bytes": 20110882, - "compressed_size_bytes": 3919407 + "checksum": "ed8d7f842867c5da05b5db1f2c4a52f1", + "uncompressed_size_bytes": 20110874, + "compressed_size_bytes": 3919403 }, "data/input/gb/chorlton/osm/center.osm": { "checksum": "6e945ba11798cb1e5c5218612da2f3a9", @@ -616,9 +616,9 @@ "compressed_size_bytes": 26082634 }, "data/input/gb/chorlton/raw_maps/center.bin": { - "checksum": "ca7ed4654d26026c74cb2d877d6e3ab5", - "uncompressed_size_bytes": 5795203, - "compressed_size_bytes": 1144351 + "checksum": "69f45855f5e595214e086304bcb3aa10", + "uncompressed_size_bytes": 5795195, + "compressed_size_bytes": 1144352 }, "data/input/gb/clackers_brook/osm/center.osm": { "checksum": "0f56e17e5d83f4eb0d57ab73b5f2ff3c", @@ -636,9 +636,9 @@ "compressed_size_bytes": 1024144 }, "data/input/gb/clackers_brook/raw_maps/center.bin": { - "checksum": "6797ac660c2f9208b49ae29e34ba5df2", - "uncompressed_size_bytes": 6027499, - "compressed_size_bytes": 1433118 + "checksum": "279186f233c08f4ea99b9fa0a4532547", + "uncompressed_size_bytes": 6027491, + "compressed_size_bytes": 1433116 }, "data/input/gb/cricklewood/osm/center.osm": { "checksum": "0e673db5e8c17b9979c08b4d85f58422", @@ -656,9 +656,9 @@ "compressed_size_bytes": 638798 }, "data/input/gb/cricklewood/raw_maps/center.bin": { - "checksum": "68baad041db26a998815aa55e7b1ddee", - "uncompressed_size_bytes": 5468969, - "compressed_size_bytes": 1260400 + "checksum": "2754d0ebcfc0b39aeb3e17199693ded1", + "uncompressed_size_bytes": 5464428, + "compressed_size_bytes": 1257247 }, "data/input/gb/culm/osm/center.osm": { "checksum": "744d5f43fb357316a039bd49adc93f96", @@ -676,9 +676,9 @@ "compressed_size_bytes": 201545 }, "data/input/gb/culm/raw_maps/center.bin": { - "checksum": "d203aee5624157e283041b89795e8bbb", - "uncompressed_size_bytes": 22851400, - "compressed_size_bytes": 5260731 + "checksum": "5e3d95f12925d375b3cc902f6f4c7008", + "uncompressed_size_bytes": 22818913, + "compressed_size_bytes": 5244968 }, "data/input/gb/dickens_heath/osm/center.osm": { "checksum": "ee0f02fd05bae34e7fe8c56494cc002e", @@ -691,9 +691,9 @@ "compressed_size_bytes": 45514449 }, "data/input/gb/dickens_heath/raw_maps/center.bin": { - "checksum": "9cbbf4f4612b962edcb0e5542a7be802", - "uncompressed_size_bytes": 20007503, - "compressed_size_bytes": 3573171 + "checksum": "877aaeb54416fe93b1eec3f52be0be72", + "uncompressed_size_bytes": 20007495, + "compressed_size_bytes": 3573174 }, "data/input/gb/didcot/osm/center.osm": { "checksum": "bcc8a2a2e4af2b24c300463ac5ffaf9b", @@ -711,9 +711,9 @@ "compressed_size_bytes": 364951 }, "data/input/gb/didcot/raw_maps/center.bin": { - "checksum": "a30faad1bf00a9e261da604202e0c0d6", - "uncompressed_size_bytes": 3286065, - "compressed_size_bytes": 689153 + "checksum": "757c0ec683ee3fdc512a5ac58efa8c26", + "uncompressed_size_bytes": 3286057, + "compressed_size_bytes": 689152 }, "data/input/gb/dunton_hills/osm/center.osm": { "checksum": "dc4a1861d7e8fd7a2128d10e653129b0", @@ -731,9 +731,9 @@ "compressed_size_bytes": 1621830 }, "data/input/gb/dunton_hills/raw_maps/center.bin": { - "checksum": "6714626fd3b7489fa0b8d1f6d853c0ae", - "uncompressed_size_bytes": 11536509, - "compressed_size_bytes": 2905077 + "checksum": "81af543ae2979ac400d463da89313b1c", + "uncompressed_size_bytes": 11536501, + "compressed_size_bytes": 2905074 }, "data/input/gb/ebbsfleet/osm/center.osm": { "checksum": "e30b891681f4725c272b8ae761767cc2", @@ -751,9 +751,9 @@ "compressed_size_bytes": 476446 }, "data/input/gb/ebbsfleet/raw_maps/center.bin": { - "checksum": "80c4a8f4506e1bfda12036c146939877", - "uncompressed_size_bytes": 3268374, - "compressed_size_bytes": 751629 + "checksum": "444475ce60cd0114f23109e0174d6434", + "uncompressed_size_bytes": 3268366, + "compressed_size_bytes": 751628 }, "data/input/gb/exeter_red_cow_village/osm/center.osm": { "checksum": "6f57557ad363773458323b1999abcfa3", @@ -771,9 +771,9 @@ "compressed_size_bytes": 101803 }, "data/input/gb/exeter_red_cow_village/raw_maps/center.bin": { - "checksum": "96bea30da10ad45d79a432a9371fb1f3", - "uncompressed_size_bytes": 14533361, - "compressed_size_bytes": 3127504 + "checksum": "3f57e6f3c9644b11d58579b41e99f3ec", + "uncompressed_size_bytes": 14533353, + "compressed_size_bytes": 3127508 }, "data/input/gb/great_kneighton/desire_lines_disag.geojson": { "checksum": "1cb0f5fc91626099dca6582c97f49c43", @@ -791,9 +791,9 @@ "compressed_size_bytes": 4757537 }, "data/input/gb/great_kneighton/raw_maps/center.bin": { - "checksum": "3a561232ed63e755313dddade707794d", - "uncompressed_size_bytes": 13262104, - "compressed_size_bytes": 2570974 + "checksum": "332626533f190c03c93088e6df92c1c0", + "uncompressed_size_bytes": 13262096, + "compressed_size_bytes": 2570968 }, "data/input/gb/great_kneighton/screenshots/center.zip": { "checksum": "b38897e4436b0838dd460c282b0c1ed3", @@ -816,9 +816,9 @@ "compressed_size_bytes": 1377541 }, "data/input/gb/halsnead/raw_maps/center.bin": { - "checksum": "b1a4c1bd4b0ae26efda7f18215becc82", - "uncompressed_size_bytes": 10409986, - "compressed_size_bytes": 2376082 + "checksum": "91bc473cae6445c8d9ff87d30980502a", + "uncompressed_size_bytes": 10409978, + "compressed_size_bytes": 2376081 }, "data/input/gb/hampton/osm/cambridgeshire-latest.osm.pbf": { "checksum": "c4ec8f81dc604526443750f695886ebf", @@ -836,9 +836,9 @@ "compressed_size_bytes": 1014654 }, "data/input/gb/hampton/raw_maps/center.bin": { - "checksum": "985673dfd11923812bcba4143b752a5b", - "uncompressed_size_bytes": 11287227, - "compressed_size_bytes": 2426419 + "checksum": "d9ab6f6dcf2b42e8b43f59bb7cfa1ea2", + "uncompressed_size_bytes": 11287219, + "compressed_size_bytes": 2426417 }, "data/input/gb/handforth/osm/center.osm": { "checksum": "749c231697ed985991d0addaeee3d269", @@ -856,9 +856,9 @@ "compressed_size_bytes": 484486 }, "data/input/gb/handforth/raw_maps/center.bin": { - "checksum": "d4f41e93b278e4622c1667f4b25fdabb", - "uncompressed_size_bytes": 4388858, - "compressed_size_bytes": 1109918 + "checksum": "d0889d79b182b35ad9ad27e3a5ef7989", + "uncompressed_size_bytes": 4388850, + "compressed_size_bytes": 1109914 }, "data/input/gb/kergilliack/osm/center.osm": { "checksum": "5e3a354b326f41b5bb71eaaee5a1577b", @@ -876,9 +876,9 @@ "compressed_size_bytes": 253152 }, "data/input/gb/kergilliack/raw_maps/center.bin": { - "checksum": "61049b420b9c6d0975a2c173c9fa5e32", - "uncompressed_size_bytes": 7065125, - "compressed_size_bytes": 1779582 + "checksum": "a1ae3ba65b5e87f8593d86748b8842cf", + "uncompressed_size_bytes": 7065117, + "compressed_size_bytes": 1779583 }, "data/input/gb/kidbrooke_village/osm/center.osm": { "checksum": "2e1bd2c501cb115a1b99b3ce4a5019ef", @@ -896,9 +896,9 @@ "compressed_size_bytes": 667310 }, "data/input/gb/kidbrooke_village/raw_maps/center.bin": { - "checksum": "4de22ba4ed6113e3fc6dac2ee80110bd", - "uncompressed_size_bytes": 5370076, - "compressed_size_bytes": 1191374 + "checksum": "d7bc28d32460e56723efbe298a1aa926", + "uncompressed_size_bytes": 5319813, + "compressed_size_bytes": 1179895 }, "data/input/gb/lcid/osm/center.osm": { "checksum": "e6fb8acf53e1e57c6d715d80996ca793", @@ -911,9 +911,9 @@ "compressed_size_bytes": 72980846 }, "data/input/gb/lcid/raw_maps/center.bin": { - "checksum": "9d661f0cec5b334e8b05ef30db85d533", - "uncompressed_size_bytes": 14167299, - "compressed_size_bytes": 2655119 + "checksum": "56062d8546fa7376891391c137aa1620", + "uncompressed_size_bytes": 14167291, + "compressed_size_bytes": 2655116 }, "data/input/gb/leeds/collisions.bin": { "checksum": "0c2b32f8dc1fac74894bf27a9166608a", @@ -951,14 +951,14 @@ "compressed_size_bytes": 4369994 }, "data/input/gb/leeds/raw_maps/central.bin": { - "checksum": "4487f08bfd5173fab11efbc89a4fbf9b", - "uncompressed_size_bytes": 10914187, - "compressed_size_bytes": 2052889 + "checksum": "b7e4b1bdcdcd3d40b4c26528d198c9da", + "uncompressed_size_bytes": 10914179, + "compressed_size_bytes": 2052887 }, "data/input/gb/leeds/raw_maps/huge.bin": { - "checksum": "d1dced79f53eb7d8794940f2f4567842", - "uncompressed_size_bytes": 40576571, - "compressed_size_bytes": 8255396 + "checksum": "c14576b4579ea7d7f0c7586820db163e", + "uncompressed_size_bytes": 40576563, + "compressed_size_bytes": 8255398 }, "data/input/gb/leeds/raw_maps/lcid.bin": { "checksum": "cfaea751caf2c8ab1432d1ff2924244a", @@ -966,14 +966,14 @@ "compressed_size_bytes": 3688476 }, "data/input/gb/leeds/raw_maps/north.bin": { - "checksum": "d44b468f1abb3f2431d9f337318a4ed8", - "uncompressed_size_bytes": 17403133, - "compressed_size_bytes": 3574977 + "checksum": "f333b8717fcacdfaf6eb0ae44234ac8c", + "uncompressed_size_bytes": 17403125, + "compressed_size_bytes": 3574967 }, "data/input/gb/leeds/raw_maps/west.bin": { - "checksum": "c064be652d6e24721805b2617bffbca3", - "uncompressed_size_bytes": 14218748, - "compressed_size_bytes": 2836981 + "checksum": "8fc4d7366d31a15ac16c18a990949f9e", + "uncompressed_size_bytes": 14218740, + "compressed_size_bytes": 2836984 }, "data/input/gb/lockleaze/osm/bristol-latest.osm.pbf": { "checksum": "8189191a2a02403cf5223bb2f296040c", @@ -991,9 +991,9 @@ "compressed_size_bytes": 182142 }, "data/input/gb/lockleaze/raw_maps/center.bin": { - "checksum": "36c440cf9789adb9ee6faaffe4088e9b", - "uncompressed_size_bytes": 34169896, - "compressed_size_bytes": 6774732 + "checksum": "e5a81db3eded72a871b833713971b05e", + "uncompressed_size_bytes": 34169888, + "compressed_size_bytes": 6774731 }, "data/input/gb/london/collisions.bin": { "checksum": "b32fb1d59053325b686db7333971cedf", @@ -1021,19 +1021,19 @@ "compressed_size_bytes": 2120711 }, "data/input/gb/london/raw_maps/a5.bin": { - "checksum": "9338f80b66b4150684514460048c5185", - "uncompressed_size_bytes": 18592408, - "compressed_size_bytes": 3783782 + "checksum": "51f1c6ce597e7cf7a6994bff6aed8a3f", + "uncompressed_size_bytes": 18588554, + "compressed_size_bytes": 3780989 }, "data/input/gb/london/raw_maps/camden.bin": { - "checksum": "19ffaf7ea26e20866356c3fa4c4269c2", - "uncompressed_size_bytes": 28909267, - "compressed_size_bytes": 5937201 + "checksum": "ab8584829657058127b7ab29bdfce5e4", + "uncompressed_size_bytes": 28887349, + "compressed_size_bytes": 5923349 }, "data/input/gb/london/raw_maps/southbank.bin": { - "checksum": "b5487314ab0360128fa69811de98b421", - "uncompressed_size_bytes": 3743887, - "compressed_size_bytes": 753815 + "checksum": "00ec655a6a74c6025be1354c29cb8679", + "uncompressed_size_bytes": 3697395, + "compressed_size_bytes": 744871 }, "data/input/gb/long_marston/osm/center.osm": { "checksum": "c7c25ca197870b843ac79c591c1275f3", @@ -1046,9 +1046,9 @@ "compressed_size_bytes": 18143009 }, "data/input/gb/long_marston/raw_maps/center.bin": { - "checksum": "435c6d7819b427cecb292d506ea30301", - "uncompressed_size_bytes": 6600439, - "compressed_size_bytes": 1531697 + "checksum": "7725ef06bf3e98e765f490819c893d4e", + "uncompressed_size_bytes": 6600431, + "compressed_size_bytes": 1531686 }, "data/input/gb/marsh_barton/osm/center.osm": { "checksum": "c2b66a38416bf42f789887a5d540ece6", @@ -1066,9 +1066,9 @@ "compressed_size_bytes": 86690 }, "data/input/gb/marsh_barton/raw_maps/center.bin": { - "checksum": "650d8cbff1df7106cdd4acaa9bef33f9", - "uncompressed_size_bytes": 13376592, - "compressed_size_bytes": 2867379 + "checksum": "761ccc5bfa40b62fd17618baf1f8cb17", + "uncompressed_size_bytes": 13376584, + "compressed_size_bytes": 2867375 }, "data/input/gb/micklefield/osm/center.osm": { "checksum": "5842bd67b1e222e96bee0818a893d11d", @@ -1086,9 +1086,9 @@ "compressed_size_bytes": 262589 }, "data/input/gb/micklefield/raw_maps/center.bin": { - "checksum": "2a906e8a41340e0bfa50d60d296350d6", - "uncompressed_size_bytes": 20532346, - "compressed_size_bytes": 4198903 + "checksum": "d679db45079928be59c15de2013ebc53", + "uncompressed_size_bytes": 20532338, + "compressed_size_bytes": 4198891 }, "data/input/gb/newborough_road/osm/cambridgeshire-latest.osm.pbf": { "checksum": "9e4a1e61694e99c00e13a07251b93af6", @@ -1106,9 +1106,9 @@ "compressed_size_bytes": 1311307 }, "data/input/gb/newborough_road/raw_maps/center.bin": { - "checksum": "f67e63c4cbcd9058c310ba384c3ae14c", - "uncompressed_size_bytes": 12965633, - "compressed_size_bytes": 2758366 + "checksum": "3f248608111bbe1c0e43dfe491549127", + "uncompressed_size_bytes": 12965624, + "compressed_size_bytes": 2758525 }, "data/input/gb/newcastle_great_park/osm/center.osm": { "checksum": "c7763a1360b2bccf210ae3464eafcf61", @@ -1126,9 +1126,9 @@ "compressed_size_bytes": 141580 }, "data/input/gb/newcastle_great_park/raw_maps/center.bin": { - "checksum": "f2959c55f3775cb08ece30376b83cf1e", - "uncompressed_size_bytes": 13652902, - "compressed_size_bytes": 2706524 + "checksum": "3b3dea350c6e4f232640250f8027ec87", + "uncompressed_size_bytes": 13652894, + "compressed_size_bytes": 2706519 }, "data/input/gb/northwick_park/osm/center.osm": { "checksum": "2c08bf6cbd7b2d656d41eefb019fcbd6", @@ -1146,9 +1146,9 @@ "compressed_size_bytes": 1043392 }, "data/input/gb/northwick_park/raw_maps/center.bin": { - "checksum": "5f0efc1a02ba9be0ef5676d92810203d", - "uncompressed_size_bytes": 4598079, - "compressed_size_bytes": 1072286 + "checksum": "82b10d39bc62afd58b72688bfd883821", + "uncompressed_size_bytes": 4584610, + "compressed_size_bytes": 1066923 }, "data/input/gb/poundbury/osm/center.osm": { "checksum": "6427a7065d2c4c355337e593682c9932", @@ -1166,9 +1166,9 @@ "compressed_size_bytes": 154204 }, "data/input/gb/poundbury/raw_maps/center.bin": { - "checksum": "c79c3e98c0aeacbbaff7d345bb4905a7", - "uncompressed_size_bytes": 2420944, - "compressed_size_bytes": 567286 + "checksum": "146a7d56f9a4e034bb48f425d4c88214", + "uncompressed_size_bytes": 2420936, + "compressed_size_bytes": 567283 }, "data/input/gb/priors_hall/osm/center.osm": { "checksum": "2f5c7a0881a378b4cc5bbb75bc555342", @@ -1186,9 +1186,9 @@ "compressed_size_bytes": 649236 }, "data/input/gb/priors_hall/raw_maps/center.bin": { - "checksum": "26a67887bb41ad4a94a97f587e3394e1", - "uncompressed_size_bytes": 6036479, - "compressed_size_bytes": 1428485 + "checksum": "5668cac81f7542da03b5202d36275004", + "uncompressed_size_bytes": 6036471, + "compressed_size_bytes": 1428489 }, "data/input/gb/st_albans/osm/center.osm": { "checksum": "4683b6aaec407013310ae8c7cc7726ea", @@ -1201,9 +1201,9 @@ "compressed_size_bytes": 19043530 }, "data/input/gb/st_albans/raw_maps/center.bin": { - "checksum": "05d85bb57f6b39c068e4afbdad1a5ddf", - "uncompressed_size_bytes": 5792411, - "compressed_size_bytes": 1512865 + "checksum": "8319d0a736e1a4af7c46422db1a98b9f", + "uncompressed_size_bytes": 5792403, + "compressed_size_bytes": 1512862 }, "data/input/gb/taunton_firepool/osm/center.osm": { "checksum": "6deb55c6a06fe7f33d5cff84e51de0ed", @@ -1216,9 +1216,9 @@ "compressed_size_bytes": 38835936 }, "data/input/gb/taunton_firepool/raw_maps/center.bin": { - "checksum": "36122c68eaf968183d3d6f132dacdcd6", - "uncompressed_size_bytes": 20286712, - "compressed_size_bytes": 3799919 + "checksum": "f243a731acd36ea6e2c0fce259e92ae7", + "uncompressed_size_bytes": 20286704, + "compressed_size_bytes": 3799914 }, "data/input/gb/taunton_garden/osm/center.osm": { "checksum": "8c5cbbe8cc6a5d437be1308d894eacd6", @@ -1231,9 +1231,9 @@ "compressed_size_bytes": 38835936 }, "data/input/gb/taunton_garden/raw_maps/center.bin": { - "checksum": "0b797038ebdbe239a9b67e649fc20f5f", - "uncompressed_size_bytes": 22354107, - "compressed_size_bytes": 4193325 + "checksum": "760c0daee95999d7e281120c0f7c9eb5", + "uncompressed_size_bytes": 22354099, + "compressed_size_bytes": 4193319 }, "data/input/gb/tresham/osm/center.osm": { "checksum": "4e3696da7694daf60d890e222b0985ab", @@ -1251,9 +1251,9 @@ "compressed_size_bytes": 1679795 }, "data/input/gb/tresham/raw_maps/center.bin": { - "checksum": "2d25a35e4b7a917a9982beb2312fd7cb", - "uncompressed_size_bytes": 11487721, - "compressed_size_bytes": 2696940 + "checksum": "63f46e18d22afe6445f9be0f4eaff7b7", + "uncompressed_size_bytes": 11487713, + "compressed_size_bytes": 2696938 }, "data/input/gb/trumpington_meadows/osm/cambridgeshire-latest.osm.pbf": { "checksum": "6885c8677a7e089d06a048b142b96ba7", @@ -1266,9 +1266,9 @@ "compressed_size_bytes": 4509200 }, "data/input/gb/trumpington_meadows/raw_maps/center.bin": { - "checksum": "709d63d3d2a0f15dc417a27ce151888f", - "uncompressed_size_bytes": 12319329, - "compressed_size_bytes": 2416547 + "checksum": "059373762110e3ccdd1d501d30f4a2d5", + "uncompressed_size_bytes": 12319321, + "compressed_size_bytes": 2416555 }, "data/input/gb/tyersal_lane/osm/center.osm": { "checksum": "9552a861d42f27d8a2b5ab603653bb0a", @@ -1286,9 +1286,9 @@ "compressed_size_bytes": 929332 }, "data/input/gb/tyersal_lane/raw_maps/center.bin": { - "checksum": "2afecfc323bf89f42b11bdb1c324a42b", - "uncompressed_size_bytes": 6210658, - "compressed_size_bytes": 1279545 + "checksum": "a0a86d20b74df606ce8ff95f4f075464", + "uncompressed_size_bytes": 6210650, + "compressed_size_bytes": 1279540 }, "data/input/gb/upton/osm/center.osm": { "checksum": "bcc035281bb501bdf1f38e2afc883562", @@ -1306,9 +1306,9 @@ "compressed_size_bytes": 1828327 }, "data/input/gb/upton/raw_maps/center.bin": { - "checksum": "e1815102347cf44995298c6bd112c67c", - "uncompressed_size_bytes": 10267146, - "compressed_size_bytes": 2353095 + "checksum": "779a05244ccade1772cde54be8bb38c9", + "uncompressed_size_bytes": 10267138, + "compressed_size_bytes": 2353093 }, "data/input/gb/water_lane/osm/center.osm": { "checksum": "c2b66a38416bf42f789887a5d540ece6", @@ -1326,9 +1326,9 @@ "compressed_size_bytes": 86690 }, "data/input/gb/water_lane/raw_maps/center.bin": { - "checksum": "17a4b06a9ddea0d7ffd13a72d33658c4", - "uncompressed_size_bytes": 13376590, - "compressed_size_bytes": 2867370 + "checksum": "ee9b44e262e4eab5f6f38d56d11bc841", + "uncompressed_size_bytes": 13376582, + "compressed_size_bytes": 2867371 }, "data/input/gb/wichelstowe/osm/center.osm": { "checksum": "13422e881e822690cbc34d6896823be2", @@ -1346,9 +1346,9 @@ "compressed_size_bytes": 1157714 }, "data/input/gb/wichelstowe/raw_maps/center.bin": { - "checksum": "6689a6048e7d0b9733283473387ec8cd", - "uncompressed_size_bytes": 8057948, - "compressed_size_bytes": 1874516 + "checksum": "c6c28fdd56abdcdaa5e5ce14d8fa4051", + "uncompressed_size_bytes": 8057940, + "compressed_size_bytes": 1874519 }, "data/input/gb/wixams/osm/bedfordshire-latest.osm.pbf": { "checksum": "c3cc31aa660554d2307bb7700ff03768", @@ -1366,9 +1366,9 @@ "compressed_size_bytes": 908968 }, "data/input/gb/wixams/raw_maps/center.bin": { - "checksum": "525d1ec097dfc17cf26e1264b47afd61", - "uncompressed_size_bytes": 6602188, - "compressed_size_bytes": 1500459 + "checksum": "7375d40f4a70986d1a28301f937bf9d8", + "uncompressed_size_bytes": 6602180, + "compressed_size_bytes": 1500456 }, "data/input/gb/wynyard/osm/center.osm": { "checksum": "f11cf28f3a98e53949b52e8ebcb15a24", @@ -1386,9 +1386,9 @@ "compressed_size_bytes": 2830334 }, "data/input/gb/wynyard/raw_maps/center.bin": { - "checksum": "217bf58a58f1cd75c7a5afc96e495a49", - "uncompressed_size_bytes": 14938449, - "compressed_size_bytes": 3243768 + "checksum": "fe7790171cfea5b6fc9196e09eaa011d", + "uncompressed_size_bytes": 14938441, + "compressed_size_bytes": 3243779 }, "data/input/il/tel_aviv/osm/center.osm": { "checksum": "eeb7f3813a33f754eceed13766a3c236", @@ -1401,9 +1401,9 @@ "compressed_size_bytes": 82836170 }, "data/input/il/tel_aviv/raw_maps/center.bin": { - "checksum": "e5080cf4109ed2479ce2d0fd1d93aeef", - "uncompressed_size_bytes": 13093649, - "compressed_size_bytes": 2426108 + "checksum": "79c574b77e7f652b22ad3e36ac38497f", + "uncompressed_size_bytes": 13093641, + "compressed_size_bytes": 2426106 }, "data/input/ir/tehran/osm/boundary0.osm": { "checksum": "dacfe24fa30f4ecd5fe0033744e654a7", @@ -1466,53 +1466,53 @@ "compressed_size_bytes": 242372 }, "data/input/ir/tehran/raw_maps/boundary0.bin": { - "checksum": "e95f78810d8216fad7ba396447a68e28", - "uncompressed_size_bytes": 2540913, - "compressed_size_bytes": 359901 + "checksum": "710d4bed4831a82a62ed33164ce08432", + "uncompressed_size_bytes": 2540905, + "compressed_size_bytes": 359893 }, "data/input/ir/tehran/raw_maps/boundary1.bin": { - "checksum": "884aeabfb424ccb02d9cf09fab5c7188", - "uncompressed_size_bytes": 2516690, - "compressed_size_bytes": 350937 + "checksum": "b5ac997c45483d352057905d50fa8ac2", + "uncompressed_size_bytes": 2516682, + "compressed_size_bytes": 350935 }, "data/input/ir/tehran/raw_maps/boundary2.bin": { - "checksum": "86a28de2a2881e8203c79c3c6cc4c6a1", - "uncompressed_size_bytes": 2200733, - "compressed_size_bytes": 352271 + "checksum": "de4b9830195f0c18ca3b60dda051e0f1", + "uncompressed_size_bytes": 2200725, + "compressed_size_bytes": 352269 }, "data/input/ir/tehran/raw_maps/boundary3.bin": { - "checksum": "5269b4c7de88aa3ea668f512ac38a994", - "uncompressed_size_bytes": 5121744, - "compressed_size_bytes": 673981 + "checksum": "8635475186cd950373f3056743f6c2d4", + "uncompressed_size_bytes": 5121736, + "compressed_size_bytes": 673980 }, "data/input/ir/tehran/raw_maps/boundary4.bin": { - "checksum": "1ddccd67d4b656c6701cbc0d18209fd5", - "uncompressed_size_bytes": 13382162, - "compressed_size_bytes": 1662766 + "checksum": "1b33f6f5b672a9acf0068466c66871ab", + "uncompressed_size_bytes": 13382154, + "compressed_size_bytes": 1662768 }, "data/input/ir/tehran/raw_maps/boundary5.bin": { - "checksum": "79e7cd111c42035a7e5c646f628a49dd", - "uncompressed_size_bytes": 5354095, - "compressed_size_bytes": 661805 + "checksum": "dbc2f9f555cb4777ebff302267206dc9", + "uncompressed_size_bytes": 5354087, + "compressed_size_bytes": 661794 }, "data/input/ir/tehran/raw_maps/boundary6.bin": { - "checksum": "217ad9d1e239a0d355f12fc66d78d515", - "uncompressed_size_bytes": 7064583, - "compressed_size_bytes": 1052282 + "checksum": "abf7af3d84466bde0610ff4ad8495ced", + "uncompressed_size_bytes": 7064575, + "compressed_size_bytes": 1052279 }, "data/input/ir/tehran/raw_maps/boundary7.bin": { - "checksum": "222c3331378638e6c350e9e0777fc250", - "uncompressed_size_bytes": 12394503, - "compressed_size_bytes": 1575390 + "checksum": "b581e519ffae72929caf32d9e9eb9fed", + "uncompressed_size_bytes": 12394495, + "compressed_size_bytes": 1575389 }, "data/input/ir/tehran/raw_maps/boundary8.bin": { - "checksum": "15c67dd4e7bfeed35638c5f370ac5325", - "uncompressed_size_bytes": 4691322, - "compressed_size_bytes": 599342 + "checksum": "6f17ac55f2a08a307fc3200abd2925aa", + "uncompressed_size_bytes": 4691314, + "compressed_size_bytes": 599341 }, "data/input/ir/tehran/raw_maps/parliament.bin": { - "checksum": "76e35893de4e4328c572dc1491a16079", - "uncompressed_size_bytes": 1693846, + "checksum": "f7e466687bf6e6cf990aa1ffda68948f", + "uncompressed_size_bytes": 1693838, "compressed_size_bytes": 306208 }, "data/input/jp/hiroshima/osm/chugoku-latest.osm.pbf": { @@ -1526,9 +1526,9 @@ "compressed_size_bytes": 153491 }, "data/input/jp/hiroshima/raw_maps/uni.bin": { - "checksum": "d613a5995900407e16b1f4e35c670095", - "uncompressed_size_bytes": 328438, - "compressed_size_bytes": 79708 + "checksum": "cf2f48d895cd2d8a2608b31a40c36e83", + "uncompressed_size_bytes": 328430, + "compressed_size_bytes": 79706 }, "data/input/ly/tripoli/osm/center.osm": { "checksum": "e9b2289791e891153e957d8100eb40c4", @@ -1541,9 +1541,9 @@ "compressed_size_bytes": 30303259 }, "data/input/ly/tripoli/raw_maps/center.bin": { - "checksum": "041e58a6b3bcc03ee71c2a0b8c1be6ca", - "uncompressed_size_bytes": 3856244, - "compressed_size_bytes": 572513 + "checksum": "4631c60e5480359e8b1cc3d6d29dd381", + "uncompressed_size_bytes": 3856236, + "compressed_size_bytes": 572511 }, "data/input/nz/auckland/osm/mangere.osm": { "checksum": "f0453da2c4cde97a46dbcec405d29a51", @@ -1556,9 +1556,9 @@ "compressed_size_bytes": 277077520 }, "data/input/nz/auckland/raw_maps/mangere.bin": { - "checksum": "3df35243466aa86416399485dfcfe5f7", - "uncompressed_size_bytes": 4230042, - "compressed_size_bytes": 1200445 + "checksum": "95b0c069de6ef6591040a2a4347fc99a", + "uncompressed_size_bytes": 4230034, + "compressed_size_bytes": 1200439 }, "data/input/pl/krakow/osm/center.osm": { "checksum": "562ed1102d3e2fc49d2b9eedf0f0d42a", @@ -1571,14 +1571,14 @@ "compressed_size_bytes": 124874362 }, "data/input/pl/krakow/raw_maps/center.bin": { - "checksum": "95376c4ee36bb6381e5f5ae400898f57", - "uncompressed_size_bytes": 14904832, - "compressed_size_bytes": 3234988 + "checksum": "b27931638f98cc30c413759418d593ed", + "uncompressed_size_bytes": 14902681, + "compressed_size_bytes": 3233425 }, "data/input/pl/krakow/screenshots/center.zip": { - "checksum": "6460ee630b948cb85ef2857cba64380a", - "uncompressed_size_bytes": 36785718, - "compressed_size_bytes": 36782172 + "checksum": "09db130b060cdaef471ce90accdc65de", + "uncompressed_size_bytes": 36785740, + "compressed_size_bytes": 36782121 }, "data/input/pl/warsaw/osm/center.osm": { "checksum": "b41830dd375674ffc9f7ec15d6cf9c0c", @@ -1591,9 +1591,9 @@ "compressed_size_bytes": 163918548 }, "data/input/pl/warsaw/raw_maps/center.bin": { - "checksum": "1bb44c03a0eb516547bebdd85b19a947", - "uncompressed_size_bytes": 33133592, - "compressed_size_bytes": 6349885 + "checksum": "578ab75a60b283f46dc4801adf900aac", + "uncompressed_size_bytes": 33120236, + "compressed_size_bytes": 6342102 }, "data/input/sg/jurong/osm/center.osm": { "checksum": "d91b6aba774bea844f07f90d33cb9307", @@ -1606,9 +1606,9 @@ "compressed_size_bytes": 175643384 }, "data/input/sg/jurong/raw_maps/center.bin": { - "checksum": "5bdbfcdaf0d68f15b8ed1b1788ebf843", - "uncompressed_size_bytes": 9533438, - "compressed_size_bytes": 2161264 + "checksum": "c19a5584b5da154f45813198d1016e47", + "uncompressed_size_bytes": 9533430, + "compressed_size_bytes": 2161261 }, "data/input/shared/Road Safety Data - Accidents 2019.csv": { "checksum": "ce30e6f7743be7b451e298583c65f99a", @@ -1941,9 +1941,9 @@ "compressed_size_bytes": 85493225 }, "data/input/tw/taipei/raw_maps/center.bin": { - "checksum": "b6eb510486169b6b2629a39421d0d9ed", - "uncompressed_size_bytes": 14287776, - "compressed_size_bytes": 2490148 + "checksum": "49e0718f4870052787c740308037f0d2", + "uncompressed_size_bytes": 14287768, + "compressed_size_bytes": 2490147 }, "data/input/us/anchorage/osm/alaska-latest.osm.pbf": { "checksum": "e27bab279362bc0be399abd141474683", @@ -1956,9 +1956,9 @@ "compressed_size_bytes": 5074304 }, "data/input/us/anchorage/raw_maps/downtown.bin": { - "checksum": "8d48ee2446bceec562e64715f07ee13d", - "uncompressed_size_bytes": 16279528, - "compressed_size_bytes": 3362805 + "checksum": "0e21dd49ec461c2480a775f988b64ecc", + "uncompressed_size_bytes": 16279520, + "compressed_size_bytes": 3362810 }, "data/input/us/bellevue/osm/huge.osm": { "checksum": "ef54ab4ff049b29f92331e8c1202372a", @@ -1971,9 +1971,9 @@ "compressed_size_bytes": 202925822 }, "data/input/us/bellevue/raw_maps/huge.bin": { - "checksum": "5027571daa5f28c9d3636b3d239728a5", - "uncompressed_size_bytes": 9859986, - "compressed_size_bytes": 2391239 + "checksum": "5d52b8dcd58034f33e8e27a5db6eea43", + "uncompressed_size_bytes": 9859977, + "compressed_size_bytes": 2391219 }, "data/input/us/beltsville/osm/i495.osm": { "checksum": "2a0af1954110b9830c852965fa638a09", @@ -1986,9 +1986,9 @@ "compressed_size_bytes": 158569116 }, "data/input/us/beltsville/raw_maps/i495.bin": { - "checksum": "f826502570f34fa2be4393f9fff1ff48", - "uncompressed_size_bytes": 2992409, - "compressed_size_bytes": 592590 + "checksum": "1fe4090e50668b992d04327b8a9e3b13", + "uncompressed_size_bytes": 2992401, + "compressed_size_bytes": 592589 }, "data/input/us/detroit/osm/downtown.osm": { "checksum": "5c8dd6ecc94a80879bac965ef624e2e7", @@ -2001,9 +2001,9 @@ "compressed_size_bytes": 178529871 }, "data/input/us/detroit/raw_maps/downtown.bin": { - "checksum": "e2cbb3965fb20c1cf0cd86b9740e8c80", - "uncompressed_size_bytes": 10199819, - "compressed_size_bytes": 2106646 + "checksum": "f5473a01a99208bd6f6d1c6cb446bd66", + "uncompressed_size_bytes": 10196842, + "compressed_size_bytes": 2104528 }, "data/input/us/milwaukee/osm/downtown.osm": { "checksum": "d1ac88c92a8cc7d2ef3c56d0c504bc3a", @@ -2021,9 +2021,9 @@ "compressed_size_bytes": 214578751 }, "data/input/us/milwaukee/raw_maps/downtown.bin": { - "checksum": "e3372a16f1cdb6ad45c3eb3412d2b398", - "uncompressed_size_bytes": 11361518, - "compressed_size_bytes": 3098429 + "checksum": "ba587e5ec34f106ccab3d8c076fad065", + "uncompressed_size_bytes": 11361510, + "compressed_size_bytes": 3098427 }, "data/input/us/milwaukee/raw_maps/downtown_milwaukee.bin": { "checksum": "21793e3fc9d2fea47f16d33db84967de", @@ -2031,8 +2031,8 @@ "compressed_size_bytes": 1610789 }, "data/input/us/milwaukee/raw_maps/oak_creek.bin": { - "checksum": "5243c38f46d92edf21287f378313a850", - "uncompressed_size_bytes": 7746002, + "checksum": "d464c093e7da8678e5735d893c7de235", + "uncompressed_size_bytes": 7745994, "compressed_size_bytes": 2114951 }, "data/input/us/mt_vernon/osm/burlington.osm": { @@ -2051,14 +2051,14 @@ "compressed_size_bytes": 202925822 }, "data/input/us/mt_vernon/raw_maps/burlington.bin": { - "checksum": "472bd22e1170bd016e8c13ebfda355c9", - "uncompressed_size_bytes": 1252027, - "compressed_size_bytes": 227221 + "checksum": "566e875d91cc23a1872c8739dd797052", + "uncompressed_size_bytes": 1252019, + "compressed_size_bytes": 227218 }, "data/input/us/mt_vernon/raw_maps/downtown.bin": { - "checksum": "192609100b04369c43968edb8b9dd530", - "uncompressed_size_bytes": 6938573, - "compressed_size_bytes": 1489197 + "checksum": "3c2879c961ba00e0b0c9bc3f4c40bbdc", + "uncompressed_size_bytes": 6938565, + "compressed_size_bytes": 1489194 }, "data/input/us/nyc/osm/downtown_brooklyn.osm": { "checksum": "db4c8aa8107df3fe12ca4f2bda4bfe10", @@ -2081,19 +2081,19 @@ "compressed_size_bytes": 374254938 }, "data/input/us/nyc/raw_maps/downtown_brooklyn.bin": { - "checksum": "7e62c50ab775a66ff94fd2e34c883535", - "uncompressed_size_bytes": 9923723, - "compressed_size_bytes": 1885561 + "checksum": "588e5b9293570c15ea88c92df50241b0", + "uncompressed_size_bytes": 9923715, + "compressed_size_bytes": 1885560 }, "data/input/us/nyc/raw_maps/lower_manhattan.bin": { - "checksum": "286799ddbff7d85cec6e789111425443", - "uncompressed_size_bytes": 8894243, - "compressed_size_bytes": 1948061 + "checksum": "5b57a87949928f7012683892b9fba79b", + "uncompressed_size_bytes": 8894235, + "compressed_size_bytes": 1948043 }, "data/input/us/nyc/raw_maps/midtown_manhattan.bin": { - "checksum": "95f80e364e94effa3560e19a4b25a87b", - "uncompressed_size_bytes": 9035052, - "compressed_size_bytes": 1861147 + "checksum": "5a463c39cb2bc5a8dcb7d4c0d283f463", + "uncompressed_size_bytes": 9035043, + "compressed_size_bytes": 1861099 }, "data/input/us/phoenix/osm/arizona-latest.osm.pbf": { "checksum": "5d034aba83b588cee963162c86572e8d", @@ -2116,19 +2116,19 @@ "compressed_size_bytes": 818883 }, "data/input/us/phoenix/raw_maps/gilbert.bin": { - "checksum": "f08312af957ac3671657d898329ab3ba", - "uncompressed_size_bytes": 670448, - "compressed_size_bytes": 117065 + "checksum": "cc605964e21ea23bae698f7768586b1a", + "uncompressed_size_bytes": 670440, + "compressed_size_bytes": 117063 }, "data/input/us/phoenix/raw_maps/loop101.bin": { - "checksum": "f7996b2efeee1201da5ae0c7a0386eb0", - "uncompressed_size_bytes": 42078596, - "compressed_size_bytes": 6923709 + "checksum": "99c7f337b27f1d7708fa2cf6f7b62214", + "uncompressed_size_bytes": 42078588, + "compressed_size_bytes": 6923723 }, "data/input/us/phoenix/raw_maps/tempe.bin": { - "checksum": "6a900c750d29c496b579f794d9d8b5b9", - "uncompressed_size_bytes": 2077774, - "compressed_size_bytes": 389878 + "checksum": "325c178256bb843c1e4614f5f66b42b4", + "uncompressed_size_bytes": 2077766, + "compressed_size_bytes": 389876 }, "data/input/us/phoenix/screenshots/tempe.zip": { "checksum": "c04bf6c010b1141875d4629ed91a5155", @@ -2146,9 +2146,9 @@ "compressed_size_bytes": 41774574 }, "data/input/us/providence/raw_maps/downtown.bin": { - "checksum": "950f0269e60671a56971ff68ced235e2", - "uncompressed_size_bytes": 4891183, - "compressed_size_bytes": 1341616 + "checksum": "e0e362411acb23a765574752e4882e1c", + "uncompressed_size_bytes": 4879368, + "compressed_size_bytes": 1337344 }, "data/input/us/san_francisco/osm/downtown.osm": { "checksum": "0b317f826a053e7d6ccdf72a87b28dc6", @@ -2161,9 +2161,9 @@ "compressed_size_bytes": 484488577 }, "data/input/us/san_francisco/raw_maps/downtown.bin": { - "checksum": "775109181569ec81b627805f2c0168c6", - "uncompressed_size_bytes": 26045770, - "compressed_size_bytes": 7183353 + "checksum": "a63bff421a2c3c140a8c194e7df14883", + "uncompressed_size_bytes": 26042720, + "compressed_size_bytes": 7181440 }, "data/input/us/seattle/blockface.bin": { "checksum": "c5402f77d7cb81a1a7bfb60e90b699c8", @@ -2190,66 +2190,6 @@ "uncompressed_size_bytes": 7024402, "compressed_size_bytes": 1896658 }, - "data/input/us/seattle/google_transit/agency.txt": { - "checksum": "75f564fcc06b1950b7b33acf9d61f696", - "uncompressed_size_bytes": 667, - "compressed_size_bytes": 316 - }, - "data/input/us/seattle/google_transit/block.txt": { - "checksum": "bc4926e7436fe46b2a48117e2d564c9c", - "uncompressed_size_bytes": 64884, - "compressed_size_bytes": 18241 - }, - "data/input/us/seattle/google_transit/block_trip.txt": { - "checksum": "8d3626586ddbb1a384931215580de078", - "uncompressed_size_bytes": 1029502, - "compressed_size_bytes": 180590 - }, - "data/input/us/seattle/google_transit/calendar.txt": { - "checksum": "25572f0a15b93f1fcc2c40752cc3b7de", - "uncompressed_size_bytes": 616, - "compressed_size_bytes": 234 - }, - "data/input/us/seattle/google_transit/calendar_dates.txt": { - "checksum": "df39100d58ac380a4d530dba4bf511f3", - "uncompressed_size_bytes": 1555, - "compressed_size_bytes": 354 - }, - "data/input/us/seattle/google_transit/fare_attributes.txt": { - "checksum": "ca5a7569e1af41e0046fe5e8865cf733", - "uncompressed_size_bytes": 787, - "compressed_size_bytes": 321 - }, - "data/input/us/seattle/google_transit/fare_rules.txt": { - "checksum": "ac9dbd2b81a25a144e762b059a7781a2", - "uncompressed_size_bytes": 13805, - "compressed_size_bytes": 2656 - }, - "data/input/us/seattle/google_transit/routes.txt": { - "checksum": "3cbe6f1230081c6dbbfab04e6ee5c628", - "uncompressed_size_bytes": 22916, - "compressed_size_bytes": 4155 - }, - "data/input/us/seattle/google_transit/shapes.txt": { - "checksum": "aebada05d6d05c78551adb634b748e22", - "uncompressed_size_bytes": 13224783, - "compressed_size_bytes": 3241081 - }, - "data/input/us/seattle/google_transit/stop_times.txt": { - "checksum": "1f1d148b266142b72ab24816d76a9cee", - "uncompressed_size_bytes": 74844821, - "compressed_size_bytes": 10776351 - }, - "data/input/us/seattle/google_transit/stops.txt": { - "checksum": "da1ff7000efdf2166d861479a69d80a4", - "uncompressed_size_bytes": 634154, - "compressed_size_bytes": 118053 - }, - "data/input/us/seattle/google_transit/trips.txt": { - "checksum": "e8efe1d2e130e248942188284d88ab09", - "uncompressed_size_bytes": 3356184, - "compressed_size_bytes": 217199 - }, "data/input/us/seattle/land_use.bin": { "checksum": "9e55954d634e46cd0ea622f266b47438", "uncompressed_size_bytes": 5685020, @@ -2366,74 +2306,74 @@ "compressed_size_bytes": 188141553 }, "data/input/us/seattle/raw_maps/arboretum.bin": { - "checksum": "20dd4e9e6b6a5138f87fd3b91ab42380", - "uncompressed_size_bytes": 3009195, + "checksum": "fdb144376dd21ab73476fd5216b795d0", + "uncompressed_size_bytes": 3009187, "compressed_size_bytes": 686684 }, "data/input/us/seattle/raw_maps/central_seattle.bin": { - "checksum": "cc2a0c083f65a2dd73b540fba0b1a024", - "uncompressed_size_bytes": 35926743, - "compressed_size_bytes": 7714215 + "checksum": "68d347aaa5b87e44a85a6ca2ca3c129f", + "uncompressed_size_bytes": 35926735, + "compressed_size_bytes": 7714217 }, "data/input/us/seattle/raw_maps/downtown.bin": { - "checksum": "4336e09ef611163d50b57e0cb14d0a4c", - "uncompressed_size_bytes": 7970253, - "compressed_size_bytes": 1709159 + "checksum": "3c48795be6d15952d229dfba11f3ef13", + "uncompressed_size_bytes": 7964927, + "compressed_size_bytes": 1708092 }, "data/input/us/seattle/raw_maps/huge_seattle.bin": { - "checksum": "66452497bbf14c09906440b319e1d4ff", - "uncompressed_size_bytes": 120416740, - "compressed_size_bytes": 25209645 + "checksum": "af637904186f460e20cb397c5d23ef32", + "uncompressed_size_bytes": 120416732, + "compressed_size_bytes": 25209643 }, "data/input/us/seattle/raw_maps/lakeslice.bin": { - "checksum": "12c9d84f27595480f3ee8ff58f2c45bd", - "uncompressed_size_bytes": 9048232, - "compressed_size_bytes": 1918049 + "checksum": "fb48f29988a7792b2d48ae9c8da86cbe", + "uncompressed_size_bytes": 9048224, + "compressed_size_bytes": 1918044 }, "data/input/us/seattle/raw_maps/montlake.bin": { - "checksum": "63db4125d1ad0ed4f117e69b738dcdba", - "uncompressed_size_bytes": 1684914, - "compressed_size_bytes": 348504 + "checksum": "26030f14891e092e4e49a31764b6c157", + "uncompressed_size_bytes": 1684906, + "compressed_size_bytes": 348502 }, "data/input/us/seattle/raw_maps/north_seattle.bin": { - "checksum": "3f15ce110c19f950293b35b7359a3221", - "uncompressed_size_bytes": 37515725, - "compressed_size_bytes": 7805040 + "checksum": "18586fa500940f01be06e98abbd36626", + "uncompressed_size_bytes": 37511131, + "compressed_size_bytes": 7801889 }, "data/input/us/seattle/raw_maps/phinney.bin": { - "checksum": "afb60a4c8e435d63500ed32345417b1f", - "uncompressed_size_bytes": 4329906, - "compressed_size_bytes": 841311 + "checksum": "b425b9cb6405ed87cd268aac7effe645", + "uncompressed_size_bytes": 4327591, + "compressed_size_bytes": 839727 }, "data/input/us/seattle/raw_maps/qa.bin": { - "checksum": "0b27373353039cc75ec3ec3b1a941c44", - "uncompressed_size_bytes": 1542390, - "compressed_size_bytes": 299970 + "checksum": "ba1681a9261414c8c38987d78c705f6c", + "uncompressed_size_bytes": 1542382, + "compressed_size_bytes": 299968 }, "data/input/us/seattle/raw_maps/slu.bin": { - "checksum": "965f25235cf7b1166e999949e448f539", - "uncompressed_size_bytes": 617351, - "compressed_size_bytes": 127162 + "checksum": "8adab6d9f75797a67fe43d3e997128e1", + "uncompressed_size_bytes": 614859, + "compressed_size_bytes": 126308 }, "data/input/us/seattle/raw_maps/south_seattle.bin": { - "checksum": "ac9b4a59068b990e80927867ef2169b0", - "uncompressed_size_bytes": 29831186, - "compressed_size_bytes": 6199487 + "checksum": "78aa7ffaf71dea467b7200eb9977e2cf", + "uncompressed_size_bytes": 29831178, + "compressed_size_bytes": 6199484 }, "data/input/us/seattle/raw_maps/udistrict_ravenna.bin": { - "checksum": "f27e5ebff3c7bb10137a08594b3ca638", - "uncompressed_size_bytes": 1790566, - "compressed_size_bytes": 363572 + "checksum": "8b704f7f5faecb83ea2b0a165a5ac8d8", + "uncompressed_size_bytes": 1787211, + "compressed_size_bytes": 362411 }, "data/input/us/seattle/raw_maps/wallingford.bin": { - "checksum": "024e1dfe2c1c26ed1eed5e42c187b22b", - "uncompressed_size_bytes": 2894273, + "checksum": "01b8f81dc92d171c83d11126cc64a70e", + "uncompressed_size_bytes": 2894265, "compressed_size_bytes": 579556 }, "data/input/us/seattle/raw_maps/west_seattle.bin": { - "checksum": "45cb56b4e55c02f443c542f9579b8311", - "uncompressed_size_bytes": 24382917, - "compressed_size_bytes": 4948541 + "checksum": "ace769da4fb16fe48f40a70fe9b8d390", + "uncompressed_size_bytes": 24382909, + "compressed_size_bytes": 4948528 }, "data/input/us/seattle/screenshots/downtown.zip": { "checksum": "9cc39cc605d4e631f01296ca682a30bf", @@ -2476,9 +2416,9 @@ "compressed_size_bytes": 5983699 }, "data/input/us/tucson/raw_maps/center.bin": { - "checksum": "2605441fda5fe3e350723ade2931186a", - "uncompressed_size_bytes": 17827424, - "compressed_size_bytes": 3832426 + "checksum": "71bbc6fbb9ad62fb104ea489abe08070", + "uncompressed_size_bytes": 17824240, + "compressed_size_bytes": 3830214 }, "data/system/at/salzburg/city.bin": { "checksum": "1c0a87045a3c9eb40c1875fffcc98fcf", @@ -2486,9 +2426,9 @@ "compressed_size_bytes": 96214 }, "data/system/at/salzburg/maps/east.bin": { - "checksum": "e94e0d6cb491d31322d5181c7006c8d3", - "uncompressed_size_bytes": 3815941, - "compressed_size_bytes": 1348051 + "checksum": "e5e311582f20e594782f01423d46d881", + "uncompressed_size_bytes": 3799337, + "compressed_size_bytes": 1345188 }, "data/system/at/salzburg/maps/north.bin": { "checksum": "9396b9c8e139ab91686982c0c051c2ae", @@ -2496,14 +2436,14 @@ "compressed_size_bytes": 3003087 }, "data/system/at/salzburg/maps/south.bin": { - "checksum": "8fae62a568231f9c15c638c488f139a8", - "uncompressed_size_bytes": 8372065, - "compressed_size_bytes": 3030793 + "checksum": "3040e24c33163553b35f9d195501491c", + "uncompressed_size_bytes": 8369315, + "compressed_size_bytes": 3028872 }, "data/system/at/salzburg/maps/west.bin": { - "checksum": "1428920af2ef02cd84e0790bf06f3a48", - "uncompressed_size_bytes": 24191785, - "compressed_size_bytes": 8769832 + "checksum": "d79120e3132f36c52550c534b3358e78", + "uncompressed_size_bytes": 24191473, + "compressed_size_bytes": 8769716 }, "data/system/br/sao_paulo/maps/aricanduva.bin": { "checksum": "f2c9cd5df3c8a874d8cd936becd871ea", @@ -2521,9 +2461,9 @@ "compressed_size_bytes": 3682796 }, "data/system/ch/geneva/maps/center.bin": { - "checksum": "7ce1421d4e6c1daf0b71fd1682b15be5", - "uncompressed_size_bytes": 33742070, - "compressed_size_bytes": 11632186 + "checksum": "12370a32593ffaf5714e6f2645db1b4a", + "uncompressed_size_bytes": 33701351, + "compressed_size_bytes": 11619092 }, "data/system/ch/zurich/city.bin": { "checksum": "a209c74a10aa23d23feaf25e1c057efb", @@ -2531,29 +2471,29 @@ "compressed_size_bytes": 73060 }, "data/system/ch/zurich/maps/center.bin": { - "checksum": "8a3d45f6e1f74a86f521e2081283173a", - "uncompressed_size_bytes": 24326886, - "compressed_size_bytes": 8420223 + "checksum": "f2ec5757f43518a805e596ae7a06114a", + "uncompressed_size_bytes": 24324330, + "compressed_size_bytes": 8419237 }, "data/system/ch/zurich/maps/east.bin": { - "checksum": "d2a81fa77d639cf46e246c4ae114a375", - "uncompressed_size_bytes": 22773185, - "compressed_size_bytes": 8330901 + "checksum": "5d579f06c1ee7ad8df1a6ad6c26b7fd5", + "uncompressed_size_bytes": 22778320, + "compressed_size_bytes": 8333209 }, "data/system/ch/zurich/maps/north.bin": { - "checksum": "5065feef53e902e03085ce7f94f16b74", - "uncompressed_size_bytes": 18870412, - "compressed_size_bytes": 6655094 + "checksum": "e7b429a0eaedb66c6d103166cb6198a4", + "uncompressed_size_bytes": 18875153, + "compressed_size_bytes": 6658155 }, "data/system/ch/zurich/maps/south.bin": { - "checksum": "a8adcc84193b152e3bd94638ffb1e793", - "uncompressed_size_bytes": 18656461, - "compressed_size_bytes": 6618479 + "checksum": "c90ec4016567e2f3739f07aa07da022c", + "uncompressed_size_bytes": 18649349, + "compressed_size_bytes": 6614835 }, "data/system/ch/zurich/maps/west.bin": { - "checksum": "c8342caecfd574f83787d0cfc59278d3", - "uncompressed_size_bytes": 21828673, - "compressed_size_bytes": 7634549 + "checksum": "830cdd3a697baf0641b29616110b56f5", + "uncompressed_size_bytes": 21835832, + "compressed_size_bytes": 7640168 }, "data/system/cz/frydek_mistek/maps/huge.bin": { "checksum": "94db2e0d9ed902cb2cd87e84063155d1", @@ -2561,19 +2501,19 @@ "compressed_size_bytes": 5424042 }, "data/system/de/berlin/maps/center.bin": { - "checksum": "6f34eb33d25a2dc22caf9f6256216dc4", - "uncompressed_size_bytes": 24105479, - "compressed_size_bytes": 8415797 + "checksum": "938d9c926100082b480cb51cbe229dbd", + "uncompressed_size_bytes": 24103166, + "compressed_size_bytes": 8415032 }, "data/system/de/berlin/maps/neukolln.bin": { - "checksum": "254c15989b695d209385c4c5556b1e9c", - "uncompressed_size_bytes": 67788936, - "compressed_size_bytes": 24204203 + "checksum": "0e7e11b95a68870805ca87973942af69", + "uncompressed_size_bytes": 67760434, + "compressed_size_bytes": 24191939 }, "data/system/de/bonn/maps/center.bin": { - "checksum": "962824a0914017aa730135bcf68fc94e", - "uncompressed_size_bytes": 13060701, - "compressed_size_bytes": 4668776 + "checksum": "a7a9a2be4c70e7095e63c97e5ab6edb4", + "uncompressed_size_bytes": 13053244, + "compressed_size_bytes": 4665723 }, "data/system/de/bonn/maps/nordstadt.bin": { "checksum": "c38f9d7fd0a99667dd55e2e8dff93017", @@ -2581,9 +2521,9 @@ "compressed_size_bytes": 3047922 }, "data/system/de/bonn/maps/venusberg.bin": { - "checksum": "e6abadebc81d1981b5a223006890c099", - "uncompressed_size_bytes": 1319392, - "compressed_size_bytes": 475030 + "checksum": "1d102577c2d861e1eecc9b8063cd226c", + "uncompressed_size_bytes": 1316005, + "compressed_size_bytes": 473552 }, "data/system/de/rostock/maps/center.bin": { "checksum": "9539fb1636e7a867a4fb630919339d36", @@ -2631,9 +2571,9 @@ "compressed_size_bytes": 1587626 }, "data/system/fr/lyon/maps/center.bin": { - "checksum": "1e13941e2636dc328c6e6bb0b9e81843", - "uncompressed_size_bytes": 87323043, - "compressed_size_bytes": 31095413 + "checksum": "11f9f337b85efed52ac849d14bc6cc75", + "uncompressed_size_bytes": 87335532, + "compressed_size_bytes": 31104788 }, "data/system/fr/paris/city.bin": { "checksum": "1928619334effd967ad2488ba34ed2c9", @@ -2641,29 +2581,29 @@ "compressed_size_bytes": 233651 }, "data/system/fr/paris/maps/center.bin": { - "checksum": "80586e08b52220dd7f5481c4ead98db6", - "uncompressed_size_bytes": 34721912, - "compressed_size_bytes": 12321676 + "checksum": "2c93cf141175f63484fb07515653841e", + "uncompressed_size_bytes": 34696550, + "compressed_size_bytes": 12316993 }, "data/system/fr/paris/maps/east.bin": { - "checksum": "865e18e9306e06c2d2c823e586ee5b14", - "uncompressed_size_bytes": 31606206, - "compressed_size_bytes": 11402941 + "checksum": "099b7c4c392229d3fc2f0617f3a32788", + "uncompressed_size_bytes": 31602838, + "compressed_size_bytes": 11400730 }, "data/system/fr/paris/maps/north.bin": { - "checksum": "c28e61430aa1b1a53f8193ab91f58ee9", - "uncompressed_size_bytes": 38210419, - "compressed_size_bytes": 13677824 + "checksum": "5301b7c8675093f3bfbe8418d528659f", + "uncompressed_size_bytes": 38195042, + "compressed_size_bytes": 13670755 }, "data/system/fr/paris/maps/south.bin": { - "checksum": "dcf81db3c6a49eba782f68f850b84e14", - "uncompressed_size_bytes": 31196050, - "compressed_size_bytes": 11065354 + "checksum": "49f9a59e438e812fcbcbf29e12435608", + "uncompressed_size_bytes": 31182460, + "compressed_size_bytes": 11056291 }, "data/system/fr/paris/maps/west.bin": { - "checksum": "92d1472976a8eb0688d72dc336955f98", - "uncompressed_size_bytes": 39620817, - "compressed_size_bytes": 14375529 + "checksum": "5b2776b5d5cf68b05a1a303b421d3d5d", + "uncompressed_size_bytes": 39610563, + "compressed_size_bytes": 14366623 }, "data/system/gb/allerton_bywater/maps/center.bin": { "checksum": "cadddd4f6f6719b8b41128b89c27eb62", @@ -2766,9 +2706,9 @@ "compressed_size_bytes": 361085 }, "data/system/gb/bailrigg/maps/center.bin": { - "checksum": "dac1688b1afe654035d89cc49884009d", - "uncompressed_size_bytes": 18602424, - "compressed_size_bytes": 6539840 + "checksum": "2c741e6e5ca95ffb6e751a5b6286a38a", + "uncompressed_size_bytes": 18575964, + "compressed_size_bytes": 6530756 }, "data/system/gb/bailrigg/scenarios/center/base.bin": { "checksum": "91a0fd0b15236d1d29acfa7fa8042123", @@ -2961,9 +2901,9 @@ "compressed_size_bytes": 385885 }, "data/system/gb/cricklewood/maps/center.bin": { - "checksum": "3a81bba65f07d6d1b4f38ce4d0ba36aa", - "uncompressed_size_bytes": 15193680, - "compressed_size_bytes": 5302618 + "checksum": "2a2c0cca07b7d834f3df71841f0808f9", + "uncompressed_size_bytes": 15205007, + "compressed_size_bytes": 5307231 }, "data/system/gb/cricklewood/scenarios/center/base.bin": { "checksum": "a7aa47db40efbb1a1794291051a55780", @@ -2971,9 +2911,9 @@ "compressed_size_bytes": 13409 }, "data/system/gb/cricklewood/scenarios/center/base_with_bg.bin": { - "checksum": "6b420184bb9db6e8ca1c4756be1f46bc", + "checksum": "819c2bd452d723ab750160ec588d0691", "uncompressed_size_bytes": 890625, - "compressed_size_bytes": 235002 + "compressed_size_bytes": 234995 }, "data/system/gb/cricklewood/scenarios/center/go_active.bin": { "checksum": "2c657657945245a451b1c785b8c1bf66", @@ -2981,14 +2921,14 @@ "compressed_size_bytes": 13510 }, "data/system/gb/cricklewood/scenarios/center/go_active_with_bg.bin": { - "checksum": "f2bd95616f19165ec4172e0f1ae9197c", + "checksum": "bd85f4183adb1c2d8a3cae0ce873fcdb", "uncompressed_size_bytes": 890510, - "compressed_size_bytes": 235100 + "compressed_size_bytes": 235094 }, "data/system/gb/culm/maps/center.bin": { - "checksum": "b11b8a4d13e5a456c14e9092359328a3", - "uncompressed_size_bytes": 64854462, - "compressed_size_bytes": 23725591 + "checksum": "54c6361cbfebff72ff011552c8f2d1e6", + "uncompressed_size_bytes": 64848664, + "compressed_size_bytes": 23720427 }, "data/system/gb/culm/scenarios/center/base.bin": { "checksum": "d5b3a1fcf550d5d0543aab49d91d9e0e", @@ -3261,9 +3201,9 @@ "compressed_size_bytes": 357438 }, "data/system/gb/kidbrooke_village/maps/center.bin": { - "checksum": "766438a257762435e2040406745e168b", - "uncompressed_size_bytes": 16506512, - "compressed_size_bytes": 5647010 + "checksum": "e2cc7eb40092bd375129fda70914f4e6", + "uncompressed_size_bytes": 16484141, + "compressed_size_bytes": 5639842 }, "data/system/gb/kidbrooke_village/scenarios/center/base.bin": { "checksum": "a6122d6961bb90c8153f7d94bf849b45", @@ -3271,9 +3211,9 @@ "compressed_size_bytes": 45107 }, "data/system/gb/kidbrooke_village/scenarios/center/base_with_bg.bin": { - "checksum": "9cbae197a458713d7951e9ca592cd74b", + "checksum": "5f98d4002797c226087ff0473a2aaf6b", "uncompressed_size_bytes": 782775, - "compressed_size_bytes": 210585 + "compressed_size_bytes": 210589 }, "data/system/gb/kidbrooke_village/scenarios/center/go_active.bin": { "checksum": "f19f18afaf3686423d5cd42f19e132b7", @@ -3281,9 +3221,9 @@ "compressed_size_bytes": 45329 }, "data/system/gb/kidbrooke_village/scenarios/center/go_active_with_bg.bin": { - "checksum": "c37008bba1bb6e660f50d163dabe9bdd", + "checksum": "6470c5319d2ced5739a4269961503e62", "uncompressed_size_bytes": 782720, - "compressed_size_bytes": 210812 + "compressed_size_bytes": 210815 }, "data/system/gb/lcid/maps/center.bin": { "checksum": "d473db6c8f21b115fe9b40de91369bbb", @@ -3381,24 +3321,24 @@ "compressed_size_bytes": 1805380 }, "data/system/gb/london/maps/a5.bin": { - "checksum": "d7d1c90d902de978b84038a4e6cf4ea9", - "uncompressed_size_bytes": 44941664, - "compressed_size_bytes": 15935288 + "checksum": "25903fc30f96e1d0ae35ecd60ed0ae0f", + "uncompressed_size_bytes": 44925924, + "compressed_size_bytes": 15928847 }, "data/system/gb/london/maps/camden.bin": { - "checksum": "b0a99d8dc9cde8b11146bea9734b07eb", - "uncompressed_size_bytes": 63872927, - "compressed_size_bytes": 22598788 + "checksum": "f4792905176382bf2c4a3ff12da9d4b5", + "uncompressed_size_bytes": 63856326, + "compressed_size_bytes": 22593821 }, "data/system/gb/london/maps/southbank.bin": { - "checksum": "c6f8a7577eada5486d4faa65c6728f0d", - "uncompressed_size_bytes": 8134745, - "compressed_size_bytes": 2703066 + "checksum": "bb24e997d8557527d5b7128b0f3cc0f8", + "uncompressed_size_bytes": 8127649, + "compressed_size_bytes": 2702645 }, "data/system/gb/london/scenarios/a5/background.bin": { - "checksum": "73aaab0124249a29c8855df83e8200da", + "checksum": "4da58820f6f8dee6a90d8ec2d05f73ad", "uncompressed_size_bytes": 5144149, - "compressed_size_bytes": 1319243 + "compressed_size_bytes": 1319231 }, "data/system/gb/london/scenarios/camden/background.bin": { "checksum": "4214036aa8f3e979fecf4e3e11f8e9f9", @@ -3486,9 +3426,9 @@ "compressed_size_bytes": 912175 }, "data/system/gb/newborough_road/maps/center.bin": { - "checksum": "14eb61728d234daf8e7d1d6189cd36d2", - "uncompressed_size_bytes": 50273186, - "compressed_size_bytes": 17420409 + "checksum": "f14c53fbfa920b6a4f4dbadc42c6a285", + "uncompressed_size_bytes": 50276605, + "compressed_size_bytes": 17421572 }, "data/system/gb/newborough_road/scenarios/center/base.bin": { "checksum": "6e3e036124f57b9ea8c5431289dc89d7", @@ -3536,9 +3476,9 @@ "compressed_size_bytes": 1000891 }, "data/system/gb/northwick_park/maps/center.bin": { - "checksum": "4b88c5f9ec760e043005f88105bce203", - "uncompressed_size_bytes": 15456550, - "compressed_size_bytes": 5313657 + "checksum": "ea897621035012d30170be5934018854", + "uncompressed_size_bytes": 15451455, + "compressed_size_bytes": 5312227 }, "data/system/gb/northwick_park/scenarios/center/base.bin": { "checksum": "5dcef1b32d7902b335353610639c98d0", @@ -3546,9 +3486,9 @@ "compressed_size_bytes": 10060 }, "data/system/gb/northwick_park/scenarios/center/base_with_bg.bin": { - "checksum": "a418bcf2f77febba5a27fa4762926167", + "checksum": "9c610fdd90c6b63ab568a446724b204c", "uncompressed_size_bytes": 1155969, - "compressed_size_bytes": 303617 + "compressed_size_bytes": 303623 }, "data/system/gb/northwick_park/scenarios/center/go_active.bin": { "checksum": "54eaecf81aec79c835909e604d448f71", @@ -3556,9 +3496,9 @@ "compressed_size_bytes": 9744 }, "data/system/gb/northwick_park/scenarios/center/go_active_with_bg.bin": { - "checksum": "945ef12a42ad4a957d09f89c2d2279a4", + "checksum": "2c7e66584e532d3ebe4bf2a841ab6e58", "uncompressed_size_bytes": 1155071, - "compressed_size_bytes": 303295 + "compressed_size_bytes": 303300 }, "data/system/gb/poundbury/maps/center.bin": { "checksum": "1ebd18939f1c6a51e7be0f2588e2522b", @@ -3971,14 +3911,14 @@ "compressed_size_bytes": 4530527 }, "data/system/pl/krakow/maps/center.bin": { - "checksum": "83f620701ed0112b16f769547ee520be", - "uncompressed_size_bytes": 38161848, - "compressed_size_bytes": 11714578 + "checksum": "e7b7ede4561b55fd775a2481b38874ab", + "uncompressed_size_bytes": 38155865, + "compressed_size_bytes": 11710992 }, "data/system/pl/warsaw/maps/center.bin": { - "checksum": "00780d3338a570ccc6a9e9242bf5e77f", - "uncompressed_size_bytes": 100864222, - "compressed_size_bytes": 30652394 + "checksum": "b67d9dbb84e17888009089359bb3015c", + "uncompressed_size_bytes": 100861240, + "compressed_size_bytes": 30649633 }, "data/system/sg/jurong/maps/center.bin": { "checksum": "d62b805453b99f736e4e42367b119e69", @@ -3996,9 +3936,9 @@ "compressed_size_bytes": 20011754 }, "data/system/us/bellevue/maps/huge.bin": { - "checksum": "e7dc9c7f99484e4af9111bd89cd4ddf1", - "uncompressed_size_bytes": 40802765, - "compressed_size_bytes": 14627547 + "checksum": "c02a9af84cb28e77cf5222ea5b00f654", + "uncompressed_size_bytes": 40795332, + "compressed_size_bytes": 14621715 }, "data/system/us/beltsville/maps/i495.bin": { "checksum": "3a8dbd24147fa8e69bd20566faba8abf", @@ -4051,9 +3991,9 @@ "compressed_size_bytes": 5192802 }, "data/system/us/nyc/maps/midtown_manhattan.bin": { - "checksum": "91fb22cc2ca0c046a2dccaaf06a7cb09", - "uncompressed_size_bytes": 13540281, - "compressed_size_bytes": 4412416 + "checksum": "527eb266e973e7e4432ee1bf1564c44e", + "uncompressed_size_bytes": 13540308, + "compressed_size_bytes": 4412355 }, "data/system/us/phoenix/maps/gilbert.bin": { "checksum": "24faf6e48020028f0c7008a8652a04f2", @@ -4071,14 +4011,14 @@ "compressed_size_bytes": 2491188 }, "data/system/us/providence/maps/downtown.bin": { - "checksum": "99440eb3576a681464d60f9e140d3142", - "uncompressed_size_bytes": 15447508, - "compressed_size_bytes": 5682243 + "checksum": "28576fc169d897c9b6d7a2dbd0d17ebe", + "uncompressed_size_bytes": 15447964, + "compressed_size_bytes": 5682055 }, "data/system/us/san_francisco/maps/downtown.bin": { - "checksum": "582ca9df4eb0bd54738b72380830ea30", - "uncompressed_size_bytes": 50326056, - "compressed_size_bytes": 18922756 + "checksum": "e875bb7510c8c11de834878e814446c4", + "uncompressed_size_bytes": 50336737, + "compressed_size_bytes": 18929750 }, "data/system/us/seattle/city.bin": { "checksum": "5205f53fd0402a7e39bbcda758d7ef97", @@ -4096,9 +4036,9 @@ "compressed_size_bytes": 21079785 }, "data/system/us/seattle/maps/downtown.bin": { - "checksum": "fe56a501ed9bfe23c4effe8021ba1212", - "uncompressed_size_bytes": 22048000, - "compressed_size_bytes": 7922538 + "checksum": "8629b0398d4918588ccd1adf0ffabd11", + "uncompressed_size_bytes": 22052038, + "compressed_size_bytes": 7923747 }, "data/system/us/seattle/maps/huge_seattle.bin": { "checksum": "81f6586c4ec295fb81a52d1b9eef0da4", @@ -4121,9 +4061,9 @@ "compressed_size_bytes": 20188286 }, "data/system/us/seattle/maps/phinney.bin": { - "checksum": "fd567d919e2de8e1c58f1c6f0292d38a", - "uncompressed_size_bytes": 7921189, - "compressed_size_bytes": 2831055 + "checksum": "ddfe9ec92bc4ca4753f9debdb679c0cd", + "uncompressed_size_bytes": 7921014, + "compressed_size_bytes": 2831398 }, "data/system/us/seattle/maps/qa.bin": { "checksum": "6f60821094f34a5817faa25d5bde67b3", @@ -4131,9 +4071,9 @@ "compressed_size_bytes": 999053 }, "data/system/us/seattle/maps/slu.bin": { - "checksum": "d8f9876b83d7ebe3209014285f247944", - "uncompressed_size_bytes": 2068428, - "compressed_size_bytes": 691081 + "checksum": "6cb85ad793aefeba1f5d244e2001daa0", + "uncompressed_size_bytes": 2066926, + "compressed_size_bytes": 689840 }, "data/system/us/seattle/maps/south_seattle.bin": { "checksum": "a4f477801fb29be9cdadb0d34fe28aa5", @@ -4141,9 +4081,9 @@ "compressed_size_bytes": 19644980 }, "data/system/us/seattle/maps/udistrict_ravenna.bin": { - "checksum": "1ffef05f2547491000af5f9d1046d48e", - "uncompressed_size_bytes": 3748986, - "compressed_size_bytes": 1313834 + "checksum": "cf3ab4c6b93449ddb5ed0f13231e7ef8", + "uncompressed_size_bytes": 3742274, + "compressed_size_bytes": 1311467 }, "data/system/us/seattle/maps/wallingford.bin": { "checksum": "6176b00c46718f3c056202369116d3cb", @@ -4241,9 +4181,9 @@ "compressed_size_bytes": 5540024 }, "data/system/us/tucson/maps/center.bin": { - "checksum": "39379d8f5b5f9d6c1eb8baf3062a5e79", - "uncompressed_size_bytes": 74918883, - "compressed_size_bytes": 27064432 + "checksum": "8343e13c3f19e00c476c8b9657ba64c3", + "uncompressed_size_bytes": 74905454, + "compressed_size_bytes": 27054060 } } } \ No newline at end of file diff --git a/importer/src/lib.rs b/importer/src/lib.rs index fff59f44df..d6424d5488 100644 --- a/importer/src/lib.rs +++ b/importer/src/lib.rs @@ -71,8 +71,8 @@ pub async fn regenerate_everything(shard_num: usize, num_shards: usize) { /// Regenerate all maps from RawMaps in parallel. pub fn regenerate_all_maps() { - // Omit Seattle and Berlin, because they have special follow-up actions (GTFS, minifying some - // maps, and distributing residents) + // Omit Seattle and Berlin, because they have special follow-up actions (minifying some maps + // and distributing residents) let all_maps: Vec = CityName::list_all_cities_from_importer_config() .into_iter() .flat_map(|city| city.list_all_maps_in_city_from_importer_config()) @@ -246,16 +246,6 @@ impl Job { "distribute residents from planning areas for {}", name.describe() )); - } else if name.city == CityName::seattle() { - // TODO Slightly misleading, but hijack --skip_ch to also skip GTFS. The - // intention of --skip_ch is usually to quickly iterate on the map importer, - // not in release mode. This import is broken/unused right now anyway and takes - // way too much time in debug mode. - if !self.opts.skip_ch { - timer.start(format!("add GTFS schedules for {}", name.describe())); - seattle::add_gtfs_schedules(&mut map); - timer.stop(format!("add GTFS schedules for {}", name.describe())); - } } Some(map) diff --git a/importer/src/seattle.rs b/importer/src/seattle.rs index 201fc6a672..2137795db3 100644 --- a/importer/src/seattle.rs +++ b/importer/src/seattle.rs @@ -1,14 +1,12 @@ -use std::collections::{BTreeMap, HashSet}; -use std::fs::File; +use std::collections::HashSet; use aabb_quadtree::QuadTree; -use serde::Deserialize; use abstio::{CityName, MapName}; -use abstutil::{MultiMap, Timer}; -use geom::{Duration, Polygon, Ring, Time}; +use abstutil::Timer; +use geom::{Polygon, Ring}; use kml::ExtraShapes; -use map_model::{BuildingID, BuildingType, BusRouteID, Map}; +use map_model::{BuildingID, BuildingType, Map}; use sim::Scenario; use crate::configuration::ImporterConfiguration; @@ -57,13 +55,6 @@ pub async fn input(config: &ImporterConfiguration, timer: &mut Timer<'_>) { timer ).await; - download( - config, - city.input_path("google_transit/"), - "http://metro.kingcounty.gov/gtfs/google_transit.zip", - ) - .await; - // From // https://data-seattlecitygis.opendata.arcgis.com/datasets/5b5c745e0f1f48e7a53acec63a0022ab_0 download( @@ -144,83 +135,6 @@ pub fn adjust_private_parking(map: &mut Map, scenario: &Scenario) { map.save(); } -/// This import from GTFS: -/// - is specific to Seattle, whose files don't seem to match https://developers.google.com/transit/gtfs/reference -/// - is probably wrong -pub fn add_gtfs_schedules(map: &mut Map) { - let city = CityName::seattle(); - // https://www.openstreetmap.org/relation/8616968 as an example, mapping to - // https://kingcounty.gov/depts/transportation/metro/schedules-maps/route/048.aspx - - let mut trip_marker_to_route: BTreeMap = BTreeMap::new(); - for br in map.all_bus_routes() { - if let Some(ref m) = br.gtfs_trip_marker { - // Dunno what the :0 thing is - trip_marker_to_route.insert(m.split(':').next().unwrap().to_string(), br.id); - } - } - - // Each route has a bunch of trips throughout the day - let mut trip_marker_to_trips: MultiMap = MultiMap::new(); - for rec in - csv::Reader::from_reader(File::open(city.input_path("google_transit/trips.txt")).unwrap()) - .deserialize() - { - let rec: TripRecord = rec.unwrap(); - if trip_marker_to_route.contains_key(&rec.shape_id) { - trip_marker_to_trips.insert(rec.shape_id, rec.trip_id); - } - } - - // For every trip, find the earliest arrival time. That should be the spawn time. - let mut trip_to_earliest_time: BTreeMap = BTreeMap::new(); - for rec in csv::Reader::from_reader( - File::open(city.input_path("google_transit/stop_times.txt")).unwrap(), - ) - .deserialize() - { - let rec: StopTimeRecord = rec.unwrap(); - let mut time = Time::parse(&rec.arrival_time).unwrap(); - // Maybe we should duplicate these to handle beginning and end of the simulation - if time > Time::START_OF_DAY + Duration::hours(24) { - time = time - Duration::hours(24); - } - if trip_to_earliest_time - .get(&rec.trip_id) - .map(|t| time < *t) - .unwrap_or(true) - { - trip_to_earliest_time.insert(rec.trip_id, time); - } - } - - // Collect the spawn times per route - for (marker, trips) in trip_marker_to_trips.consume() { - let mut times = Vec::new(); - for trip_id in trips { - times.push(trip_to_earliest_time.remove(&trip_id).unwrap()); - } - times.sort(); - times.dedup(); - - let br = trip_marker_to_route.remove(&marker).unwrap(); - map.hack_override_orig_spawn_times(br, times); - } - map.save(); -} - -#[derive(Debug, Deserialize)] -struct TripRecord { - shape_id: String, - trip_id: String, -} - -#[derive(Debug, Deserialize)] -struct StopTimeRecord { - trip_id: String, - arrival_time: String, -} - /// Match OSM buildings to parcels, scraping the number of housing units. // TODO It's expensive to load the huge zoning_parcels.bin file for every map. pub fn match_parcels_to_buildings(map: &mut Map, shapes: &ExtraShapes, timer: &mut Timer) { diff --git a/map_model/src/make/mod.rs b/map_model/src/make/mod.rs index 45e15271ba..cec3b26add 100644 --- a/map_model/src/make/mod.rs +++ b/map_model/src/make/mod.rs @@ -26,7 +26,6 @@ mod parking_lots; pub mod remove_disconnected; pub mod snappy; pub mod traffic_signals; -mod transit; pub mod turns; mod walking_turns; @@ -285,19 +284,6 @@ impl Map { traffic_signals::synchronize(&mut map); - // Initialization order is tricky. We have to create the slower Dijkstra pathfinding so we - // can validate routes. - map.pathfinder = Pathfinder::new( - &map, - map.routing_params().clone(), - CreateEngine::Dijkstra, - timer, - ); - transit::make_stops_and_routes(&mut map, &raw.bus_routes, timer); - for id in map.bus_stops.keys() { - assert!(!map.get_routes_serving_stop(*id).is_empty()); - } - timer.start("setup pathfinding"); let engine = if opts.skip_ch { CreateEngine::Dijkstra diff --git a/map_model/src/make/transit.rs b/map_model/src/make/transit.rs deleted file mode 100644 index e09a32b32d..0000000000 --- a/map_model/src/make/transit.rs +++ /dev/null @@ -1,351 +0,0 @@ -use std::collections::{BTreeMap, HashMap, HashSet, VecDeque}; - -use anyhow::Result; - -use abstutil::Timer; -use geom::{Distance, Duration, FindClosest, HashablePt2D, Time}; - -use crate::make::match_points_to_lanes; -use crate::raw::{RawBusRoute, RawBusStop}; -use crate::{ - BusRoute, BusRouteID, BusStop, BusStopID, LaneID, LaneType, Map, PathConstraints, Position, -}; - -/// Construct the final model of bus/train stops and routes. This is quite broken currently, so not -/// going to describe how it works. -pub fn make_stops_and_routes(map: &mut Map, raw_routes: &[RawBusRoute], timer: &mut Timer) { - timer.start("make transit stops and routes"); - let matcher = Matcher::new(raw_routes, map, timer); - - // TODO I'm assuming the vehicle_pos <-> driving_pos relation is one-to-one... - let mut pt_to_stop: BTreeMap<(Position, Position), BusStopID> = BTreeMap::new(); - for r in raw_routes { - if let Err(err) = make_route(map, r, &mut pt_to_stop, &matcher) { - warn!("Skipping route {} ({}): {}", r.full_name, r.osm_rel_id, err); - } - } - - // Remove orphaned bus stops. This messes up the BusStopID indexing. - for id in map - .bus_stops - .keys() - .filter(|id| map.get_routes_serving_stop(**id).is_empty()) - .cloned() - .collect::>() - { - map.bus_stops.remove(&id); - map.mut_lane(id.sidewalk).bus_stops.remove(&id); - } - - timer.stop("make transit stops and routes"); -} - -fn make_route( - map: &mut Map, - r: &RawBusRoute, - pt_to_stop: &mut BTreeMap<(Position, Position), BusStopID>, - matcher: &Matcher, -) -> Result<()> { - let route_type = if r.is_bus { - PathConstraints::Bus - } else { - PathConstraints::Train - }; - - let mut stops = Vec::new(); - for stop in &r.stops { - match matcher.lookup(route_type, stop, map) { - Ok((sidewalk_pos, driving_pos)) => { - // Create a new bus stop if needed. - let stop_id = if let Some(id) = pt_to_stop.get(&(sidewalk_pos, driving_pos)) { - *id - } else { - let id = BusStopID { - sidewalk: sidewalk_pos.lane(), - idx: map.get_l(sidewalk_pos.lane()).bus_stops.len(), - }; - pt_to_stop.insert((sidewalk_pos, driving_pos), id); - map.mut_lane(sidewalk_pos.lane()).bus_stops.insert(id); - map.bus_stops.insert( - id, - BusStop { - id, - name: stop.name.clone(), - driving_pos, - sidewalk_pos, - is_train_stop: !r.is_bus, - }, - ); - id - }; - stops.push(stop_id); - } - Err(err) => { - bail!("couldn't match stop {}: {}", stop.name, err); - } - } - } - - // Start or end at a border? - let mut end_border = None; - let start = if let Some(i) = r.border_start { - let i = map.get_i(map.find_i_by_osm_id(i)?); - if !i.is_border() { - panic!("Route starts at {}, but isn't a border?", i.orig_id); - } - if let Some(l) = i.get_outgoing_lanes(map, route_type).get(0) { - *l - } else { - bail!( - "Route {} starts at {} ({}), but no starting lane for a {:?}?", - r.osm_rel_id, - i.id, - i.orig_id, - route_type - ); - } - } else { - // Not starting at a border. Find a lane at or before the first stop that's at least 13m. - pick_start_lane(map.get_bs(stops[0]).driving_pos, route_type, map)? - }; - if let Some(i) = r.border_end { - let i = map.get_i(map.find_i_by_osm_id(i)?); - if !i.is_border() { - panic!("Route ends at {}, but isn't a border?", i.orig_id); - } - // If the last stop is on a lane leading to the border, don't try to lane-change last - // minute - let last_stop_l = map.get_bs(*stops.last().unwrap()).driving_pos.lane(); - if map.get_l(last_stop_l).dst_i == i.id { - end_border = Some(last_stop_l); - } else if let Some(l) = i.get_incoming_lanes(map, route_type).get(0) { - end_border = Some(*l); - } else { - // TODO Should panic - warn!( - "Route {} ends at {} ({}), but no ending lane for a {:?}?", - r.osm_rel_id, i.id, i.orig_id, route_type - ); - } - } - - let route = BusRoute { - id: BusRouteID(map.bus_routes.len()), - full_name: r.full_name.clone(), - short_name: r.short_name.clone(), - osm_rel_id: r.osm_rel_id, - gtfs_trip_marker: r.gtfs_trip_marker.clone(), - stops, - route_type, - start, - end_border, - spawn_times: default_spawn_times(), - orig_spawn_times: default_spawn_times(), - }; - - let mut debug_route = "All parts of the route:".to_string(); - debug_route = format!("{}\nStart at {}", debug_route, route.start); - for (idx, bs) in route.stops.iter().enumerate() { - let stop = map.get_bs(*bs); - debug_route = format!( - "{}\nStop {} ({}): {}", - debug_route, - idx + 1, - stop.name, - stop.driving_pos - ); - } - if let Some(l) = route.end_border { - debug_route = format!("{}\nEnd at {}", debug_route, l); - } - - // Make sure the route is connected - for req in route.all_steps(map) { - if req.start.lane() == req.end.lane() && req.start.dist_along() > req.end.dist_along() { - bail!( - "Two stops seemingly out of order somewhere on {}", - map.get_parent(req.start.lane()).orig_id - ); - } - - if let Err(err) = map.pathfind(req.clone()) { - bail!( - "No path between stop on {} and {}: {}. {}", - map.get_parent(req.start.lane()).orig_id, - map.get_parent(req.end.lane()).orig_id, - err, - debug_route - ); - } - } - - map.bus_routes.push(route); - Ok(()) -} - -struct Matcher { - // TODO Eventually, maybe also map to a station building too - sidewalk_pts: HashMap, - light_rail_pts: HashMap, -} - -impl Matcher { - fn new(routes: &[RawBusRoute], map: &Map, timer: &mut Timer) -> Matcher { - // Match all of the points to an exact position along a lane. - let mut lookup_sidewalk_pts = HashSet::new(); - let mut lookup_light_rail_pts = HashSet::new(); - for r in routes { - for stop in &r.stops { - if !r.is_bus { - lookup_light_rail_pts.insert(stop.vehicle_pos.1.to_hashable()); - } - if let Some(pt) = stop.ped_pos { - lookup_sidewalk_pts.insert(pt.to_hashable()); - } - } - } - let sidewalk_pts = match_points_to_lanes( - map, - lookup_sidewalk_pts, - |l| l.is_walkable(), - Distance::ZERO, - // TODO Generous for cap hill light rail platform - Distance::meters(50.0), - timer, - ); - let light_rail_pts = match_points_to_lanes( - map, - lookup_light_rail_pts, - |l| l.lane_type == LaneType::LightRail, - Distance::ZERO, - Distance::meters(10.0), - timer, - ); - - Matcher { - sidewalk_pts, - light_rail_pts, - } - } - - // returns (sidewalk, driving) - fn lookup( - &self, - route_type: PathConstraints, - stop: &RawBusStop, - map: &Map, - ) -> Result<(Position, Position)> { - if route_type == PathConstraints::Train { - // Light rail needs explicit platforms. - let sidewalk_pt = stop - .ped_pos - .ok_or_else(|| anyhow!("light rail missing platform"))?; - let sidewalk_pos = *self - .sidewalk_pts - .get(&sidewalk_pt.to_hashable()) - .ok_or_else(|| anyhow!("sidewalk for light rail didnt match: {}", sidewalk_pt))?; - let driving_pos = *self - .light_rail_pts - .get(&stop.vehicle_pos.1.to_hashable()) - .ok_or_else(|| { - anyhow!("vehicle for light rail didnt match: {}", stop.vehicle_pos.0) - })?; - return Ok((sidewalk_pos, driving_pos)); - } - - // We already figured out what side of the road we're on - let (r, dir) = stop.matched_road.unwrap(); - let r = map.get_r(map.find_r_by_osm_id(r)?); - // Prefer the rightmost match. DON'T use find_closest_lane here; we only want one side of - // the road. - let l = map.get_l( - r.children(dir) - .iter() - .rev() - .find(|(l, _)| route_type.can_use(map.get_l(*l), map)) - .ok_or_else(|| anyhow!("{} {}, doesn't have a bus or driving lane", r.id, dir))? - .0, - ); - - // Where exactly along this lane? - // TODO This should just be a method in PolyLine - let mut closest: FindClosest<()> = FindClosest::new(map.get_bounds()); - closest.add((), l.lane_center_pts.points()); - let (_, pt) = closest - .closest_pt(stop.vehicle_pos.1, Distance::meters(10.0)) - .ok_or_else(|| anyhow!("{} isn't near {}", stop.vehicle_pos.0, l.id))?; - let mut driving_pos = Position::new(l.id, l.dist_along_of_point(pt).unwrap()); - - let sidewalk_pos = if let Some(pt) = stop.ped_pos { - *self - .sidewalk_pts - .get(&pt.to_hashable()) - .ok_or_else(|| anyhow!("sidewalk didnt match"))? - } else { - let sidewalk = map - .get_parent(driving_pos.lane()) - .find_closest_lane(driving_pos.lane(), |l| { - PathConstraints::Pedestrian.can_use(l, map) - }) - .ok_or_else(|| anyhow!("driving {} to sidewalk failed", driving_pos.lane()))?; - driving_pos.equiv_pos(sidewalk, map) - }; - - // If we're a stop right at an incoming border, make sure to be at least past where the bus - // will spawn from the border. pick_start_lane() can't do anything for borders. - if map - .get_i(map.get_l(driving_pos.lane()).src_i) - .is_incoming_border() - { - if let Some(pos) = driving_pos.min_dist(Distance::meters(1.0), map) { - driving_pos = pos; - } else { - bail!("too close to start of a border {}", driving_pos.lane()); - } - } - Ok((sidewalk_pos, driving_pos)) - } -} - -fn pick_start_lane( - first_stop: Position, - constraints: PathConstraints, - map: &Map, -) -> Result { - let min_len = Distance::meters(13.0); - if first_stop.dist_along() >= min_len { - return Ok(first_stop.lane()); - } - - // Flood backwards until we find a long enough lane - let mut queue = VecDeque::new(); - queue.push_back(first_stop.lane()); - while !queue.is_empty() { - let current = queue.pop_front().unwrap(); - if current != first_stop.lane() && map.get_l(current).length() >= min_len { - return Ok(current); - } - for t in map.get_turns_to_lane(current) { - if constraints.can_use(map.get_l(t.id.src), map) { - queue.push_back(t.id.src); - } - } - } - bail!( - "couldn't find any lanes leading to {} that're long enough for a bus to spawn", - first_stop.lane() - ) -} - -fn default_spawn_times() -> Vec