Garmin Swim 2 - Watch GPS data is correct but distance reported by watch is wrong!

I have done a couple of long distance swims with my Garmin Swim 2 and am frustrated by the inaccuracy in recorded distance which is always about 20-25% short. This weekend I swam a 12km race but the watch reported that I had done 9900m!

I downloaded the .FIT file from the watch and wrote some Python code to check what was going on.

I extracted all the GPS data recorded on the route and was astonished to discover that when I calculate the sum of the distance of all the points it was almost perfectly accurate at 11.7km but when the accumulated distance covered according to the watch was only 9984m.

The problem is that when the watch syncs to Garmin Connect or to Strava or whatever, it is reporting the 9984m distance which is completely wrong and this then messes with other stats like pace/100m etc. 

It is extremely annoying since it is now clear that the watch GPS is functioning perfectly and this should be an easy fix.

Here is the code if anyone wants to check the same:

import fitparse
from geopy.distance import geodesic

# Load the FIT file
fitfile = fitparse.FitFile(r"PATH TO YOUR .FIT FILE")

# Extract latitude and longitude data points
lat_lon_points = []

for record in fitfile.get_messages("record"):

if record.get_value('position_lat') and record.get_value('position_long'):
lat = record.get_value('position_lat') * (180 / 2**31)
lon = record.get_value('position_long') * (180 / 2**31)
lat_lon_points.append((lat, lon))

# Calculate the total distance based on lat,lon points
total_distance = 0.0
for i in range(1, len(lat_lon_points)):
total_distance += geodesic(lat_lon_points[i-1], lat_lon_points[i]).meters

print (f"Total distance measured by GPS: {total_distance/1000}")

# Sum the measured distance recorded in each message['record']
measured_distance = []
for record in fitfile.get_messages("record"):
if record.get_value('distance'):
measured_distance.append(record.get_value('distance'))

# measured_distance += record.get_value('distance')

print (f"Distance reported by the watch: {measured_distance[-1]}")
  • Ok I have the Garmin Forerunner and am having the same issue. I am  a beginner swimmer getting in shape, and it calculated my 19:00 swim was over 6,000 yards (equivalent to around 60 laps??!).   I do notice that I clicked the "drill" feature and wonder if that messed it up? It hasn't done it since. I'm wondering if I can manually fix this through Garmin connect. I see you have a different model, but this is happening with the ForeRunner 245

  • I can observe the same - the watch reports a 1500m, the gps track looks accurate and consistent with where I swam. If I retrace the track on Google Earth, I get 1800m. 

    I have a garmin swim 2. 

  • According to other posts here, dozens of other customers are having the same issue. It’s rather surprising that Garmin is not doing anything to fix such a major issue. 

  • I just did my first open water swim with a brand new Garmin Swim 2 and the same thing happened to me.  It reported the distance swum as about 25% less than the GPS data indicated when I exported it to a GPX file.

    So it's not a GPS signal issue - there's something else going on here.  

    This reddit user reports that he was able to do a warranty return with Garmin and that he didn't have the problem with his new watch.  So maybe that's what you have to do. I'm going to give it another try and see what happens before I return it, but I bought this watch because it was reviewed as being highly accurate in the open water and if it isn't, then I have no need for it.

  • I just did a warranty return with Garmin, I have a brand new watch, and the issue persists. Anyway it clearly seems like a software, not a hardware issue, as the points are tracked accurately, just the distance calculation is wrong.