But they also have airplane/flight specific identifiers like “flightNumber”, “flightId”, “noseId(?)” and “airSpeed”. Maybe vehicleId is part of a base class or primary key somewhere and that abstraction is leaking.
Presumably a train's groundSpeed and airSpeed are the same. If they diverge you have bigger problems than a JSON schema.
Is there a variant of this for ships? surfaceSpeed vs seaFloorSpeed?