“Snap To Road” in iOS 6 breaks accurate GPS recording

A lot has been written about the quality of Apple’s iOS 6 Maps data. As it turns, there is another side to the story. It was not noticed before, possibly because it only affects people who want to accurately record a GPS track of their outdoor activities. Here is how I learned about this problem:

When my new iPhone 5 arrived, I was excited. Finally I was able to use my new Bluetooth heart rate strap while cycling. (I had an iPhone 4 before, which doesn’t support Bluetooth smart accessories.)

I was hoping for a more accurate track recording of my bike rides, too, because alongside GPS the iPhone 5 also supports the Russian GLONASS geo-positioning system (as did the iPhone 4S ). My old iPhone’s GPS recordings occasionally become inaccurate, especially when riding through forests. The more satellite signals coming in, the better.

I was in for an unpleasant surprise.

I usually track my rides with the popular Strava iPhone app. What sets Strava apart from other GPS tracking apps, is that it lets you mark arbitrary sections of your rides or runs as ‘segments’.
Whenever you run or ride through any of these ‘segments’, the time it takes you to finish is compared against other Strava users, who also completed this segment. This is an really easy way to see how your performance improves over time and how you compare against other cyclists or runners.
However, there is a catch: If your recorded GPS track doesn’t follow the pre-recorded segment closely, Strava won’t recognize your effort. All your suffering has been in vain.

Once I returned home from my ride I was disappointed. Strava hadn’t picked up one particular segment, where I went pretty fast, hoping to improve my personal record. Sometimes this happens when the GPS reception is bad. But since I had placed high hopes in the iPhone 5’s supposedly improved GPS reception, I decided to take a closer look.

The quality of GPS tracking in general was pretty good. In comparison to the iPhone 4, the recording followed my actual route much closer. Here’s a comparison of the same route, recorded with the iPhone 4 on iOS 5 and the iPhone 5 on iOS 6.

A track recorded with an iPhone 4 on iOS 5.

A track recorded with an iPhone 5 on iOS 6.

I also noticed that iOS 6 doesn’t know about Berlin’s popular Mauerradweg bike street, a 160km long route following the perimeter of the former Berlin Wall. Cars are prohibited on this route and it’s therefore used by joggers, skaters, and cyclists like me. I often use the ‘Mauerradweg’ for cycling, because it’s a quick and safe way to get from Berlin’s center to its outskirts.

The Strava segment for with I was hoping to improve my time is on the ‘Mauerradweg’ bike street. While following my recorded route further I noticed something odd. Once I reached a certain speed threshold, the recorded GPS track jumped about 50 feet onto a highway that runs in parallel to the bike street. This jumping is probably the reason Strava didn’t take my time into account. My recorded track simply doesn’t match Strava’s reference track close enough for my time to make it into the segment’s leader board.

A screenshot of the Strava app on iOS 6. I was going on a bike street unknown to iOS 6 (gray, dotted line). Once I go a little faster, my GPS location jumps onto the nearby highway.

Here is what I think happens: Unlike it predecessors iOS 6 has direct access to map data. Once iOS detects you are going faster than a certain threshold (in my testing around 20 mph), it will correlate your GPS data with the location of a nearby street running in parallel to your actual track. I presume this was implemented to improve the turn-by-turn navigation experience for car drivers, in case where the received GPS signal is slightly off.

In theory, this might be a good optimization. However, when used in combination with the map data on iOS 6, it makes accurate GPS recordings impossible in areas where street data is less than perfect (probably everywhere outside San Francisco, especially when it comes to bike-only streets not covered by whatever car-only data provider Apple acquired its data from).

On iOS 6 perfectly good GPS recording is turned invalid, just because iOS 6 doesn’t know the street you are traveling on. While this might not effect the majority of users, it ruins the experience for users of the Strava iPhone app and similar apps.

I contacted Strava about this issue, and this is what Elle from Strava told me:

Thank you for sending along this very helpful info! Indeed, we are already aware of this problem, but unfortunately the Apple OS does not allow us to choose whether we have this “snap to road” feature or not. All location data is bundled into one source, called “Location Services” and it is not possible to distinguish the factors that go into this location data.

We are in contact with Apple about this, and hopefully some progress can be made there!

Hopefully Apple implements an API for GPS recording apps to opt out of this optimization and puts the fun back into Strava for me and other users. Apple’s intentions with this optimization are probably good, but considering the current state of the iOS 6 map data, they actually worsen the results for people like me.

Update (Nov 5, 2012): I filled a bug with Apple about this. I posted my bug report here. If you are hit by the same bug, please duplicate it with Apple’s bug reporter.

2nd Update (Nov 5, 2012): I was contacted by the developer of another GSP related fitness app. He suggest that Strava simply forgets to set CLActivityType on iOS 6 to CLActivityTypeFitness. Without a correct type being set, Apple guesses and assumes an automotive activity beyond a certain speed threshold.
If true, that would be a pretty embarrassing oversight on Strava’s part.

3rd Update (Sept 12, 2014): So it’s been almost two years since the original post, and the bug is still in Strava. Pretty unbelievable. 😦

