Ingo Weiss: # //JavaScript: # dlng = p2_lng - p1_lng # dlat = p2_lat - p1_lat # a = (sin(dlat/2))^2 + cos(p1_lat) * cos(p2_lat) * (sin(dlon/2))^2 # c = 2 * atan2( sqrt(a), sqrt(1-a) ) # distance = R * c (where R is the radius of the Earth) # # # #Ruby: # dlng = p2_lng - p1_lng # dlat = p2_lat - p1_lat # a = (Math.sin(dlat/2))**2 + Math.cos(p1_lat) * Math.cos(p2_lat) * # (Math.sin(dlng/2))**2 # c = 2 * Math.atan2( Math.sqrt(a), Math.sqrt(1-a) ) # distance = 6373 * c #(radius of the Earth: 6373km # # # Any idea why the Ruby one returns incorrect numbers? 1) can you post sample running codes on both? (eg what are the values of p2_lang, etc) 2) do you have test cases? (so we know what to expect) kind regards -botp

on 2006-04-27 12:23

on 2006-04-27 12:45

PeÃ±a wrote: > # #Ruby: > # dlng = p2_lng - p1_lng > # dlat = p2_lat - p1_lat > # a = (Math.sin(dlat/2))**2 + Math.cos(p1_lat) * Math.cos(p2_lat) * > is dlng a typo, the first formula uses dlon?

on 2006-04-27 17:35

Turned out that I needed to convert the numbers to radians. Here is the code that worked: #Calculate distance between 2 coordinate points (decimal lat/lng), expressed in km #This is an approximation since it assumes the earth to be a perfect sphere def calculate_distance(p1, p2) # radius_of_earth = 3963.0 #miles radius_of_earth = 6373.0 #kilometers #convert position to decimal and radians: to_rad = 180/Math::PI p1_lat = degmin_to_dec(p1.lat) / to_rad p1_lng = degmin_to_dec(p1.lng) / to_rad p2_lat = degmin_to_dec(p2.lat) / to_rad p2_lng = degmin_to_dec(p2.lng) / to_rad #calculate distance: distance = radius_of_earth * Math.acos(Math.sin(p1_lat) * Math.sin(p2_lat) + Math.cos(p1_lat) * Math.cos(p2_lat) * Math.cos(p2_lng - p1_lng)) end Ingo