I tried
Geo::Ellipsoid.
I used all the different ellipsoids just to see what would happen. I was looking for the miles from SFO to LAX.
#!/usr/bin/perl
use strict;
use warnings;
use Geo::Ellipsoid;
my @ellipsoids = (
'AIRY',
'AIRY-MODIFIED',
'AUSTRALIAN',
'BESSEL-1841',
'CLARKE-1880',
'EVEREST-1830',
'EVEREST-MODIFIED',
'FISHER-1960',
'FISHER-1968',
'GRS80',
'HOUGH-1956',
'HAYFORD',
'IAU76',
'KRASSOVSKY-1938',
'NAD27',
'NWL-9D',
'SOUTHAMERICAN-1969',
'SOVIET-1985',
'WGS72',
'WGS84'
);
foreach my $ellipsoid(@ellipsoids) {
my $geo = Geo::Ellipsoid->new(
ellipsoid => $ellipsoid,
units => 'degrees',
distance_units => 'mile',
longitude => 1,
bearing => 1,
);
my @origin = ( 37.619002, -122.374843 );
my @dest = ( 33.942536, -118.408074 );
my ( $range, $bearing ) = $geo->to( @origin, @dest );
my ($lat, $lon) = $geo->at( @origin, 2000, 45.0);
my ($x, $y) = $geo->displacement( @origin, $lat, $lon );
my @pos = $geo->location( $lat, $lon, $x, $y );
print my $dist = $geo->range( @origin, @dest ), "\n";
}