我有一个API(PHP),将接受经度,纬度和距离。
我还有一张桌子shops
,有地点记录
id, longitude, latitude
现在,我的API将接受输入longitude, latitude
和distance
我的目标是在数据库中搜索最接近输入latitude
和longitude
和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
参数内并将其推入数组中。
有没有更有效的方法来做到这一点?
我取决于你有多少商店。如果你得到100,你可以轻松地将它们拉入内存并将它们全部排序。
当您需要限制它时,您可以根据纬度和经度选择矩形内的商店。 select * from shops where lat between arglat - 10 and arglat + 10 and lng between arglng - 10 and arglng + 10