根据:http://sgowtham.net/ramblings/2009/08/04/php-calculating-distance-between-two-locations-given-their-gps-coordinates/
我要检查两个给定位置之间的距离。
我的疑问是这两种方法中哪一种"更好",为什么是这样?
第一:
<?php
$earth_radius = 3960.00; # in miles
$lat_1 = "47.117828";
$lon_1 = "-88.545625";
$lat_2 = "47.122223";
$lon_2 = "-88.568781";
$delta_lat = $lat_2 - $lat_1 ;
$delta_lon = $lon_2 - $lon_1 ;
# Spherical Law of Cosines
function distance_slc($lat1, $lon1, $lat2, $lon2) {
global $earth_radius;
global $delta_lat;
global $delta_lon;
$distance = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($delta_lon)) ;
$distance = acos($distance);
$distance = rad2deg($distance);
$distance = $distance * 60 * 1.1515;
$distance = round($distance, 4);
return $distance;
}
$slc_distance = distance_slc($lat_1, $lon_1, $lat_2, $lon_2);
?>
第二
<?php
$earth_radius = 3960.00; # in miles
$lat_1 = "47.117828";
$lon_1 = "-88.545625";
$lat_2 = "47.122223";
$lon_2 = "-88.568781";
$delta_lat = $lat_2 - $lat_1 ;
$delta_lon = $lon_2 - $lon_1 ;
function distance_haversine($lat1, $lon1, $lat2, $lon2) {
global $earth_radius;
global $delta_lat;
global $delta_lon;
$alpha = $delta_lat/2;
$beta = $delta_lon/2;
$a = sin(deg2rad($alpha)) * sin(deg2rad($alpha)) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * sin(deg2rad($beta)) * sin(deg2rad($beta)) ;
$c = asin(min(1, sqrt($a)));
$distance = 2*$earth_radius * $c;
$distance = round($distance, 4);
return $distance;
}
$hav_distance = distance_haversine($lat_1, $lon_1, $lat_2, $lon_2);
?>
余弦定律的计算是基于球形地球;哈弗森是一个伟大的圆计算:考虑到地球是一个椭圆形而不是一个球体,那么哈弗森更准确……Vincenty算法虽然比Haversine算法更精确地计算大圆,但计算速度较慢。余弦计算是一个快速近似值,在短距离内相当准确;哈弗辛在更长的距离上更准确,因为它更合理地近似地球的曲率,尽管它对跨极大圆不是特别准确。
你可以在这里找到一个很好的解释差异