## Formula and code for calculating distance based on two lat/lon locations

The following is the formula I use in perl to do the calculations. Perl
expects all of the angles to be in radians.

return &acos(cos($a1)*cos($b1)*cos($a2)*cos($b2) + cos($a1)*sin($b1)*cos($a2)*sin($b2) + sin($a1)*sin($a2)) * $r;

Where:

$a1 = lat1 in radians

$b1 = lon1 in radians

$a2 = lat2 in radians

$b2 = lon2 in radians

$r = radius of the earth in whatever units you want

The values I use for radius of the earth are:

3963.1 statute miles

3443.9 nautical miles

6378 km

To convert the decimal degrees to radians use the following perl.

# define an accurate value for PI
$pi = atan2(1,1) * 4;
#
# make sure the sign of the angle is correct for the direction
# West an South are negative angles
#
$degrees = $degrees * -1 if $direction =~ /[WwSs]/;
$radians = $degrees*($pi/180);

To convert degree minutes and seconds to decimal degrees use the following
perl formula.

$dec_deg = $deg + ($min + $sec/60)/60;

Finally, there is no acos function in perl so here is
the function I use. I don't remember where I got the math for this.

# subroutine acos
#
# input: an angle in radians
#
# output: returns the arc cosine of the angle
#
# description: this is needed because perl does not provide an arc cosine function

sub acos {

my($x) = @_;
my $ret = atan2(sqrt(1 - $x**2), $x);
return $ret;
}