PHP - 两个位置之间的距离,方法[关闭]

Posted

技术标签:

【中文标题】PHP - 两个位置之间的距离,方法[关闭]【英文标题】:PHP - distance between two locations, approach [closed] 【发布时间】:2013-06-15 16:20:36 【问题描述】:

根据: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);
?>

【问题讨论】:

我的意思是我应该使用哪个以及为什么,它们之间有哪些区别?一个比另一个更准确,这是两者的附加值,在使用一个或另一个时是坏事还是好事:D ....绝对是优势/障碍 @MarkBaker 所以不知道地点是否在同一平面上,第二个似乎通常更准确,对吧? @MarkBaker 你摇滚,你能把你所有的悲伤变成一个答案吗?如果没有更好的答案,我肯定会接受你的;) 非常感谢,我鼓励你把所有的东西都放在一个答案中;)真的非常感谢 【参考方案1】:

余弦定律计算基于球形地球; Haversine 是一个大圆计算:假设地球是一个椭圆而不是一个球体,那么 Haversine 更准确……虽然 Vincenty 算法是一种比 Haversine 更准确的大圆计算,但计算速度较慢。余弦计算是一种快速近似,在短距离内相当准确; Haversine 在更长的距离上更准确,因为它更合理地近似地球的曲率,尽管它对于跨极地大圆并不是特别准确。

你可以找到对差异的很好解释here

【讨论】:

以上是关于PHP - 两个位置之间的距离,方法[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

2个GPS位置之间的距离PHP

计算两个地理位置之间的距离

开车时计算android中两个位置之间的距离

两个地理位置之间的距离(以英尺为单位)

如何计算两个位置之间的距离?

计算两个经纬度之间的道路距离