Calcolare la distanza tra tra due punti (lat/Long)

Viene utilizzata la formula 'haversine' per calcolare distanze tra i due punti - cioè, la distanza più breve sulla superficie della Terra - (senza tenere conto colline!) .

Haversine formula: R = Raggio della terra (Raggio medio = 6,371km)
Δlat = lat2− lat1
Δlong = long2− long1
a = sin²(Δlat/2) + cos(lat1).cos(lat2).sin²(Δlong/2)
c = 2.atan2(√a, √(1−a))
d = R.c
(Si noti che gli angoli devono essere in radianti di passare alle funzioni trig).
JavaScript:
var R = 6371; // km
var dLat = (lat2-lat1).toRad();
var dLon = (lon2-lon1).toRad();  
var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
        Math.cos(lat1.toRad()) * Math.cos(lat2.toRad()) * 
        Math.sin(dLon/2) * Math.sin(dLon/2);  
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
var d = R * c;


RPGLE codice di esempio (distanza in miglia)

h option(*srcstmt:*nodebugio)                              
h BndDir('QC2LE')  DftActGrp(*NO)                          
*                                                         
* Prototypes                                              
d ACosine         Pr             8f   ExtProc('acos')      
d  double                        8f   Value                
d Cosine          Pr             8f   ExtProc('cos')       
d  double                        8f   Value                
d Sine            Pr             8f   ExtProc('sin')       
d  double                        8f   Value                

d  $home_lat      s             11p 6
d  $home_lng      s             11p 6                        
d  $away_lat      s             11p 6                        
d  $away_lng      s             11p 6                        
d  $distance      s              8p 2                        

d  home_lat       s             11p 6                        
d  home_lng       s             11p 6                        
d  away_lat       s             11p 6                        
d  away_lng       s             11p 6                        


*                                                           
*----- Main Routine                                         
*                                                           

c     *entry        plist                                    
c                   parm                    $home_lat        
c                   parm                    $home_lng        
c                   parm                    $away_lat        
c                   parm                    $away_lng

c                   parm                    $distance

c                   eval(h)   home_lat = $home_lat/57.2958
c                   eval(h)   home_lng = $home_lng/57.2958
c                   eval(h)   away_lat = $away_lat/57.2958
c                   eval(h)   away_lng = $away_lng/57.2958

c                   eval(h)   $distance =
c                             ACosine((Sine(home_lat) * Sine(away_lat)) +
c                             (Cosine(away_lng - home_lng) *
c                              Cosine(home_lat) *
c                              Cosine(away_lat)))
c                              * 6371
c* in miglia                   * 3963.10

c                   eval      *inlr = *on
c                   return