#================================================================================= # Distance Calculator #================================================================================= # This function calculates the distance between two latitude/logitude # coordinates. Disance can be returned as Nautical Miles, Kilometers, # or Miles (default). # # # This function was designed for VBScript # # Accepts: # Lat1 = Latitude of point one (decimal, required) # Lon1 = Longitude of point one (decimal, required) # Lat2 = Latitude of point two (decimal, required) # Lon2 = Longitude of point two (decimal, required) # UnitFlag = Non required character K, N, or M # where: # K = Kilometers # N = Nautical Miles # M = Miles [default] # # Provided by: http://www.zip-codes.com # # © 2005 Zip-Codes.com, All Rights Reserved #================================================================================= $pi = atan2(1,1) * 4; sub distance { my ($lat1, $lon1, $lat2, $lon2, $unit) = @_; my $theta = $lon1 - $lon2; my $dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta)); $dist = acos($dist); $dist = rad2deg($dist); $dist = $dist * 60 * 1.1515; if ($unit eq "K") { $dist = $dist * 1.609344; } elsif ($unit eq "N") { $dist = $dist * 0.8684; } return ($dist); } #================================================================================= # Get the arccos function using arctan function #================================================================================= sub acos { my ($rad) = @_; my $ret = atan2(sqrt(1 - $rad**2), $rad); return $ret; } #================================================================================= # Converts decimal degrees to radians #================================================================================= sub deg2rad { my ($deg) = @_; return ($deg * $pi / 180); } #================================================================================= # Converts radians to decimal degrees #================================================================================= sub rad2deg { my ($rad) = @_; return ($rad * 180 / $pi); } #================================================================================= # Examples #================================================================================= print distance(30.524, -87.235, 34.097, -118.412, "M") . " Miles\n"; print distance(30.524, -87.235, 34.097, -118.412, "K") . " Kilometers\n"; print distance(30.524, -87.235, 34.097, -118.412, "N") . " Nautical Miles\n";