We’re building a new subway/bus app at the MTA. Our system includes roughly 300 underground stations, around 150 elevated stations (i.e., above street level), and about 5 at-grade stations (i.e., at street level). We serve roughly 5 million riders a day.
We’re diving deep into Core Location on iOS and have found that the altitude values returned from two fields we’re testing aren’t accurate enough for our use case:
CLLocation.altitude
CMAbsoluteAltitudeData.altitude
We need to reliably distinguish whether a user is:
- At street level
- On an elevated platform (see attached picture)
- On any platform in an underground station — most have a single platform level, but some, like 59 St (see attached), have multiple platforms at different elevations.
These levels typically differ by at least 15 feet, which should in theory be well within the precision range of a properly calibrated barometric pressure sensor.
However, the absolute altitude values we’re seeing from these APIs are often inaccurate and inconsistent — not only compared to ground truth, but also across devices. For example, holding two phones side-by-side frequently yields altitude readings that differ by more than 15 feet. That level of variation makes the data unreliable for our needs.
Please see the below photos for more context.