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

时间:2019-04-12 17:38:20

标签: php geolocation distance

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

我还有一个shops表,其中包含位置记录

id, longitude, latitude

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

我的目标是在数据库中搜索最接近输入latitudelongitude的商店,而distance是搜索范围,比如说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参数中,并将其推入数组。

有没有更有效的方法?

2 个答案:

答案 0 :(得分:0)

我要看您有多少家商店。如果您有100个,则可以轻松地将它们拉入内存并进行整理。

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

答案 1 :(得分:0)

我最近也一直在研究这个问题,this似乎是我到目前为止找到的最好的答案。 另外,here是使用PHP和Doctrine的一种。

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