organizing data/input by city. (I tried organizing everything in data/,

but it's too big a change. small steps.)
This commit is contained in:
Dustin Carlino 2020-04-28 12:28:37 -07:00
parent bba8ac9941
commit 18779c10ad
30 changed files with 301 additions and 238 deletions

25
.gitignore vendored
View File

@ -1,20 +1,23 @@
/target/ /target/
*.swp *.swp
data/input/blockface.bin data/input/seattle/blockface.bin
data/input/google_transit data/input/seattle/google_transit
data/input/neighborhoods data/input/seattle/neighborhoods
data/input/neighborhoods.geojson data/input/seattle/neighborhoods.geojson
data/input/N47W122.hgt data/input/seattle/N47W122.hgt
data/input/offstreet_parking.bin data/input/seattle/offstreet_parking.bin
data/input/osm data/input/seattle/osm
data/input/parcels_urbansim.txt data/input/seattle/parcels_urbansim.txt
data/input/popdat.bin data/input/seattle/popdat.bin
data/input/seattle/sidewalks.bin
data/input/seattle/trips_2014.csv
data/input/austin/osm
data/input/raw_maps data/input/raw_maps
data/input/screenshots/*/*.png data/input/screenshots/*/*.png
data/input/screenshots/*/combine.sh data/input/screenshots/*/combine.sh
data/input/sidewalks.bin
data/input/trips_2014.csv
data/player data/player

View File

@ -145,30 +145,31 @@ pub fn path_all_shortcuts() -> String {
// Input data (For developers to build maps, not needed at runtime) // Input data (For developers to build maps, not needed at runtime)
pub fn path_fixes(name: &str) -> String { pub fn path_fixes(city: &str, map: &str) -> String {
format!("../data/input/fixes/{}.json", name) format!("../data/input/{}/fixes/{}.json", city, map)
} }
pub fn path_neighborhood(map_name: &str, neighborhood: &str) -> String { pub fn path_neighborhood(city_name: &str, map_name: &str, neighborhood: &str) -> String {
format!( format!(
"../data/input/neighborhoods/{}/{}.json", "../data/input/{}/neighborhoods/{}/{}.json",
map_name, neighborhood city_name, map_name, neighborhood
) )
} }
pub fn path_all_neighborhoods(map_name: &str) -> String { pub fn path_all_neighborhoods(city_name: &str, map_name: &str) -> String {
format!("../data/input/neighborhoods/{}", map_name) format!("../data/input/{}/neighborhoods/{}", city_name, map_name)
} }
pub fn path_pending_screenshots(map_name: &str) -> String { pub fn path_pending_screenshots(map_name: &str) -> String {
format!("../data/input/screenshots/pending_{}", map_name) format!("../data/input/screenshots/pending_{}", map_name)
} }
pub fn path_polygon(polygon_name: &str) -> String { // TODO Few callers, and importer just manually builds this path anyway
format!("../data/input/polygons/{}.poly", polygon_name) pub fn path_polygon(city: &str, polygon_name: &str) -> String {
format!("../data/input/{}/polygons/{}.poly", city, polygon_name)
} }
pub fn path_popdat() -> String { pub fn path_popdat() -> String {
format!("../data/input/popdat.bin") format!("../data/input/seattle/popdat.bin")
} }
pub fn path_raw_map(map_name: &str) -> String { pub fn path_raw_map(map_name: &str) -> String {

View File

@ -14,7 +14,11 @@ use map_model::raw::{DrivingSide, OriginalBuilding, OriginalRoad, RawMap};
const DIRECTED_ROAD_THICKNESS: Distance = Distance::const_meters(2.5); const DIRECTED_ROAD_THICKNESS: Distance = Distance::const_meters(2.5);
pub struct Options { pub struct Options {
pub osm: String, pub osm_input: String,
pub output: String,
pub city_name: String,
pub name: String,
pub parking_shapes: Option<String>, pub parking_shapes: Option<String>,
pub public_offstreet_parking: Option<String>, pub public_offstreet_parking: Option<String>,
pub private_offstreet_parking: PrivateOffstreetParking, pub private_offstreet_parking: PrivateOffstreetParking,
@ -24,7 +28,6 @@ pub struct Options {
pub elevation: Option<String>, pub elevation: Option<String>,
pub clip: Option<String>, pub clip: Option<String>,
pub drive_on_right: bool, pub drive_on_right: bool,
pub output: String,
} }
// If a building doesn't have anything from public_offstreet_parking, how many private spots should // If a building doesn't have anything from public_offstreet_parking, how many private spots should
@ -36,8 +39,16 @@ pub enum PrivateOffstreetParking {
} }
pub fn convert(opts: Options, timer: &mut abstutil::Timer) -> RawMap { pub fn convert(opts: Options, timer: &mut abstutil::Timer) -> RawMap {
let (mut map, amenities) = let (mut map, amenities) = split_ways::split_up_roads(
split_ways::split_up_roads(osm_reader::extract_osm(&opts.osm, &opts.clip, timer), timer); osm_reader::extract_osm(
&opts.osm_input,
&opts.clip,
&opts.city_name,
&opts.name,
timer,
),
timer,
);
clip::clip_map(&mut map, timer); clip::clip_map(&mut map, timer);
map.driving_side = if opts.drive_on_right { map.driving_side = if opts.drive_on_right {
DrivingSide::Right DrivingSide::Right
@ -72,7 +83,12 @@ pub fn convert(opts: Options, timer: &mut abstutil::Timer) -> RawMap {
if let Some(ref path) = opts.neighborhoods { if let Some(ref path) = opts.neighborhoods {
timer.start("convert neighborhood polygons"); timer.start("convert neighborhood polygons");
neighborhoods::convert(path.clone(), map.name.clone(), &map.gps_bounds); neighborhoods::convert(
path.clone(),
map.city_name.clone(),
map.name.clone(),
&map.gps_bounds,
);
timer.stop("convert neighborhood polygons"); timer.stop("convert neighborhood polygons");
} }

View File

@ -3,7 +3,7 @@ use geojson::{GeoJson, PolygonType, Value};
use geom::{GPSBounds, LonLat}; use geom::{GPSBounds, LonLat};
use map_model::NeighborhoodBuilder; use map_model::NeighborhoodBuilder;
pub fn convert(geojson_path: String, map_name: String, gps_bounds: &GPSBounds) { pub fn convert(geojson_path: String, city_name: String, map_name: String, gps_bounds: &GPSBounds) {
println!("Extracting neighborhoods from {}...", geojson_path); println!("Extracting neighborhoods from {}...", geojson_path);
let document: GeoJson = abstutil::read_json(geojson_path, &mut Timer::throwaway()); let document: GeoJson = abstutil::read_json(geojson_path, &mut Timer::throwaway());
match document { match document {
@ -12,13 +12,14 @@ pub fn convert(geojson_path: String, map_name: String, gps_bounds: &GPSBounds) {
let name = f.properties.unwrap()["name"].as_str().unwrap().to_string(); let name = f.properties.unwrap()["name"].as_str().unwrap().to_string();
match f.geometry.unwrap().value { match f.geometry.unwrap().value {
Value::Polygon(p) => { Value::Polygon(p) => {
convert_polygon(p, name, map_name.clone(), gps_bounds); convert_polygon(p, name, city_name.clone(), map_name.clone(), gps_bounds);
} }
Value::MultiPolygon(polygons) => { Value::MultiPolygon(polygons) => {
for (idx, p) in polygons.into_iter().enumerate() { for (idx, p) in polygons.into_iter().enumerate() {
convert_polygon( convert_polygon(
p, p,
format!("{} portion #{}", name, idx + 1), format!("{} portion #{}", name, idx + 1),
city_name.clone(),
map_name.clone(), map_name.clone(),
gps_bounds, gps_bounds,
); );
@ -32,7 +33,13 @@ pub fn convert(geojson_path: String, map_name: String, gps_bounds: &GPSBounds) {
} }
} }
fn convert_polygon(input: PolygonType, name: String, map_name: String, gps_bounds: &GPSBounds) { fn convert_polygon(
input: PolygonType,
name: String,
city_name: String,
map_name: String,
gps_bounds: &GPSBounds,
) {
if input.len() > 1 { if input.len() > 1 {
println!("{} has a polygon with an inner ring, skipping", name); println!("{} has a polygon with an inner ring, skipping", name);
return; return;
@ -53,6 +60,7 @@ fn convert_polygon(input: PolygonType, name: String, map_name: String, gps_bound
} }
} }
NeighborhoodBuilder { NeighborhoodBuilder {
city_name,
map_name, map_name,
name, name,
points, points,

View File

@ -10,6 +10,8 @@ use std::io::{BufRead, BufReader};
pub fn extract_osm( pub fn extract_osm(
osm_path: &str, osm_path: &str,
maybe_clip_path: &Option<String>, maybe_clip_path: &Option<String>,
city_name: &str,
map_name: &str,
timer: &mut Timer, timer: &mut Timer,
) -> ( ) -> (
RawMap, RawMap,
@ -35,9 +37,9 @@ pub fn extract_osm(
done(timer); done(timer);
let mut map = if let Some(ref path) = maybe_clip_path { let mut map = if let Some(ref path) = maybe_clip_path {
read_osmosis_polygon(path) read_osmosis_polygon(path, city_name, map_name)
} else { } else {
let mut m = RawMap::blank(abstutil::basename(osm_path)); let mut m = RawMap::blank(city_name, map_name);
for node in doc.nodes.values() { for node in doc.nodes.values() {
m.gps_bounds.update(LonLat::new(node.lon, node.lat)); m.gps_bounds.update(LonLat::new(node.lon, node.lat));
} }
@ -456,7 +458,7 @@ fn glue_to_boundary(result_pl: PolyLine, boundary: &Ring) -> Option<Polygon> {
Some(Polygon::new(&trimmed_pts)) Some(Polygon::new(&trimmed_pts))
} }
fn read_osmosis_polygon(path: &str) -> RawMap { fn read_osmosis_polygon(path: &str, city_name: &str, map_name: &str) -> RawMap {
let mut pts: Vec<LonLat> = Vec::new(); let mut pts: Vec<LonLat> = Vec::new();
let mut gps_bounds = GPSBounds::new(); let mut gps_bounds = GPSBounds::new();
for (idx, maybe_line) in BufReader::new(File::open(path).unwrap()) for (idx, maybe_line) in BufReader::new(File::open(path).unwrap())
@ -480,7 +482,7 @@ fn read_osmosis_polygon(path: &str) -> RawMap {
gps_bounds.update(pt); gps_bounds.update(pt);
} }
let mut map = RawMap::blank(abstutil::basename(path)); let mut map = RawMap::blank(city_name, map_name);
map.boundary_polygon = Polygon::new(&gps_bounds.must_convert(&pts)); map.boundary_polygon = Polygon::new(&gps_bounds.must_convert(&pts));
map.gps_bounds = gps_bounds; map.gps_bounds = gps_bounds;
map map

View File

@ -1,122 +1,136 @@
68c20b1b71afbd5531aeb6c080cdd69d data/input/fixes/huge_seattle.json 68c20b1b71afbd5531aeb6c080cdd69d data/input/seattle/fixes/huge_seattle.json
88d1fd31af1c59ba4ebb2272504b321c data/input/fixes/23rd.json 88d1fd31af1c59ba4ebb2272504b321c data/input/seattle/fixes/23rd.json
4cda6f154fc64920765bebf4b72f1c8d data/input/fixes/montlake.json 4cda6f154fc64920765bebf4b72f1c8d data/input/seattle/fixes/montlake.json
d4a8e733045b28c0385fb81359d6df03 data/input/trips_2014.csv d4a8e733045b28c0385fb81359d6df03 data/input/seattle/trips_2014.csv
e4546fa3a8778d73d4dbae5bf5e6072d data/input/osm/montlake.osm e4546fa3a8778d73d4dbae5bf5e6072d data/input/seattle/osm/montlake.osm
b5f64e800ea1e70b2326792aee494e9a data/input/osm/huge_seattle.osm b5f64e800ea1e70b2326792aee494e9a data/input/seattle/osm/huge_seattle.osm
a30b0f460a481598e494f16a9d07a822 data/input/osm/downtown_atx.osm c2f29dfce01a727671b9c67772ee3ed5 data/input/seattle/osm/ballard.osm
c2f29dfce01a727671b9c67772ee3ed5 data/input/osm/ballard.osm f36e72469646c1cf25ceb42ae82b2a6f data/input/seattle/osm/23rd.osm
7c8d72cf97072af34cee665006b1e9e6 data/input/osm/Austin.osm 79f7686dcb469a6262e13d5e61571303 data/input/seattle/osm/downtown.osm
f36e72469646c1cf25ceb42ae82b2a6f data/input/osm/23rd.osm 9315a7df9e878865ff361ea89129970b data/input/seattle/osm/intl_district.osm
fb166029fc8006bd20dc959fbbbde3b6 data/input/osm/huge_austin.osm 791b47c83ef94d65c709be027061d13c data/input/seattle/osm/caphill.osm
79f7686dcb469a6262e13d5e61571303 data/input/osm/downtown.osm a04a70a76161c802c6488d5a843ea244 data/input/seattle/osm/lakeslice.osm
9315a7df9e878865ff361ea89129970b data/input/osm/intl_district.osm e2a3187ab5be2bf76369823853d86c14 data/input/seattle/osm/Seattle.osm
791b47c83ef94d65c709be027061d13c data/input/osm/caphill.osm 46d8ebc909717b5ddfe921cf487f975d data/input/seattle/neighborhoods/ballard/West Woodland.json
a04a70a76161c802c6488d5a843ea244 data/input/osm/lakeslice.osm ba915a6237156522eac2f380e978bb25 data/input/seattle/neighborhoods/ballard/Adams.json
e2a3187ab5be2bf76369823853d86c14 data/input/osm/Seattle.osm ae6e3c5801460075cebe736e56d98b01 data/input/seattle/neighborhoods/ballard/Phinney Ridge.json
b0294210de30fee57a204f4c7852df9d data/input/neighborhoods/ballard/West Woodland.json 886cff1b9508af1917d76d746336c961 data/input/seattle/neighborhoods/ballard/Fremont.json
134c34c99e93e3fdef736e7b9a1a6d90 data/input/neighborhoods/ballard/Adams.json ae8a868fe3eac6c67340f174dc24866a data/input/seattle/neighborhoods/ballard/Lawton Park.json
0273adb18ead495ff542fb7c90b779cc data/input/neighborhoods/ballard/Phinney Ridge.json 1e2ff5d0083b0e5aab885d38be992ad7 data/input/seattle/neighborhoods/intl_district/International District.json
13a49dbacf1e40c2a68e756632128b7f data/input/neighborhoods/ballard/Fremont.json 721155dd7662b9aaaf68b222aa731560 data/input/seattle/neighborhoods/x1/Harrison - Denny-Blaine.json
af08ef81c9ba3d693854f65180d6c42c data/input/neighborhoods/ballard/Lawton Park.json 2e9dbd878640b904307dcadc1fd7334f data/input/seattle/neighborhoods/x1/Madison Park.json
07d2b3da4fe8e71328762bb3a4a26ba0 data/input/neighborhoods/intl_district/International District.json f2b26082d44df01339f30d1cc2eb4178 data/input/seattle/neighborhoods/x1/Portage Bay.json
721155dd7662b9aaaf68b222aa731560 data/input/neighborhoods/x1/Harrison - Denny-Blaine.json 197ecdfed33e300e6f64275a896b2905 data/input/seattle/neighborhoods/x1/Eastlake.json
2e9dbd878640b904307dcadc1fd7334f data/input/neighborhoods/x1/Madison Park.json 33128005e7f6caaab5d321558965f125 data/input/seattle/neighborhoods/x1/Broadway.json
f2b26082d44df01339f30d1cc2eb4178 data/input/neighborhoods/x1/Portage Bay.json a5dca5dd4a4b78efb17e69c2d557ab1b data/input/seattle/neighborhoods/x1/Stevens.json
197ecdfed33e300e6f64275a896b2905 data/input/neighborhoods/x1/Eastlake.json 519cbc4a6c2038fab9df172f2db63085 data/input/seattle/neighborhoods/x1/Montlake.json
33128005e7f6caaab5d321558965f125 data/input/neighborhoods/x1/Broadway.json ae65aaa3a0ddb7bb990972c9832369b6 data/input/seattle/neighborhoods/23rd/Mann.json
a5dca5dd4a4b78efb17e69c2d557ab1b data/input/neighborhoods/x1/Stevens.json d9e0bc911a52aa15f51cb49956d2aef5 data/input/seattle/neighborhoods/lakeslice/Leschi.json
519cbc4a6c2038fab9df172f2db63085 data/input/neighborhoods/x1/Montlake.json 1ac65f96b8f4a2b2d365949032966402 data/input/seattle/neighborhoods/lakeslice/Harrison - Denny-Blaine.json
a6860296e9b842be9226fc9fe1fc3cad data/input/neighborhoods/23rd/Mann.json 7b5a6df2a313b997e1ac575f6cec03d6 data/input/seattle/neighborhoods/lakeslice/Mann.json
ed7dc58cf6e4fc61afd64dd973770f10 data/input/neighborhoods/lakeslice/Leschi.json eb073e33d652161805fd42c982856703 data/input/seattle/neighborhoods/lakeslice/Madrona.json
f8c72b08495801165046fb91bc4b3138 data/input/neighborhoods/lakeslice/Harrison - Denny-Blaine.json e62769afe799c43dbbe73e164e6bd620 data/input/seattle/neighborhoods/downtown/Pike-Market.json
64e01cf5faf709552168bc4dc30ba4a6 data/input/neighborhoods/lakeslice/Mann.json d02cb65749922832091b18ad45a4400e data/input/seattle/neighborhoods/downtown/First Hill.json
6d8a88b76bdc14690c959f349c30bbf9 data/input/neighborhoods/lakeslice/Madrona.json 64073270987303abf1532e6abaaa2676 data/input/seattle/neighborhoods/downtown/Central Business District.json
6da5d27cf9e113afd004667be3381527 data/input/neighborhoods/downtown/Pike-Market.json 2374dd1b296f7bffa436e14ff2ddcd36 data/input/seattle/neighborhoods/downtown/Belltown.json
3d8e21ae459dd03b5c357d6a630b31d3 data/input/neighborhoods/downtown/First Hill.json 796f5d8eb1a5f1bfe85b2945239e14de data/input/seattle/neighborhoods/huge_seattle/West Woodland.json
732fd9f536d91a81e378ffec5c663f0a data/input/neighborhoods/downtown/Central Business District.json 8f586abbc7c18ee104493f7f83d88b20 data/input/seattle/neighborhoods/huge_seattle/Westlake.json
8ea8250a370423ec9520709b7459229c data/input/neighborhoods/downtown/Belltown.json 778beb76a0f0f2c4e5f71e56f6a37076 data/input/seattle/neighborhoods/huge_seattle/North College Park.json
f2d7e0a90fae8d31711fd37fcd9718a5 data/input/neighborhoods/huge_seattle/West Woodland.json 21376d86306c45e82ddbbc4acd62a3ce data/input/seattle/neighborhoods/huge_seattle/Lower Queen Anne.json
f14cb63a866161af7a79009419f5fd21 data/input/neighborhoods/huge_seattle/Westlake.json 90e78679efe05bb5c51c095bd56df8db data/input/seattle/neighborhoods/huge_seattle/Adams.json
580bc3ea6c9b3cc815c38ec5181b0858 data/input/neighborhoods/huge_seattle/North College Park.json 7d2570e9728af1313c0af70b35ff7c12 data/input/seattle/neighborhoods/huge_seattle/Leschi.json
8c273924c07f76ade9a5484b06abef5c data/input/neighborhoods/huge_seattle/Lower Queen Anne.json 02e25d6d76d0a9b8823e8783d01d499b data/input/seattle/neighborhoods/huge_seattle/University District.json
39029a5d7bc2383b6a3f63739866082e data/input/neighborhoods/huge_seattle/Adams.json 4c9c0bbd2c4d30166cc82b6c9291de78 data/input/seattle/neighborhoods/huge_seattle/Pike-Market.json
e08466b80ae3f3d47b557ec102bd7547 data/input/neighborhoods/huge_seattle/Leschi.json 2ff1b7b76f126ed69227923d40ecdaa3 data/input/seattle/neighborhoods/huge_seattle/Harrison - Denny-Blaine.json
8fb32f54bf124a27218342d80a880b0b data/input/neighborhoods/huge_seattle/University District.json a65a48ca68f15635fd86e7fdd06ddaea data/input/seattle/neighborhoods/huge_seattle/Roosevelt.json
f83718a053d5ac61352c6abfd352b914 data/input/neighborhoods/huge_seattle/Pike-Market.json 57103a4893df8c1667674d8de47bee0b data/input/seattle/neighborhoods/huge_seattle/Whittier Heights.json
7cb58cc9f553e464c56eff802067c879 data/input/neighborhoods/huge_seattle/Harrison - Denny-Blaine.json 9cb7a0ef7a3bcdb634681e21d2f6fea3 data/input/seattle/neighborhoods/huge_seattle/Laurelhurst.json
edd4fe2cc274ea4554c5855e79ed5ade data/input/neighborhoods/huge_seattle/Roosevelt.json cb93fd55d3b42979a96dc45e5571f5ac data/input/seattle/neighborhoods/huge_seattle/International District.json
58055de4974d22203f770082722fe9fa data/input/neighborhoods/huge_seattle/Whittier Heights.json 9f04e6fa311b2274a42ee4b29f11d4e8 data/input/seattle/neighborhoods/huge_seattle/Maple Leaf.json
2170f688ff57114a89921dc6740e4671 data/input/neighborhoods/huge_seattle/Laurelhurst.json a8d1df39941171daa16195cc98692907 data/input/seattle/neighborhoods/huge_seattle/First Hill.json
c3ac7309ef28ae17e946d40c6b490223 data/input/neighborhoods/huge_seattle/International District.json b7fcb8b06ce4f571849fd33a277d21af data/input/seattle/neighborhoods/huge_seattle/Madison Park.json
875dd4425966161012f4bb3926137ea0 data/input/neighborhoods/huge_seattle/Maple Leaf.json c45186b872050db02e053afcf4a7424e data/input/seattle/neighborhoods/huge_seattle/Portage Bay.json
0383dc9dc26d379572d786c91445cab0 data/input/neighborhoods/huge_seattle/First Hill.json b4f6a4f24dab7eed34347069748ed6ce data/input/seattle/neighborhoods/huge_seattle/Central Business District.json
78911c43d3dc60e7499a9d6453883010 data/input/neighborhoods/huge_seattle/Madison Park.json ffcca5e408c97cb81d1f739816809e01 data/input/seattle/neighborhoods/huge_seattle/South Lake Union.json
af53747bf8d3fae916c889896810929b data/input/neighborhoods/huge_seattle/Portage Bay.json db4b1be3343681f5bcd8115181f95f08 data/input/seattle/neighborhoods/huge_seattle/Greenwood.json
d998627db6f711ada38e9a3bcf5dd04c data/input/neighborhoods/huge_seattle/Central Business District.json 6d50b3ae6f11de62b44e6109a435d002 data/input/seattle/neighborhoods/huge_seattle/Eastlake.json
0c3011246788f34e75d09b2fa2a31108 data/input/neighborhoods/huge_seattle/South Lake Union.json b809cb0eb9a77a138c447d92d2a036ad data/input/seattle/neighborhoods/huge_seattle/Sunset Hill.json
7f9ae69b3593fc54b42a64fbc6e38717 data/input/neighborhoods/huge_seattle/Greenwood.json 1c27ea07ae9f046e79bdd79a0dbc4863 data/input/seattle/neighborhoods/huge_seattle/Broadway.json
e8178607910bb0e6a74c327132cd1af6 data/input/neighborhoods/huge_seattle/Eastlake.json a205318630171b21d3d8172c44a973d1 data/input/seattle/neighborhoods/huge_seattle/Phinney Ridge.json
6807f0d6baf260b9cc5715be89e164e8 data/input/neighborhoods/huge_seattle/Sunset Hill.json 02c097d984b9e039b7b9912f03ddf717 data/input/seattle/neighborhoods/huge_seattle/Ravenna.json
a16f5d5a71f43c80aad599c34f918036 data/input/neighborhoods/huge_seattle/Broadway.json fc6dc3658c5d9cb01d778db3026731c6 data/input/seattle/neighborhoods/huge_seattle/Fremont.json
976097ef7c1bc239ece3745e0681ed68 data/input/neighborhoods/huge_seattle/Phinney Ridge.json 14b37651f6259ba8ed8f7dc04a93245b data/input/seattle/neighborhoods/huge_seattle/Yesler Terrace.json
b8b42f5fef978e5158125e22ef715cd4 data/input/neighborhoods/huge_seattle/Ravenna.json a3b74ad210d5ae94c8fb8a23ffd7b521 data/input/seattle/neighborhoods/huge_seattle/Wedgwood.json
ad421fca3b9beaa49d688e9fb8e2c412 data/input/neighborhoods/huge_seattle/Fremont.json f60c9d7699b39ed6d99109ff0a4b7ee9 data/input/seattle/neighborhoods/huge_seattle/Sand Point.json
503cd0ff9ef92ddf5798262470046578 data/input/neighborhoods/huge_seattle/Yesler Terrace.json 7957979d53d4a6364b9020a119c1f9e9 data/input/seattle/neighborhoods/huge_seattle/Wallingford.json
7090624f654057f1b5158f516a662ac4 data/input/neighborhoods/huge_seattle/Wedgwood.json c642b472850a444e1d436a3dc8de5c57 data/input/seattle/neighborhoods/huge_seattle/Interbay.json
6961533182eb81d9a352a9954aacd085 data/input/neighborhoods/huge_seattle/Sand Point.json b19598d61c1301e4573edd927fb4ba38 data/input/seattle/neighborhoods/huge_seattle/West Queen Anne.json
a006e06a89f7d58fd25073171dff7873 data/input/neighborhoods/huge_seattle/Wallingford.json 331b23ca4b2d94d6e38026dfd7dfc386 data/input/seattle/neighborhoods/huge_seattle/Southeast Magnolia.json
130227b4eec5744d3f747699d0a71642 data/input/neighborhoods/huge_seattle/Interbay.json b89543b001bc1e6f7ec5afda712a9532 data/input/seattle/neighborhoods/huge_seattle/North Beach - Blue Ridge.json
3b78ed2725ca95c22fc4c3e72603bd4c data/input/neighborhoods/huge_seattle/West Queen Anne.json 0f8511e1759b3150d77752aa9608ddd5 data/input/seattle/neighborhoods/huge_seattle/Windermere.json
0f6044807c0a27d0a37c6a57455164b9 data/input/neighborhoods/huge_seattle/Southeast Magnolia.json c9fe0cec21b4506b9449f8e286707f62 data/input/seattle/neighborhoods/huge_seattle/Stevens.json
d3b26af786b60a33a632a066aed34ad6 data/input/neighborhoods/huge_seattle/North Beach - Blue Ridge.json 8f1b6913ee7ddee6c3ad6762077e1940 data/input/seattle/neighborhoods/huge_seattle/East Queen Anne.json
ab6bbbac5ce8bf4ef643ce46382ad4c4 data/input/neighborhoods/huge_seattle/Windermere.json 3f1e1d2473fcd9909ed48885156d8ad9 data/input/seattle/neighborhoods/huge_seattle/Belltown.json
4ba02a037455715f3c77ca7bfe668ee2 data/input/neighborhoods/huge_seattle/Stevens.json 7148acd286b453d20db96ad3a8461727 data/input/seattle/neighborhoods/huge_seattle/Loyal Heights.json
b0162a73d9023a0fc10cb0c0e76403b1 data/input/neighborhoods/huge_seattle/East Queen Anne.json 14c4caa74a3aab96b3270c9add7c8019 data/input/seattle/neighborhoods/huge_seattle/Mann.json
762609d9a170ff0fcaf7671f06f8ce4e data/input/neighborhoods/huge_seattle/Belltown.json af28f6e4b3ef367fed0d828a47e5208d data/input/seattle/neighborhoods/huge_seattle/View Ridge.json
47971bee1be78a305ecb442dd9ddf059 data/input/neighborhoods/huge_seattle/Loyal Heights.json 05ca8b996e144d45ae49961638e37135 data/input/seattle/neighborhoods/huge_seattle/Minor.json
31ea4d515ff983e2625eb8d2cbf61930 data/input/neighborhoods/huge_seattle/Mann.json 4b0347aeed2ad2e3cf3b71a07efba3e0 data/input/seattle/neighborhoods/huge_seattle/Madrona.json
22619b004634a46f6d6bf0efbdc5481c data/input/neighborhoods/huge_seattle/View Ridge.json baa4ebb40bc293c6176a3239620e7183 data/input/seattle/neighborhoods/huge_seattle/Lawton Park.json
f14a6803a9b3874edc44e35e71f99ef9 data/input/neighborhoods/huge_seattle/Minor.json 78b4d30d5bb4e7e8a40c7728124fd890 data/input/seattle/neighborhoods/huge_seattle/Montlake.json
194bcf33fdde0a73ca9f32b32d152dcc data/input/neighborhoods/huge_seattle/Madrona.json 271892c6453b6e0d512f948d9b7de62a data/input/seattle/neighborhoods/huge_seattle/Briarcliff.json
39044e4cfbda0a390717f8e8de53f0d9 data/input/neighborhoods/huge_seattle/Lawton Park.json 92d4c74df6478e29cdb0281ba4ff7894 data/input/seattle/neighborhoods/huge_seattle/North Queen Anne.json
7fba527f49fee2dd698f52149fec1b85 data/input/neighborhoods/huge_seattle/Montlake.json 9666b4689a2927797fe865becd6f61b7 data/input/seattle/neighborhoods/huge_seattle/Pioneer Square.json
f8f4d600347638cafb5688a096331572 data/input/neighborhoods/huge_seattle/Briarcliff.json 18ae58793ddede2c087dbc7f9876266a data/input/seattle/neighborhoods/huge_seattle/Crown Hill.json
26c6998e49233361180262bcd8b58a2a data/input/neighborhoods/huge_seattle/North Queen Anne.json d729d8ef4f797d51dbb53096a4aac233 data/input/seattle/neighborhoods/huge_seattle/Green Lake.json
57b13ac060424106da0e2a8aed2eaf6b data/input/neighborhoods/huge_seattle/Pioneer Square.json 4be236f94749a0325f9696d0ed051e85 data/input/seattle/neighborhoods/huge_seattle/Bryant.json
0843ce2be4652f309c926cf635ce4df1 data/input/neighborhoods/huge_seattle/Crown Hill.json 1e608dafe6199b70929bb6bae84ead30 data/input/seattle/neighborhoods/caphill/Portage Bay.json
d65838b354287f1605914ce74a188219 data/input/neighborhoods/huge_seattle/Green Lake.json 82c31490f1c0b5f7ab2e75766c8a9e04 data/input/seattle/neighborhoods/caphill/Eastlake.json
39b8142bea1595f9b094792cb4df510d data/input/neighborhoods/huge_seattle/Bryant.json 790ca481f2ea517acd63c97cc58b4d10 data/input/seattle/neighborhoods/caphill/Broadway.json
0ba8ab46da7c8601c9dc5b9fe5116f2b data/input/neighborhoods/caphill/Portage Bay.json 2b5fe53d1566708e1484181f026a77db data/input/seattle/neighborhoods/caphill/Stevens.json
f479ca9324e63569b5c129170afbf5ac data/input/neighborhoods/caphill/Eastlake.json 96794d4b0d55abbacc48ff2df9941230 data/input/seattle/neighborhoods/caphill/Montlake.json
d14c96851d6289b867e008432f54320d data/input/neighborhoods/caphill/Broadway.json 19e8073a9f6c807b4492681b2c7570de data/input/seattle/blockface.bin
5475db4ee8aa2a1c610670efca8eb830 data/input/neighborhoods/caphill/Stevens.json db63d7d606e8702d12f9399e87e6a00f data/input/seattle/parcels_urbansim.txt
955835e85d15a2fb6c4a8586b8e5cb73 data/input/neighborhoods/caphill/Montlake.json 2bc84e4d194d7cea6007ae3b93f3b11b data/input/seattle/neighborhoods.geojson
19e8073a9f6c807b4492681b2c7570de data/input/blockface.bin 025fc890c650c22f9fc35271dfeb8019 data/input/seattle/popdat.bin
db63d7d606e8702d12f9399e87e6a00f data/input/parcels_urbansim.txt 428bc2e92ea02089cedbb614ce1d8f25 data/input/seattle/polygons/caphill.poly
70c91146f4ea2c83f17f3d6b99f3b89d data/input/raw_maps/huge_seattle.bin 4f291bbe84ac32a98d7d100be79ddc4b data/input/seattle/polygons/huge_seattle.poly
82bb6b459eb2a6b4f0daf277348f5e6c data/input/raw_maps/ballard.bin 6b221b5e68a38f16f34e46a208c7ca15 data/input/seattle/polygons/lakeslice.poly
93553e321c5efac4b700ab9c2569eacb data/input/raw_maps/downtown.bin 418bcd5b335d12a1aa8ef556367e0bad data/input/seattle/polygons/montlake.poly
6f15b586cb9a610f95b815fd12442dd7 data/input/raw_maps/caphill.bin 502f3bf285833fc061099a52f2f70819 data/input/seattle/polygons/intl_district.poly
534b0bbf56981aee23d83338365dde7a data/input/raw_maps/lakeslice.bin 5d48031ff3b288ecb22bd2a96809a0ab data/input/seattle/polygons/ballard.poly
1e264a737cd4c4eed887c057a7b4eccf data/input/raw_maps/huge_austin.bin 0304847f270859fcfc19c8ca122ed793 data/input/seattle/polygons/23rd.poly
4ff7768c4ad52eeb2d02f425d8294847 data/input/raw_maps/downtown_atx.bin 54f5f16e5ec925cb29b4d1405a89ef94 data/input/seattle/polygons/downtown.poly
01cee37af1e49b295448933a89de9192 data/input/raw_maps/montlake.bin 58485a3bdff2aea9769fffd207e3cf30 data/input/seattle/offstreet_parking.bin
0452d8d5998d782474256a083c6d8be3 data/input/raw_maps/intl_district.bin 129b460f56f5eb41cab3bfd70fb5fde9 data/input/seattle/sidewalks.bin
558c575a44a072909e3ee1d9a50386bb data/input/raw_maps/23rd.bin 0db4e23e51f7680538b0bbbc72208e07 data/input/seattle/N47W122.hgt
2bc84e4d194d7cea6007ae3b93f3b11b data/input/neighborhoods.geojson 51dbf7a263fe5f0ea24e43c3aad3fec2 data/input/seattle/google_transit/stop_times.txt
025fc890c650c22f9fc35271dfeb8019 data/input/popdat.bin 308c4e4ab385b7e8c1a1f75c4dc96e3f data/input/seattle/google_transit/routes.txt
428bc2e92ea02089cedbb614ce1d8f25 data/input/polygons/caphill.poly 9d3deb093076d7eaf748114829802292 data/input/seattle/google_transit/calendar_dates.txt
4f291bbe84ac32a98d7d100be79ddc4b data/input/polygons/huge_seattle.poly 1800e4da804a8d9809d8b636742b9d00 data/input/seattle/google_transit/fare_rules.txt
6b221b5e68a38f16f34e46a208c7ca15 data/input/polygons/lakeslice.poly 9502d1a6e03a21c7e6987c036d5aea6f data/input/seattle/google_transit/block_trip.txt
418bcd5b335d12a1aa8ef556367e0bad data/input/polygons/montlake.poly b66cb4c0a24b2d038427aa6e1aa1954a data/input/seattle/google_transit/block.txt
8c6570b3bad2a362e0e6f4bb6f4a8fda data/input/polygons/huge_austin.poly 7211c370ecf3d8839ea0eb6651ed18e9 data/input/seattle/google_transit/calendar.txt
502f3bf285833fc061099a52f2f70819 data/input/polygons/intl_district.poly 33f4f1264b3c982f0d6922ce7fb45e73 data/input/seattle/google_transit/shapes.txt
5d48031ff3b288ecb22bd2a96809a0ab data/input/polygons/ballard.poly 8a4fbb3846249777afae319d64e6241e data/input/seattle/google_transit/trips.txt
dc9a8a05f8f2e508af7a9841866f8cd3 data/input/polygons/downtown_atx.poly ca5a7569e1af41e0046fe5e8865cf733 data/input/seattle/google_transit/fare_attributes.txt
0304847f270859fcfc19c8ca122ed793 data/input/polygons/23rd.poly 8610cdc491d036eee88c9b7ae24d692d data/input/seattle/google_transit/stops.txt
54f5f16e5ec925cb29b4d1405a89ef94 data/input/polygons/downtown.poly 75f564fcc06b1950b7b33acf9d61f696 data/input/seattle/google_transit/agency.txt
58485a3bdff2aea9769fffd207e3cf30 data/input/offstreet_parking.bin 9902835baa19d6b2b3e64f87f24e50d8 data/input/raw_maps/huge_seattle.bin
7883d9cd9c5120d475d7880cc14b4e20 data/input/raw_maps/ballard.bin
f802aff8d8c1d5d8ec1caa295ccf8040 data/input/raw_maps/downtown.bin
f1a4f5663df3c6a488f1b0663ab8f61f data/input/raw_maps/caphill.bin
f0a8fff1790d96384482805d134c4ee5 data/input/raw_maps/lakeslice.bin
b50223a417508afb924252ae3ecd24ad data/input/raw_maps/huge_austin.bin
d4f6ece8ef35c594c794928d651c5916 data/input/raw_maps/downtown_atx.bin
c7a0ec6f43daff30af58cd223d9771b8 data/input/raw_maps/montlake.bin
27e559028ac7e2339ff7969ad6d5e37d data/input/raw_maps/intl_district.bin
22fbf319194f1ad011b53794640ef156 data/input/raw_maps/23rd.bin
a30b0f460a481598e494f16a9d07a822 data/input/austin/osm/downtown_atx.osm
7c8d72cf97072af34cee665006b1e9e6 data/input/austin/osm/Austin.osm
fb166029fc8006bd20dc959fbbbde3b6 data/input/austin/osm/huge_austin.osm
8c6570b3bad2a362e0e6f4bb6f4a8fda data/input/austin/polygons/huge_austin.poly
dc9a8a05f8f2e508af7a9841866f8cd3 data/input/austin/polygons/downtown_atx.poly
7dbf9830b6a37f6e58d3effc54363de7 data/input/screenshots/montlake/02x05_i124.png 7dbf9830b6a37f6e58d3effc54363de7 data/input/screenshots/montlake/02x05_i124.png
244fe61defcf394590775582ef438f17 data/input/screenshots/montlake/01x06_i26.png 244fe61defcf394590775582ef438f17 data/input/screenshots/montlake/01x06_i26.png
e6e912d845568358261fd74576b57f87 data/input/screenshots/montlake/01x01_i19.png e6e912d845568358261fd74576b57f87 data/input/screenshots/montlake/01x01_i19.png
@ -136,20 +150,6 @@ ce30a66567ab09cb1c36d731c15cd5e1 data/input/screenshots/montlake/01x02_i20.png
9eb0005ac206fba788042e655cfbe300 data/input/screenshots/montlake/03x05_i2.png 9eb0005ac206fba788042e655cfbe300 data/input/screenshots/montlake/03x05_i2.png
d12a9d72fcbf32cb75d2820a78fa5e22 data/input/screenshots/montlake/02x06_i85.png d12a9d72fcbf32cb75d2820a78fa5e22 data/input/screenshots/montlake/02x06_i85.png
a7fec0718264a554de0fc282f9737ea0 data/input/screenshots/montlake/01x05_i40.png a7fec0718264a554de0fc282f9737ea0 data/input/screenshots/montlake/01x05_i40.png
129b460f56f5eb41cab3bfd70fb5fde9 data/input/sidewalks.bin
0db4e23e51f7680538b0bbbc72208e07 data/input/N47W122.hgt
51dbf7a263fe5f0ea24e43c3aad3fec2 data/input/google_transit/stop_times.txt
308c4e4ab385b7e8c1a1f75c4dc96e3f data/input/google_transit/routes.txt
9d3deb093076d7eaf748114829802292 data/input/google_transit/calendar_dates.txt
1800e4da804a8d9809d8b636742b9d00 data/input/google_transit/fare_rules.txt
9502d1a6e03a21c7e6987c036d5aea6f data/input/google_transit/block_trip.txt
b66cb4c0a24b2d038427aa6e1aa1954a data/input/google_transit/block.txt
7211c370ecf3d8839ea0eb6651ed18e9 data/input/google_transit/calendar.txt
33f4f1264b3c982f0d6922ce7fb45e73 data/input/google_transit/shapes.txt
8a4fbb3846249777afae319d64e6241e data/input/google_transit/trips.txt
ca5a7569e1af41e0046fe5e8865cf733 data/input/google_transit/fare_attributes.txt
8610cdc491d036eee88c9b7ae24d692d data/input/google_transit/stops.txt
75f564fcc06b1950b7b33acf9d61f696 data/input/google_transit/agency.txt
e4d10fa4a66453b7097d906e4616e26b data/system/assets/meters/car.svg e4d10fa4a66453b7097d906e4616e26b data/system/assets/meters/car.svg
9d747979fdc362ac6df0af3c3bbffd15 data/system/assets/meters/bus.svg 9d747979fdc362ac6df0af3c3bbffd15 data/system/assets/meters/bus.svg
f7facfb678770c416e5529b2b2d066e5 data/system/assets/meters/pedestrian.svg f7facfb678770c416e5529b2b2d066e5 data/system/assets/meters/pedestrian.svg
@ -223,16 +223,16 @@ d02d0d103f7b00672a5f1145c5169d8c data/system/fonts/Overpass-Bold.ttf
2a13391023ce8787887331530cac35a7 data/system/fonts/BungeeInline-Regular.ttf 2a13391023ce8787887331530cac35a7 data/system/fonts/BungeeInline-Regular.ttf
17a1468e62195d0688a6f3bd12da2e92 data/system/fonts/Overpass-SemiBold.ttf 17a1468e62195d0688a6f3bd12da2e92 data/system/fonts/Overpass-SemiBold.ttf
259d4afad7edca07e727ef80f5bbce07 data/system/fonts/Bungee-Regular.ttf 259d4afad7edca07e727ef80f5bbce07 data/system/fonts/Bungee-Regular.ttf
42362e4328a20462a755ac10a5d97fa1 data/system/maps/huge_seattle.bin e4ef975bd5ca2a761f2af6aa79ddbfa7 data/system/maps/huge_seattle.bin
949a22e70d06e03bdee666e5784cdf19 data/system/maps/ballard.bin 2ce839572159c8819b17ca87502fd063 data/system/maps/ballard.bin
8b31c23a7f0b985894a39683159c7918 data/system/maps/downtown.bin 20c561149888a0732a3c2d5ccad41f5f data/system/maps/downtown.bin
1727e93afe6d1ddc07b5f6ed008658be data/system/maps/caphill.bin a088ac86bd2fbbde9d0be53535f44670 data/system/maps/caphill.bin
35e398d0dce3e4ade875c91245f88423 data/system/maps/lakeslice.bin 1851f79a44f0ccde301a3f16edfaa852 data/system/maps/lakeslice.bin
f258d23f81e16c5d884972853fcbb376 data/system/maps/huge_austin.bin 4961886805fc8a5576a37cffc6adc9be data/system/maps/huge_austin.bin
38ef21a636e63ce54ba319834191c8fd data/system/maps/downtown_atx.bin 94d44bfd4c5e2431c7f8555943e70709 data/system/maps/downtown_atx.bin
f37497dbcca236b261b7205d8dd01aa4 data/system/maps/montlake.bin 29eca63f2c687160f78f7f8dbb85981f data/system/maps/montlake.bin
6aec1579e6e6125c559212ee17c1d79f data/system/maps/intl_district.bin 973a782a7d4dd1de4dc0cc7521ee9e1a data/system/maps/intl_district.bin
608b5d2eaaa094ef6a0f1de2f97b28ac data/system/maps/23rd.bin b8c50322ebcbd970c9eb40d7b177b477 data/system/maps/23rd.bin
cc45f42cb24cad1cfdbf5ed7a0cb86d4 data/system/synthetic_maps/signal_double.json cc45f42cb24cad1cfdbf5ed7a0cb86d4 data/system/synthetic_maps/signal_double.json
8b949cc34d9a27ace0bd8ecde55a9520 data/system/synthetic_maps/signal_single.json 8b949cc34d9a27ace0bd8ecde55a9520 data/system/synthetic_maps/signal_single.json
1cd7be125e1d992613ed3a41e8b25b6a data/system/synthetic_maps/signal_fan_in.json 1cd7be125e1d992613ed3a41e8b25b6a data/system/synthetic_maps/signal_fan_in.json

View File

@ -119,17 +119,17 @@ code. This is a nice, hefty starter project to understand how everything works.
For now, this is just an initial list of considerations -- I haven't designed or For now, this is just an initial list of considerations -- I haven't designed or
implemented this yet. implemented this yet.
Poking around the .osm extracts in `data/input/osm/`, you'll see a promising Poking around the .osm extracts in `data/input/seattle/osm/`, you'll see a
relation with `route = light_rail`. The relation points to individual points promising relation with `route = light_rail`. The relation points to individual
(nodes) as stops, and segments of the track (ways). These need to be represented points (nodes) as stops, and segments of the track (ways). These need to be
in the initial version of the map, `RawMap`, and the final version, `Map`. represented in the initial version of the map, `RawMap`, and the final version,
Stations probably coincide with existing buildings, and tracks could probably be `Map`. Stations probably coincide with existing buildings, and tracks could
modeled as a special type of road. To remember the order of stations and group probably be modeled as a special type of road. To remember the order of stations
everything, there's already a notion of bus route from the `gtfs` crate that and group everything, there's already a notion of bus route from the `gtfs`
probably works. The `convert_osm` crate is the place to extract this new data crate that probably works. The `convert_osm` crate is the place to extract this
from OSM. It might be worth thinking about how the light rail line gets clipped, new data from OSM. It might be worth thinking about how the light rail line gets
since most maps won't include all of the stations -- should those maps just clipped, since most maps won't include all of the stations -- should those maps
terminate trains at the stations, or should trains go to and from the map just terminate trains at the stations, or should trains go to and from the map
border? border?
Then there are some rendering questions. How should special buildings that act Then there are some rendering questions. How should special buildings that act

View File

@ -205,6 +205,7 @@ fn pick_neighborhood(map: &Map, mut wizard: WrappedWizard) -> Option<Neighborhoo
} else { } else {
let name = wizard.input_string("Name the neighborhood")?; let name = wizard.input_string("Name the neighborhood")?;
Some(NeighborhoodBuilder { Some(NeighborhoodBuilder {
city_name: map.get_city_name().to_string(),
name, name,
map_name: map.get_name().to_string(), map_name: map.get_name().to_string(),
points: Vec::new(), points: Vec::new(),
@ -220,7 +221,7 @@ fn load_neighborhood_builder(
wizard wizard
.choose(query, || { .choose(query, || {
Choice::from(abstutil::load_all_objects( Choice::from(abstutil::load_all_objects(
abstutil::path_all_neighborhoods(&map.get_name()), abstutil::path_all_neighborhoods(map.get_city_name(), map.get_name()),
)) ))
}) })
.map(|(_, n)| n) .map(|(_, n)| n)

View File

@ -2,7 +2,7 @@ use crate::utils::{download, osmconvert, rm};
fn input() { fn input() {
download( download(
"../data/input/osm/Austin.osm", "../data/input/austin/osm/Austin.osm",
"https://download.bbbike.org/osm/bbbike/Austin/Austin.osm.gz", "https://download.bbbike.org/osm/bbbike/Austin/Austin.osm.gz",
); );
} }
@ -10,18 +10,21 @@ fn input() {
pub fn osm_to_raw(name: &str) { pub fn osm_to_raw(name: &str) {
input(); input();
osmconvert( osmconvert(
"../data/input/osm/Austin.osm", "../data/input/austin/osm/Austin.osm",
format!("../data/input/polygons/{}.poly", name), format!("../data/input/austin/polygons/{}.poly", name),
format!("../data/input/osm/{}.osm", name), format!("../data/input/austin/osm/{}.osm", name),
); );
rm(format!("../data/input/neighborhoods/{}", name));
rm(format!("../data/system/maps/{}.bin", name)); rm(format!("../data/system/maps/{}.bin", name));
println!("- Running convert_osm"); println!("- Running convert_osm");
let output = format!("../data/input/raw_maps/{}.bin", name); let output = format!("../data/input/raw_maps/{}.bin", name);
let map = convert_osm::convert( let map = convert_osm::convert(
convert_osm::Options { convert_osm::Options {
osm: format!("../data/input/osm/{}.osm", name), osm_input: format!("../data/input/austin/osm/{}.osm", name),
output: output.clone(),
city_name: "austin".to_string(),
name: name.to_string(),
parking_shapes: None, parking_shapes: None,
public_offstreet_parking: None, public_offstreet_parking: None,
private_offstreet_parking: convert_osm::PrivateOffstreetParking::OnePerBldg, private_offstreet_parking: convert_osm::PrivateOffstreetParking::OnePerBldg,
@ -29,9 +32,8 @@ pub fn osm_to_raw(name: &str) {
gtfs: None, gtfs: None,
neighborhoods: None, neighborhoods: None,
elevation: None, elevation: None,
clip: Some(format!("../data/input/polygons/{}.poly", name)), clip: Some(format!("../data/input/austin/polygons/{}.poly", name)),
drive_on_right: true, drive_on_right: true,
output: output.clone(),
}, },
&mut abstutil::Timer::throwaway(), &mut abstutil::Timer::throwaway(),
); );

View File

@ -30,7 +30,7 @@ fn main() {
// By default, use geometry fixes from map_editor. // By default, use geometry fixes from map_editor.
use_fixes: !args.enabled("--nofixes"), use_fixes: !args.enabled("--nofixes"),
// Only process one map. If not specified, process all maps defined by clipping polygons in // Only process one map. If not specified, process all maps defined by clipping polygons in
// data/input/polygons/. // data/input/$city/polygons/.
only_map: args.optional_free(), only_map: args.optional_free(),
}; };
args.done(); args.done();
@ -46,7 +46,7 @@ fn main() {
vec![n] vec![n]
} else { } else {
println!("- Working on all {} maps", job.city); println!("- Working on all {} maps", job.city);
abstutil::list_all_objects("../data/input/polygons".to_string()) abstutil::list_all_objects(format!("../data/input/{}/polygons", job.city))
}; };
for name in names { for name in names {

View File

@ -2,65 +2,70 @@ use crate::utils::{download, osmconvert, rm};
fn input() { fn input() {
download( download(
"../data/input/google_transit/", "../data/input/seattle/google_transit/",
"https://metro.kingcounty.gov/GTFS/google_transit.zip", "https://metro.kingcounty.gov/GTFS/google_transit.zip",
); );
// Like https://data.seattle.gov/dataset/Neighborhoods/2mbt-aqqx, but in GeoJSON, not SHP // Like https://data.seattle.gov/dataset/Neighborhoods/2mbt-aqqx, but in GeoJSON, not SHP
download("../data/input/neighborhoods.geojson", "https://github.com/seattleio/seattle-boundaries-data/raw/master/data/neighborhoods.geojson"); download("../data/input/seattle/neighborhoods.geojson", "https://github.com/seattleio/seattle-boundaries-data/raw/master/data/neighborhoods.geojson");
download( download(
"../data/input/N47W122.hgt", "../data/input/seattle/N47W122.hgt",
"https://dds.cr.usgs.gov/srtm/version2_1/SRTM1/Region_01/N47W122.hgt.zip", "https://dds.cr.usgs.gov/srtm/version2_1/SRTM1/Region_01/N47W122.hgt.zip",
); );
download( download(
"../data/input/osm/Seattle.osm", "../data/input/seattle/osm/Seattle.osm",
"http://download.bbbike.org/osm/bbbike/Seattle/Seattle.osm.gz", "http://download.bbbike.org/osm/bbbike/Seattle/Seattle.osm.gz",
); );
// Soundcast data comes from https://github.com/psrc/soundcast/releases // Soundcast data comes from https://github.com/psrc/soundcast/releases
download( download(
"../data/input/parcels_urbansim.txt", "../data/input/seattle/parcels_urbansim.txt",
"https://www.dropbox.com/s/t9oug9lwhdwfc04/psrc_2014.zip?dl=0", "https://www.dropbox.com/s/t9oug9lwhdwfc04/psrc_2014.zip?dl=0",
); );
// From http://data-seattlecitygis.opendata.arcgis.com/datasets/blockface // From http://data-seattlecitygis.opendata.arcgis.com/datasets/blockface
download( download(
"../data/input/blockface.bin", "../data/input/seattle/blockface.bin",
"https://opendata.arcgis.com/datasets/a1458ad1abca41869b81f7c0db0cd777_0.kml", "https://opendata.arcgis.com/datasets/a1458ad1abca41869b81f7c0db0cd777_0.kml",
); );
// From https://data-seattlecitygis.opendata.arcgis.com/datasets/sidewalks // From https://data-seattlecitygis.opendata.arcgis.com/datasets/sidewalks
download( download(
"../data/input/sidewalks.bin", "../data/input/seattle/sidewalks.bin",
"https://opendata.arcgis.com/datasets/ee6d0642d2a04e35892d0eab77d971d6_2.kml", "https://opendata.arcgis.com/datasets/ee6d0642d2a04e35892d0eab77d971d6_2.kml",
); );
// From https://data.seattle.gov/Transportation/Public-Garages-or-Parking-Lots/xefx-khzm // From https://data.seattle.gov/Transportation/Public-Garages-or-Parking-Lots/xefx-khzm
download("../data/input/offstreet_parking.bin", "http://data-seattlecitygis.opendata.arcgis.com/datasets/8e52dfde6d5d45948f7a90654c8d50cd_0.kml"); download("../data/input/seattle/offstreet_parking.bin", "http://data-seattlecitygis.opendata.arcgis.com/datasets/8e52dfde6d5d45948f7a90654c8d50cd_0.kml");
} }
pub fn osm_to_raw(name: &str) { pub fn osm_to_raw(name: &str) {
input(); input();
osmconvert( osmconvert(
"../data/input/osm/Seattle.osm", "../data/input/seattle/osm/Seattle.osm",
format!("../data/input/polygons/{}.poly", name), format!("../data/input/seattle/polygons/{}.poly", name),
format!("../data/input/osm/{}.osm", name), format!("../data/input/seattle/osm/{}.osm", name),
); );
rm(format!("../data/input/neighborhoods/{}", name)); rm(format!("../data/input/seattle/neighborhoods/{}", name));
rm(format!("../data/system/maps/{}.bin", name)); rm(format!("../data/system/maps/{}.bin", name));
println!("- Running convert_osm"); println!("- Running convert_osm");
let output = format!("../data/input/raw_maps/{}.bin", name); let output = format!("../data/input/raw_maps/{}.bin", name);
let map = convert_osm::convert( let map = convert_osm::convert(
convert_osm::Options { convert_osm::Options {
osm: format!("../data/input/osm/{}.osm", name), osm_input: format!("../data/input/seattle/osm/{}.osm", name),
parking_shapes: Some("../data/input/blockface.bin".to_string()), output: output.clone(),
public_offstreet_parking: Some("../data/input/offstreet_parking.bin".to_string()), city_name: "seattle".to_string(),
name: name.to_string(),
parking_shapes: Some("../data/input/seattle/blockface.bin".to_string()),
public_offstreet_parking: Some(
"../data/input/seattle/offstreet_parking.bin".to_string(),
),
private_offstreet_parking: convert_osm::PrivateOffstreetParking::OnePerBldg, private_offstreet_parking: convert_osm::PrivateOffstreetParking::OnePerBldg,
// TODO These're buggy. // TODO These're buggy.
sidewalks: None, sidewalks: None,
gtfs: Some("../data/input/google_transit".to_string()), gtfs: Some("../data/input/seattle/google_transit".to_string()),
neighborhoods: Some("../data/input/neighborhoods.geojson".to_string()), neighborhoods: Some("../data/input/seattle/neighborhoods.geojson".to_string()),
elevation: Some("../data/input/N47W122.hgt".to_string()), elevation: Some("../data/input/seattle/N47W122.hgt".to_string()),
clip: Some(format!("../data/input/polygons/{}.poly", name)), clip: Some(format!("../data/input/seattle/polygons/{}.poly", name)),
drive_on_right: true, drive_on_right: true,
output: output.clone(),
}, },
&mut abstutil::Timer::throwaway(), &mut abstutil::Timer::throwaway(),
); );

View File

@ -17,8 +17,8 @@ pub struct PopDat {
pub fn import_data() { pub fn import_data() {
let mut timer = abstutil::Timer::new("creating popdat"); let mut timer = abstutil::Timer::new("creating popdat");
let (trips, parcels) = import_trips( let (trips, parcels) = import_trips(
"../data/input/parcels_urbansim.txt", "../data/input/seattle/parcels_urbansim.txt",
"../data/input/trips_2014.csv", "../data/input/seattle/trips_2014.csv",
&mut timer, &mut timer,
) )
.unwrap(); .unwrap();

View File

@ -130,7 +130,7 @@ impl Model {
pub fn save_fixes(&mut self) { pub fn save_fixes(&mut self) {
abstutil::write_json( abstutil::write_json(
abstutil::path_fixes(&self.map.name), abstutil::path_fixes(&self.map.city, &self.map.name),
&self &self
.map .map
.generate_fixes(&mut Timer::new("calculate MapFixes")), .generate_fixes(&mut Timer::new("calculate MapFixes")),

View File

@ -12,7 +12,6 @@ pub struct InitialMap {
pub roads: BTreeMap<OriginalRoad, Road>, pub roads: BTreeMap<OriginalRoad, Road>,
pub intersections: BTreeMap<OriginalIntersection, Intersection>, pub intersections: BTreeMap<OriginalIntersection, Intersection>,
pub name: String,
pub bounds: Bounds, pub bounds: Bounds,
} }
@ -70,11 +69,10 @@ pub struct Intersection {
} }
impl InitialMap { impl InitialMap {
pub fn new(name: String, raw: &RawMap, bounds: &Bounds, timer: &mut Timer) -> InitialMap { pub fn new(raw: &RawMap, bounds: &Bounds, timer: &mut Timer) -> InitialMap {
let mut m = InitialMap { let mut m = InitialMap {
roads: BTreeMap::new(), roads: BTreeMap::new(),
intersections: BTreeMap::new(), intersections: BTreeMap::new(),
name,
bounds: bounds.clone(), bounds: bounds.clone(),
}; };

View File

@ -45,6 +45,7 @@ pub struct Map {
pathfinder: Option<Pathfinder>, pathfinder: Option<Pathfinder>,
pathfinder_dirty: bool, pathfinder_dirty: bool,
city_name: String,
name: String, name: String,
edits: MapEdits, edits: MapEdits,
} }
@ -103,6 +104,7 @@ impl Map {
turn_lookup: Vec::new(), turn_lookup: Vec::new(),
pathfinder: None, pathfinder: None,
pathfinder_dirty: false, pathfinder_dirty: false,
city_name: "blank city".to_string(),
name: "blank".to_string(), name: "blank".to_string(),
edits: MapEdits::new("blank"), edits: MapEdits::new("blank"),
} }
@ -112,7 +114,7 @@ impl Map {
timer.start("raw_map to InitialMap"); timer.start("raw_map to InitialMap");
let gps_bounds = raw.gps_bounds.clone(); let gps_bounds = raw.gps_bounds.clone();
let bounds = gps_bounds.to_bounds(); let bounds = gps_bounds.to_bounds();
let initial_map = make::initial::InitialMap::new(raw.name.clone(), &raw, &bounds, timer); let initial_map = make::initial::InitialMap::new(&raw, &bounds, timer);
timer.stop("raw_map to InitialMap"); timer.stop("raw_map to InitialMap");
timer.start("InitialMap to half of Map"); timer.start("InitialMap to half of Map");
@ -431,6 +433,10 @@ impl Map {
&self.bounds &self.bounds
} }
pub fn get_city_name(&self) -> &String {
&self.city_name
}
pub fn get_name(&self) -> &String { pub fn get_name(&self) -> &String {
&self.name &self.name
} }
@ -830,6 +836,7 @@ fn make_half_map(
turn_lookup: Vec::new(), turn_lookup: Vec::new(),
pathfinder: None, pathfinder: None,
pathfinder_dirty: false, pathfinder_dirty: false,
city_name: raw.city_name.clone(),
name: raw.name.clone(), name: raw.name.clone(),
edits: MapEdits::new(&raw.name), edits: MapEdits::new(&raw.name),
}; };

View File

@ -10,6 +10,7 @@ use std::io::{Error, Write};
// more compatible with slight changes to the bounding box of a map over time. // more compatible with slight changes to the bounding box of a map over time.
#[derive(Clone, Serialize, Deserialize, Debug)] #[derive(Clone, Serialize, Deserialize, Debug)]
pub struct NeighborhoodBuilder { pub struct NeighborhoodBuilder {
pub city_name: String,
pub map_name: String, pub map_name: String,
pub name: String, pub name: String,
pub points: Vec<LonLat>, pub points: Vec<LonLat>,
@ -19,6 +20,7 @@ impl NeighborhoodBuilder {
pub fn finalize(&self, gps_bounds: &GPSBounds) -> Neighborhood { pub fn finalize(&self, gps_bounds: &GPSBounds) -> Neighborhood {
assert!(self.points.len() >= 3); assert!(self.points.len() >= 3);
Neighborhood { Neighborhood {
city_name: self.city_name.clone(),
map_name: self.map_name.clone(), map_name: self.map_name.clone(),
name: self.name.clone(), name: self.name.clone(),
polygon: Polygon::new( polygon: Polygon::new(
@ -36,14 +38,14 @@ impl NeighborhoodBuilder {
pub fn save(&self) { pub fn save(&self) {
abstutil::write_json( abstutil::write_json(
abstutil::path_neighborhood(&self.map_name, &self.name), abstutil::path_neighborhood(&self.city_name, &self.map_name, &self.name),
self, self,
); );
} }
// https://wiki.openstreetmap.org/wiki/Osmosis/Polygon_Filter_File_Format // https://wiki.openstreetmap.org/wiki/Osmosis/Polygon_Filter_File_Format
pub fn save_as_osmosis(&self) -> Result<(), Error> { pub fn save_as_osmosis(&self) -> Result<(), Error> {
let path = abstutil::path_polygon(&self.name); let path = abstutil::path_polygon(&self.city_name, &self.name);
let mut f = File::create(&path)?; let mut f = File::create(&path)?;
writeln!(f, "{}", self.name)?; writeln!(f, "{}", self.name)?;
@ -65,15 +67,20 @@ impl NeighborhoodBuilder {
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
pub struct Neighborhood { pub struct Neighborhood {
pub city_name: String,
pub map_name: String, pub map_name: String,
pub name: String, pub name: String,
pub polygon: Polygon, pub polygon: Polygon,
} }
impl Neighborhood { impl Neighborhood {
pub fn load_all(map_name: &str, gps_bounds: &GPSBounds) -> Vec<(String, Neighborhood)> { pub fn load_all(
city_name: &str,
map_name: &str,
gps_bounds: &GPSBounds,
) -> Vec<(String, Neighborhood)> {
abstutil::load_all_objects::<NeighborhoodBuilder>(abstutil::path_all_neighborhoods( abstutil::load_all_objects::<NeighborhoodBuilder>(abstutil::path_all_neighborhoods(
map_name, city_name, map_name,
)) ))
.into_iter() .into_iter()
.map(|(name, builder)| (name, builder.finalize(gps_bounds))) .map(|(name, builder)| (name, builder.finalize(gps_bounds)))
@ -82,6 +89,7 @@ impl Neighborhood {
fn make_everywhere(map: &Map) -> Neighborhood { fn make_everywhere(map: &Map) -> Neighborhood {
Neighborhood { Neighborhood {
city_name: map.get_city_name().to_string(),
map_name: map.get_name().to_string(), map_name: map.get_name().to_string(),
name: "_everywhere_".to_string(), name: "_everywhere_".to_string(),
polygon: map.get_bounds().get_rectangle(), polygon: map.get_bounds().get_rectangle(),
@ -97,7 +105,8 @@ pub struct FullNeighborhoodInfo {
impl FullNeighborhoodInfo { impl FullNeighborhoodInfo {
pub fn load_all(map: &Map) -> HashMap<String, FullNeighborhoodInfo> { pub fn load_all(map: &Map) -> HashMap<String, FullNeighborhoodInfo> {
let mut neighborhoods = Neighborhood::load_all(map.get_name(), map.get_gps_bounds()); let mut neighborhoods =
Neighborhood::load_all(map.get_city_name(), map.get_name(), map.get_gps_bounds());
neighborhoods.push(( neighborhoods.push((
"_everywhere_".to_string(), "_everywhere_".to_string(),
Neighborhood::make_everywhere(map), Neighborhood::make_everywhere(map),

View File

@ -9,6 +9,7 @@ use std::fmt;
#[derive(Debug, Serialize, Deserialize)] #[derive(Debug, Serialize, Deserialize)]
pub struct RawMap { pub struct RawMap {
pub city_name: String,
pub name: String, pub name: String,
#[serde( #[serde(
serialize_with = "serialize_btreemap", serialize_with = "serialize_btreemap",
@ -87,9 +88,10 @@ impl fmt::Display for OriginalBuilding {
} }
impl RawMap { impl RawMap {
pub fn blank(name: String) -> RawMap { pub fn blank(city_name: &str, name: &str) -> RawMap {
RawMap { RawMap {
name, city_name: city_name.to_string(),
name: name.to_string(),
roads: BTreeMap::new(), roads: BTreeMap::new(),
intersections: BTreeMap::new(), intersections: BTreeMap::new(),
buildings: BTreeMap::new(), buildings: BTreeMap::new(),
@ -103,17 +105,24 @@ impl RawMap {
} }
pub fn apply_all_fixes(&mut self, timer: &mut Timer) { pub fn apply_all_fixes(&mut self, timer: &mut Timer) {
// TODO Seattle-specific right now
if self.city_name != "seattle" {
return;
}
if self.name == "huge_seattle" { if self.name == "huge_seattle" {
let master_fixes: MapFixes = let master_fixes: MapFixes = abstutil::maybe_read_json(
abstutil::maybe_read_json(abstutil::path_fixes("huge_seattle"), timer) abstutil::path_fixes(&self.city_name, "huge_seattle"),
timer,
)
.unwrap_or_else(|_| MapFixes::new(self.gps_bounds.clone())); .unwrap_or_else(|_| MapFixes::new(self.gps_bounds.clone()));
self.apply_fixes("huge_seattle", &master_fixes, timer); self.apply_fixes("huge_seattle", &master_fixes, timer);
} else { } else {
let mut master_fixes: MapFixes = let mut master_fixes: MapFixes =
abstutil::read_json(abstutil::path_fixes("huge_seattle"), timer); abstutil::read_json(abstutil::path_fixes(&self.city_name, "huge_seattle"), timer);
master_fixes.remap_pts(&self.gps_bounds); master_fixes.remap_pts(&self.gps_bounds);
let local_fixes: MapFixes = let local_fixes: MapFixes =
abstutil::maybe_read_json(abstutil::path_fixes(&self.name), timer) abstutil::maybe_read_json(abstutil::path_fixes(&self.city_name, &self.name), timer)
.unwrap_or_else(|_| MapFixes::new(self.gps_bounds.clone())); .unwrap_or_else(|_| MapFixes::new(self.gps_bounds.clone()));
self.apply_fixes("huge_seattle", &master_fixes, timer); self.apply_fixes("huge_seattle", &master_fixes, timer);
self.apply_fixes(&self.name.clone(), &local_fixes, timer); self.apply_fixes(&self.name.clone(), &local_fixes, timer);
@ -189,6 +198,8 @@ impl RawMap {
// TODO Ignores buildings right now. // TODO Ignores buildings right now.
pub fn generate_fixes(&self, timer: &mut Timer) -> MapFixes { pub fn generate_fixes(&self, timer: &mut Timer) -> MapFixes {
// TODO Need to generalize this a bit
assert_eq!(self.city_name, "seattle");
let orig: RawMap = abstutil::read_binary(abstutil::path_raw_map(&self.name), timer); let orig: RawMap = abstutil::read_binary(abstutil::path_raw_map(&self.name), timer);
let mut fixes = MapFixes::new(self.gps_bounds.clone()); let mut fixes = MapFixes::new(self.gps_bounds.clone());
@ -229,7 +240,7 @@ impl RawMap {
if self.name != "huge_seattle" { if self.name != "huge_seattle" {
// Filter out things that we just inherited from the master fixes. // Filter out things that we just inherited from the master fixes.
let mut master_fixes: MapFixes = let mut master_fixes: MapFixes =
abstutil::read_json(abstutil::path_fixes("huge_seattle"), timer); abstutil::read_json(abstutil::path_fixes(&self.city_name, "huge_seattle"), timer);
master_fixes.remap_pts(&self.gps_bounds); master_fixes.remap_pts(&self.gps_bounds);
fixes.delete_roads = fixes fixes.delete_roads = fixes