GPS coordinates to metres

Francis Nugent Dixon effendi at wanadoo.fr
Tue Mar 7 13:46:01 EST 2006


Hi Monte,

in your mail you don't show the complete Lat/Long information
(you need N/S for Lat, and E/W for Long).  I suppose that you
didn't include them, but you need them for what follows.

Try the Haversine formula I use to get distances between 2
points. You first have to convert your Lat/Long into Radians.

I got my co-ordinates (corresponding to a city) from a data
base, and converted them to radians first.

Let's assume you have your Lat and Long co-ordinates in
fields MyLatitude and MyLongitude, and the direction in fields
MyNS and MyEW, and you want the radian answer in fields
MyRadLatitude and MyRadLongitude, you convert to radians
by :

   set numberFormat to 0.000000000000  -- We need precision here !
   --
   --     Convert Latitude and Logitude from degrees to Radians
   --     (Latitude and Longitude must be valid co-ordinates).
   --
   --     This is in preparation for the calculation of distances between
   --     two point on the earths surface.
   --
   --     These co-ordinates must be converted into Radians to use them  
in
   --     my Haversine formula.
   --
   put field MyLatitude into LVWork1
   put LVWork1 * 0.017453293 into LVIntermed1
   put LVIntermed1 into field MyRadLatitude
   put field MyLongitude into LVWork2
   put LVWork2 * 0.017453293 into LVIntermed2
   put LVIntermed2 into field MyRadLongitude
   if field MyNS = "S" then put - field MyRadLatitude into field  
MyRadLatitude
   if field MyEW = "W" then put - field MyRadLongitude into field  
MyRadLongitude

Then, using function :

Function RFHaversine PVLat1,PVLong1,PVLat2,PVLong2
   --global  
LVRadiusOfTheEarth,LVLat1,LVLong1,LVLat2,LVLong2,LVInt1,LVInt2,LVWork1,L 
VWork2,LVWork3
   --
   --     V1 for Hypercard  - 2003/06/28 - 18:00   no atan2 function  
available in Hypercard.
   --     V2 for Revolution - 2006/02/24 - 11:23   use atan2 function  
available in Revolution.
   --
   --     Use Haversine two-argument Inverse Tangent Function to  
calculate
   --     the distance between two geographic locations (cities).
   --
   --     The two geographic locations represent cities or towns in my
   --     City Stack. The pre-calling sequence has already identified
   --     the two cities, and extracted their locations in Radians.
   --
   --     Input Parameters :
   --
   --     Latitude and Longitude of location 1 in Radians  
(PVLat1,PVLong1).
   --     Latitude and Longitude of location 2 in Radians  
(PVLat2,PVLong2).
   --
   --     The Haversine formula is :
   --
   --     dlon = lon2 - lon1  where lon1 and lon2 are longitudes of two  
cities.
   --     dlat = lat2 - lat1  where lat1 and lat2 are latitudes of two  
cities.
   --     a = (sin(dlat/2))^2 + cos(lat1) * cos(lat2) * (sin(dlon/2))^2
   --     c = 2 * atan2( sqrt(a), sqrt(1-a) )
   --     d = R * c           where R is the radius of the earth in  
kilometres.
   --
   set numberFormat to 0.000000000000  -- Heavy precision required here !
   put 6367 into LVRadiusOfTheEarth       -- Generally accepted Radius  
of the Earth
   put PVLat1 into LVLat1
   put PVLong1 into LVLong1
   put PVLat2 into LVLat2
   put PVLong2 into LVLong2
   put LVLong2 - LVLong1 into LVInt1
   put LVLat2 - LVLat1 into LVInt2
   put (sin(LVInt2/2))^2 + cos(LVLat1) * cos(LVLat2) * (sin(LVInt1/2))^2  
into LVWork1
   put 2 * atan2(sqrt(LVWork1),sqrt(1-LVWork1)) into LVWork2
   put LVRadiusOfTheEarth * LVWork2 into LVWork3
   --
   --     We now have the distance in kilometres in LVWork3.
   --
   put round(LVWork3,3) into LVWork3     -- Kilometres to 3 decimal  
points.
   return LVWork3
end RFHaversine

You can get the distance between your two points with :

put RFHaversine (LVRadLat1,LVRadLong1,LVRadLat2,LVRadLong2) into  
Distance

Either set the radius of the Earth to metres, or remove the
point in the kilometre answer field and "Bobs your Uncle !"

If anybody else is interested, I have a stack containing data
for 4000 cities and the possibility of calculating the distance
between any two cities, with up to 6 city stopovers if necessary.
(its got 4001 cards and is 1.6 Mb).

I hope this fills your requirements.

Best from Paris

-Francis




More information about the use-livecode mailing list