Road graph of the map
| 164 | |
| 165 | @dataclass |
| 166 | class RoadGraph: |
| 167 | """ |
| 168 | Road graph of the map |
| 169 | """ |
| 170 | |
| 171 | edges: Dict[str, Edge] = field(default_factory=dict) |
| 172 | lanes: Dict[str, AbstractLane] = field(default_factory=dict) |
| 173 | junction_lanes: Dict[str, JunctionLane] = field(default_factory=dict) |
| 174 | |
| 175 | def get_lane_by_id(self, lane_id: str) -> AbstractLane: |
| 176 | if lane_id in self.lanes: |
| 177 | return self.lanes[lane_id] |
| 178 | elif lane_id in self.junction_lanes: |
| 179 | return self.junction_lanes[lane_id] |
| 180 | else: |
| 181 | logging.debug(f"cannot find lane {lane_id}") |
| 182 | return None |
| 183 | |
| 184 | def get_next_lane(self, lane_id: str) -> AbstractLane: |
| 185 | lane = self.get_lane_by_id(lane_id) |
| 186 | if isinstance(lane, NormalLane): |
| 187 | next_lanes = list(lane.next_lanes.values()) |
| 188 | if len(next_lanes) > 0: |
| 189 | # first_next_lane = list(lane.next_lanes.values())[0][0] |
| 190 | return self.get_lane_by_id(next_lanes[0][0]) |
| 191 | else: |
| 192 | return None |
| 193 | elif isinstance(lane, JunctionLane): |
| 194 | return self.get_lane_by_id(lane.next_lane_id) |
| 195 | return None |
| 196 | |
| 197 | def get_available_next_lane(self, lane_id: str, available_lanes: list[str]) -> AbstractLane: |
| 198 | lane = self.get_lane_by_id(lane_id) |
| 199 | if isinstance(lane, NormalLane): |
| 200 | for next_lane_i in lane.next_lanes.values(): |
| 201 | if next_lane_i[0] in available_lanes: |
| 202 | return self.get_lane_by_id(next_lane_i[0]) |
| 203 | elif isinstance(lane, JunctionLane): |
| 204 | if lane.next_lane_id in available_lanes: |
| 205 | return self.get_lane_by_id(lane.next_lane_id) |
| 206 | return None |
| 207 | |
| 208 | def __str__(self): |
| 209 | return 'edges: {}, \nlanes: {}, \njunctions lanes: {}'.format( |
| 210 | self.edges.keys(), self.lanes.keys(), |
| 211 | self.junction_lanes.keys() |
| 212 | ) |
| 213 | |
| 214 | |
| 215 | if __name__ == "__main__": |
no outgoing calls
no test coverage detected