嗨,我需要计算经纬度两点之间的距离。
我想避免对外部 API 的任何调用。
我试图在 PHP 中实现 Haversine 公式:
这是代码:
class CoordDistance
{
public $lat_a = 0;
public $lon_a = 0;
public $lat_b = 0;
public $lon_b = 0;
public $measure_unit = 'kilometers';
public $measure_state = false;
public $measure = 0;
public $error = '';
public function DistAB()
{
$delta_lat = $this->lat_b - $this->lat_a ;
$delta_lon = $this->lon_b - $this->lon_a ;
$earth_radius = 6372.795477598;
$alpha = $delta_lat/2;
$beta = $delta_lon/2;
$a = sin(deg2rad($alpha)) * sin(deg2rad($alpha)) + cos(deg2rad($this->lat_a)) * cos(deg2rad($this->lat_b)) * sin(deg2rad($beta)) * sin(deg2rad($beta)) ;
$c = asin(min(1, sqrt($a)));
$distance = 2*$earth_radius * $c;
$distance = round($distance, 4);
$this->measure = $distance;
}
}
用一些具有公共距离的给定点测试它我没有得到可靠的结果。
我不明白原始公式或我的实现是否有错误
原文由 maxdangelo 发布,翻译遵循 CC BY-SA 4.0 许可协议
不久前,我写了一个半正弦公式的例子,并在我的网站上发布了它:
➽ 请注意,您使用参数
$earthRadius
传入的距离以相同的单位返回。默认值为 6371000 米,因此结果也将以 [m] 为单位。要以英里为单位获得结果,例如,您可以通过 3959 英里作为$earthRadius
并且结果将以 [mi] 为单位。在我看来,如果没有特别的理由不这样做,坚持使用 SI 单位是一个好习惯。编辑:
正如 TreyA 正确指出的那样,Haversine 公式由于舍入误差而具有 对映点 的弱点(尽管它对于小距离 是 稳定的)。要绕过它们,您可以改用 Vincenty 公式。