use strict;
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);
my $miles = $dist * 60 * 1.1515;
$unit = uc $unit;
if ( $unit eq "K" ) {
return ( $miles * 1.609344 );
} ## end if ( $unit eq "K" )
elsif ( $unit eq "N" ) {
return ( $miles * 0.8684 );
} ## end elsif ( $unit eq "N" )
else {
return $miles;
} ## end else [ if ( $unit eq "K" )
} ## end sub distance
sub acos { atan2( sqrt( 1 - $_[0] * $_[0] ), $_[0] ) }
sub deg2rad { $_[0] * 0.0174532925 }
sub rad2deg { $_[0] * 57.2957795 }
####
print distance(60.1843160, -128.5069940, 29.46786, -98.53506, "M"), " miles\n";
print distance(32.9697, -96.80322, 29.46786, -98.53506, "K"), " kilometers\n";
print distance(32.9697, -96.80322, 29.46786, -98.53506, "N"), " nautical miles\n";
####
2535.33852270174 miles
422.738930838725 kilometers
228.109395841006 nautical miles
####
use GIS::Distance;
my $gis = GIS::Distance->new();
$gis->formula('Cosine');
print $gis->distance( 60.1843160, -128.5069940 => 29.46786, -98.53506 )
->value('mile'), " miles\n";
print $gis->distance( 32.9697, -96.80322 => 29.46786, -98.53506 )
->value('kilometer'), " kilometers\n";
print $gis->distance( 32.9697, -96.80322 => 29.46786, -98.53506 )
->value('nautical_mile'), " nautical miles\n";