I’m trying to make a small gps logger that tells me how far I ran in a given time, but it seems as if the gps data isn’t very consistent. This is a shortened version of my code:
import location, time, math
def distanceFromCoords(long1, lat1, long2, lat2): #calculate distance between two coordinates
#convert latitude and longitude to spherical coordinates in radians
degrees_to_radians = math.pi/180.0
#phi = 90 - latitude
phi1 = (90.0 - lat1)*degrees_to_radians
phi2 = (90.0 - lat2)*degrees_to_radians
# theta = longitude
theta1 = long1*degrees_to_radians
theta2 = long2*degrees_to_radians
#calculate spherical distance from spherical coordinates.
cos = (math.sin(phi1)*math.sin(phi2)*math.cos(theta1 - theta2) + math.cos(phi1)*math.cos(phi2))
arc = math.acos(cos)
# multiply arc by the radius of the earth (3960 miles or 6371 kilometers)
return round(arc*6371*1000) #multiplied with 1000 to get meters
location.start_updates() #start location updates
if True:
distance = 0 #total distance travelled
startTime = time.time() #set starting time of timer
#to calculate distances two coordinates are needed. coord1 is the coordinate I was at, and coord2 is the coordinate I am at now
coord2 = (location.get_location()['longitude'],location.get_location()['latitude'])
while True:
coord1 = coord2 #set coord1 to coord2 from previous loop repetition
coord2 = (location.get_location()['longitude'],location.get_location()['latitude']) #get current coordinates
distance += distanceFromCoords(coord1[0], coord1[1], coord2[0], coord2[1]) #add distance between coord1 and coord2 to the total distance travelled
print('\n', round(time.time()-startTime), '\n', distance, '\n')
time.sleep(1)
location.stop_updates() #I know, this never gets executed :D
If I don’t move my iPad and leave it for twenty seconds, the code tells me that I already moved about 50 meters! When doing a cooper run (you have 12 minutes time and need to run as far as possible) these 50 meters would already change my grade substantially (yeah, I’m still in school).
Is there any better way to do this? After all most apps (runtastic, google maps ...) manage too.