=head1 NAME
GIS::Distance::Formula::Haversine - Exact spherical distance calculations.
=head1 DESCRIPTION
This is the default distance calculation for L<GIS::Distance> as
it keeps a good balance between speed and accuracy.
Normally this module is not used directly. Instead L<GIS::Distance>
is used which in turn interfaces with the various formula classes.
=head1 FORMULA
dlon = lon2 - lon1
dlat = lat2 - lat1
a = (sin(dlat/2))^2 + cos(lat1) * cos(lat2) * (sin(dlon/2))^2
c = 2 * atan2( sqrt(a), sqrt(1-a) )
d = R * c
=cut
use Moose;
use Math::Trig qw( deg2rad );
=head1 METHODS
=head2 distance
This method is called by L<GIS::Distance>'s distance() method.
=cut
sub distance {
my ($self, $lat1, $lon1, $lat2, $lon2) = @_;
$lon1 = deg2rad($lon1);
$lat1 = deg2rad($lat1);
$lon2 = deg2rad($lon2);
$lat2 = deg2rad($lat2);
my $dlon = $lon2 - $lon1;
my $dlat = $lat2 - $lat1;
my $a = (sin($dlat/2)) ** 2 + cos($lat1) * cos($lat2) * (sin($dlon/2)) ** 2;
my $c = 2 * atan2(sqrt($a), sqrt(1-$a));
return length( $self->kilometer_rho() * $c, 'km' );
}
1;
__END__
=head1 SEE ALSO
L<GIS::Distanc>
L<GIS::Distance::Formula::Haversine::Fast>
=head1 RESOURCES
=head1 AUTHOR
Aran Clary Deltac <bluefeet@cpan.org>
=head1 LICENSE
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.