## 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;
}```
` `