PHP:Haversine公式给出了巨大(不正确)的距离

Abh*_*hek 1 php math maps latitude-longitude haversine

为什么Haversine公式会返回很远的距离?根据我通过的值,距离不应超过1或2公里.但它返回8,104公里.

我知道这是PHP经常出现的问题.

感谢这里的代码片段:

function haversineGreatCircleDistance(
  $latitudeFrom, $longitudeFrom, $latitudeTo, $longitudeTo, $earthRadius = 6371)
{
  // convert from degrees to radians
  $latFrom = deg2rad($latitudeFrom);
  $lonFrom = deg2rad($longitudeFrom);
  $latTo = deg2rad($latitudeTo);
  $lonTo = deg2rad($longitudeTo);

  $latDelta = $latTo - $latFrom;
  $lonDelta = $lonTo - $lonFrom;

  $angle = 2 * asin(sqrt(pow(sin($latDelta / 2), 2) +
    cos($latFrom) * cos($latTo) * pow(sin($lonDelta / 2), 2)));
  return $angle * $earthRadius;
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ker 8

function haversineGreatCircleDistance(
  $latitudeFrom, $longitudeFrom, $latitudeTo, $longitudeTo, $earthMeanRadius = 6371)
{
    $deltaLatitude = deg2rad($latitudeTo - $latitudeFrom);
    $deltaLongitude = deg2rad($longitudeTo - $longitudeFrom);
    $a = sin($deltaLatitude / 2) * sin($deltaLatitude / 2) +
         cos(deg2rad($latitudeFrom)) * cos(deg2rad($latitudeTo)) *
         sin($deltaLongitude / 2) * sin($deltaLongitude / 2);
    $c = 2 * atan2(sqrt($a), sqrt(1-$a));
    return $earthMeanRadius * $c;
}
Run Code Online (Sandbox Code Playgroud)

参数的值为6371 $earthMeanRadius(默认值)是以千米为单位的地球平均半径,这意味着返回的结果将以千米为单位....如果您想要里程,则使用$earthMeanRadius参数值3,958 调用它; 如果您想要海里,请将其更改为3440等.

  • 这是Haversine公式的经过测试和正确的版本....如果这不起作用,请检查您的输入 (2认同)