繁体   English   中英

计算从输入到数据库记录的距离的最佳方法

[英]Best way to compute distance from an input to database records

我有一个API(PHP),将接受经度,纬度和距离。

我也有一个有位置记录的餐桌shops

id, longitude, latitude

现在,我的API将接受输入longitude, latitudedistance

我的目标是在数据库中搜索最接近商店的输入latitudelongitudedistance是搜索的范围,比方说distance = 20km

我已经有了一个确定两点距离的函数:

private function computeDistance($lat1, $lng1, $lat2, $lng2, $radius = 6378137)
{
    static $x = M_PI / 180;
    $lat1 *= $x; $lng1 *= $x;
    $lat2 *= $x; $lng2 *= $x;
    $distance = 2 * asin(sqrt(pow(sin(($lat1 - $lat2) / 2), 2) + cos($lat1) * cos($lat2) * pow(sin(($lng1 - $lng2) / 2), 2)));
    $meters = $distance * $radius;
    return $meters * (1 / 1000); // Return Kilometers
}

现在,这样做的最佳方法是什么? 我最初的计划是获取数据库中的所有记录,然后循环到其中,比较api中的输入参数并检查distance参数中的distance并将其推入数组中。

有没有更有效的方法来做到这一点?

我取决于你有多少商店。 如果你得到100,你可以轻松地将它们拉入内存并将它们全部排除。

当您需要限制它时,您可以根据纬度和经度选择矩形内的商店。 select * from shops where lat between arglat - 10 and arglat + 10 and lng between arglng - 10 and arglng + 10

我最近也在研究这个问题, 似乎是我迄今为止找到的最佳答案。 此外, 这里有一个使用PHP和Doctrine。

在这两种情况下,他们都在数据库端进行计算(不确定查询的效率如何),如果您正在搜索大量记录,这可能会更有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM