Draw transit vehicles as trolleybuses, cable cars, funiculars, gondolas and monorails

The transit layer knew five modes, so a trolleybus drew as a bus, a
funicular as a train and a coach as a city bus. The GTFS basic route types
are now modes of their own (trolleybus, cable_tram, monorail, funicular,
aerial_lift), each with an icon, colour, detection tier, card word, voice
name, speed ceiling and fleet model.

A vehicle record may carry its route's GTFS route_type as routeType. It
settles the mode after the feed's fleet hint and before its route hint, and
picks the finer model (a coach for 200, a high-speed set for 101) when the
type is a kind of the vehicle's mode. Retained history classifies epochs
through transitModeFor too, so trails join the live vehicle.

Route hints from each operator's routes.txt: Prague's trolleybus lines
(51-59, 232, 275) and Petrin funicular, and the trams, trolleybuses and
metro lines of Bucharest, Cluj-Napoca and Turin. A feed may also name
route corrections that outrank the route type: Le Havre's routes.txt types
its funicular (8-FUNI) as a bus, so it is corrected to a funicular.
This commit is contained in:
Sameh Khamis committed 2026-11-14 12:03:12 -08:00
1 parent 250f0e20c3
commit 39c89d563b
32 files changed
+708 -61

No files matched your search

+20
View File
@@ -139,9 +139,14 @@ export const DETECTION_THEME_MAP = Object.freeze({
veh_free: '#00ff66',
veh_nodata: '#c9c9c9',
transit_bus: '#5EF08A',
transit_trolleybus: '#B6F04A',
transit_tram: '#FFC24A',
transit_cable_tram: '#FF8F4A',
transit_subway: '#FF4538',
transit_monorail: '#FF6FB8',
transit_rail: '#D9A6FF',
transit_funicular: '#E8C98A',
transit_aerial_lift: '#7FA8FF',
transit_ferry: '#5FD6FF',
transit_unknown: '#D8DDE5',
},
@@ -169,9 +174,14 @@ export const DETECTION_THEME_MAP = Object.freeze({
veh_free: '#45d8ff',
veh_nodata: '#dcdcdc',
transit_bus: '#5EF08A',
transit_trolleybus: '#B6F04A',
transit_tram: '#FFC24A',
transit_cable_tram: '#FF8F4A',
transit_subway: '#FF4538',
transit_monorail: '#FF6FB8',
transit_rail: '#D9A6FF',
transit_funicular: '#E8C98A',
transit_aerial_lift: '#7FA8FF',
transit_ferry: '#5FD6FF',
transit_unknown: '#D8DDE5',
},
@@ -199,9 +209,14 @@ export const DETECTION_THEME_MAP = Object.freeze({
veh_free: '#2ecc71',
veh_nodata: '#d8d8d8',
transit_bus: '#5EF08A',
transit_trolleybus: '#B6F04A',
transit_tram: '#FFC24A',
transit_cable_tram: '#FF8F4A',
transit_subway: '#FF4538',
transit_monorail: '#FF6FB8',
transit_rail: '#D9A6FF',
transit_funicular: '#E8C98A',
transit_aerial_lift: '#7FA8FF',
transit_ferry: '#5FD6FF',
transit_unknown: '#D8DDE5',
},
@@ -229,9 +244,14 @@ export const DETECTION_THEME_MAP = Object.freeze({
veh_free: '#2ecc71',
veh_nodata: '#c9c9c9',
transit_bus: '#5EF08A',
transit_trolleybus: '#B6F04A',
transit_tram: '#FFC24A',
transit_cable_tram: '#FF8F4A',
transit_subway: '#FF4538',
transit_monorail: '#FF6FB8',
transit_rail: '#D9A6FF',
transit_funicular: '#E8C98A',
transit_aerial_lift: '#7FA8FF',
transit_ferry: '#5FD6FF',
transit_unknown: '#D8DDE5',
},