Формула и код для расчета расстояния на основе двух широт / долгот
Ниже приведена формула, которую я использую в
Perl для расчетов. Perl
ожидает, что все углы будут в
радиан.
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
Значения, которые я использую для радиуса
земля:
3963,1 статутных миль
3443,9 морских миль 6378 км
Чтобы преобразовать десятичные градусы в
радианы используют следующий 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);
Для преобразования градусов в минуты и секунды
в десятичных градусах используйте следующее
формула perl.
$dec_deg = $deg + ($min + $sec/60)/60;
Наконец, в ACOS нет функции
Perl так вот функция, которую я использую. я
не помню, где я взял математику
для этого.
# 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;
}