My workaround is to use the Wahoo Fitness app for ride recording and then use the built-in export to Strava feature.


12 thoughts on ““Snap To Road” in iOS 6 breaks accurate GPS recording

  1. Russ Berkowitz says:

    I’ve got the same exact problem here – I had originally posted on the Strava site and have been emailing back and forth with Elle. Have you told her about the CLActivityType on iOS 6 to CLActivityTypeFitness recommendation?

    • iiwas says:

      Hi Russ,

      my support incident was handled by Elle, too. I told her about CLActivityType and she said she’d pass it on the their dev time. So far, I haven’t heard back from her. 😦


  2. Remco says:

    Just posted bug report at Apple, see if it helps

  3. Guido says:

    My own app (Gpx2go!) appears to be affected by the same problem. I will try to set the activity type, possibly even make it the user’s choice, but according to Apple’s documentation (http://developer.apple.com/library/ios/documentation/CoreLocation/Reference/CLLocationManager_Class/CLLocationManager/CLLocationManager.html#//apple_ref/c/econst/CLActivityTypeAutomotiveNavigation), this only controls under what circumstances tracking is automatically paused.

  4. Josh Straub says:

    Thank you for this great post. The GeoCaching.com app suffers this issue as well, but only about 5% of the time. Strangely.. I’m almost certain your CLActivityType is the solution.

    In your image when you said “Thanks Scott!” Did you mean fired iOS Maps manager, Scott Forstall?

  5. joshstraub says:

    Thank you for this great post. The GeoCaching.com app suffers this issue as well, but only about 5% of the time. Strangely.. I’m almost certain your CLActivityType is the solution.

    In your image when you said “Thanks Scott!” Did you mean fired iOS Maps manager, Scott Forstall?

  6. SATs says:

    Thank you for your great article.
    I’m a cyclist suffering with the same problem in Japan, still now.

    This article made me very clear about the problem, and I tried your recommended app today.
    But the problem happened with the “Wahoo Fitness” too.
    Does this App still works fine in your iPhones?
    I’m using iPhone 5s with iOS 7.1.2.

    I would be happier, if I could found the nice apps that was free from this problem.

    Anyway, I was very disappointed, having examined my records back, I came to know that the problem started all the way back 2 years ago just when I bought iPhone 5.

    • jono4174 says:

      I have been using the Wahoo App since July 2014 and it snaps to road. It snaps to road worse than the Strava App using my monkey brain pattern recognition analysis (n=8 rides)

  7. Weston says:

    Yup, the problem still exists on Strava for iPhone. I’m the developer of another off-of-the-road GPS tracking app (motorsports, not cycling) and ran into the same problem a couple years ago when iOS 6 was released. The solution was a very quick and simple line of code: if running on iOS 6 or newer, then simply take your instance of CLLocationManager and set .activityType = CLActivityTypeFitness; Do that in the same chunk of code you use to set .desiredAccuracy, .distanceFilter, etc.

    That’s all I had to do to solve it in my app. This mode is meant for apps just like Strava, and in addition to not snapping the GPS to the road, it reacts well to sudden movements and speed changes, so I’m not sure why Strava hasn’t implemented this. This solution is a lot more well known today than it was two years ago when iOS 6 came out.

  8. Bjornar says:

    Thanks for sharing this! It answered a question I had after observing that many of my rides appear to “snap to roads” in general and frequently “snapping” to a nearby road (often a high-way) when cycling on a bike path alongside it. If sometimes causes weird patterns when the actual path taken involve crossing under/over roads and riding partly on a road and partly on a bike path nearby.

    I couldn’t find any reference to “snap to map” feature on the Strava pages. Strava states – probably correctly – that they do not modify the GPS data coming from a device other than smoothing the most obvious spikes. It’s unfortunate that they don’t inform the community that many popular devices actually use “snap to map” features. Luckily Google came up with your page when I searched.

    I ride some 5000 km a year around Oslo, Norway, logging rides with both iPhone and Garmin 310XT. My experience is that iOS6 feature – using map information – is OK for the vast majority of time for bike rides, because it helps align the ride more accurately to the road. But annoying at times. It can create “spikes” in speed too, when the logged ride path suddenly “snaps” back to another road after having “continued” a few seconds on the road iOS6 thought you were on.

    I slightly favor Garmin logs since they are free from “snap errors”. iPhone logs have the advantage of handling sharp turns on roads and generally keeping the ride on the road more accurately, since it takes advantage of the map information. But whether it has any practical benefits is questionable.

    By the way, I am unsure whether speed of the ride matters for the “snap to road” feature. I see snapping occurring also on slow speeds (less 15kph / 10mph).

    • iiwas says:

      By the way, I am unsure whether speed of the ride matters for the “snap to road” feature. I see snapping occurring also on slow speeds (less 15kph / 10mph).

      I don’t know. I never go that slow. 😉

      Just kidding. I have switched my recording to the Wahoo Fitness app, which records rides correctly and export from Strava from there.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: