1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
use std::collections::BTreeMap;
use serde::{Deserialize, Serialize};
use street_network::{osm, StreetNetwork};
use abstio::{CityName, MapName};
use abstutil::{deserialize_btreemap, serialize_btreemap, Tags};
use geom::{PolyLine, Polygon, Pt2D};
pub use self::types::{Amenity, AmenityType, AreaType};
mod types;
#[derive(Debug, Serialize, Deserialize)]
pub struct RawMap {
pub name: MapName,
pub streets: StreetNetwork,
#[serde(
serialize_with = "serialize_btreemap",
deserialize_with = "deserialize_btreemap"
)]
pub buildings: BTreeMap<osm::OsmID, RawBuilding>,
pub areas: Vec<RawArea>,
pub parking_lots: Vec<RawParkingLot>,
pub parking_aisles: Vec<(osm::WayID, Vec<Pt2D>)>,
pub transit_routes: Vec<RawTransitRoute>,
#[serde(
serialize_with = "serialize_btreemap",
deserialize_with = "deserialize_btreemap"
)]
pub transit_stops: BTreeMap<String, RawTransitStop>,
}
impl RawMap {
pub fn blank(name: MapName) -> RawMap {
RawMap {
name,
streets: StreetNetwork::blank(),
buildings: BTreeMap::new(),
areas: Vec::new(),
parking_lots: Vec::new(),
parking_aisles: Vec::new(),
transit_routes: Vec::new(),
transit_stops: BTreeMap::new(),
}
}
pub fn new_osm_way_id(&self, start: i64) -> osm::WayID {
assert!(start < 0);
let mut osm_way_id = start;
loop {
let candidate = osm::WayID(osm_way_id);
if self
.streets
.roads
.keys()
.any(|r| r.osm_way_id.0 == osm_way_id)
|| self
.buildings
.keys()
.any(|b| b == &osm::OsmID::Way(candidate))
{
osm_way_id -= 1;
} else {
return candidate;
}
}
}
pub fn save(&self) {
abstio::write_binary(abstio::path_raw_map(&self.name), self)
}
pub fn get_city_name(&self) -> &CityName {
&self.name.city
}
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct RawBuilding {
pub polygon: Polygon,
pub osm_tags: Tags,
pub public_garage_name: Option<String>,
pub num_parking_spots: usize,
pub amenities: Vec<Amenity>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct RawArea {
pub area_type: AreaType,
pub polygon: Polygon,
pub osm_tags: Tags,
pub osm_id: osm::OsmID,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct RawParkingLot {
pub osm_id: osm::OsmID,
pub polygon: Polygon,
pub osm_tags: Tags,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct RawTransitRoute {
pub long_name: String,
pub short_name: String,
pub gtfs_id: String,
pub shape: PolyLine,
pub stops: Vec<String>,
pub route_type: RawTransitType,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub enum RawTransitType {
Bus,
Train,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct RawTransitStop {
pub gtfs_id: String,
pub position: Pt2D,
pub name: String,
}