高效的计算距离的方法

时间:2017-03-30 17:08:26

标签: php mysql distance

我正在建立一个具有搜索功能的约会网站来查找匹配项。其中一个标准是您与可能的匹配之间的距离。我该如何计算距离?我认为计算所有可能匹配的确切距离可能是太耗费资源。我想要一个不同的解决方案,以便显示附近的人而不需要资源。

我有这个想法:

当有人注册时,将他们的坐标保存为(对于纬度)四舍五入到数据库中最近的5分钟(= 9公里)?搜索匹配项时,搜索数据库以查找与用户相同的坐标。找到匹配后,仍然可以计算出确切的距离。

这对经度有什么用? 有没有更好的方法来做到这一点? 我不是在寻找计算距离的公式。如何在不计算每个可能匹配的距离(数千)的情况下找到附近的比赛?

1 个答案:

答案 0 :(得分:0)

首先,您可以选择两个用户的纬度经度,并可以将它们转换为距离,如下所示:

function distance($lat1, $lon1, $lat2, $lon2, $unit) {

  $theta = $lon1 - $lon2;
  $dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) +  cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta));
  $dist = acos($dist);
  $dist = rad2deg($dist);
  $miles = $dist * 60 * 1.1515;
  $unit = strtoupper($unit);

  if ($unit == "K") {
    return ($miles * 1.609344);
  } else if ($unit == "N") {
      return ($miles * 0.8684);
    } else {
        return $miles;
      }
}

echo distance(32.9697, -96.80322, 29.46786, -98.53506, "M") . " Miles<br>";
echo distance(32.9697, -96.80322, 29.46786, -98.53506, "K") . " Kilometers<br>";
echo distance(32.9697, -96.80322, 29.46786, -98.53506, "N") . " Nautical Miles<br>";

?>

希望它有所帮助。