【问题标题】:Best way to compute distance from an input to database records计算从输入到数据库记录的距离的最佳方法
【发布时间】:2019-04-12 17:38:19
【问题描述】:

我有一个 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 参数内并将其推送到数组中。

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

【问题讨论】:

    标签: php geolocation distance


    【解决方案1】:

    我取决于你有多少商店。如果你有 100 个,你可以轻松地将它们拉入内存并将它们全部整理出来。

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

    【讨论】:

    • 请问10是什么意思? @布拉姆
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2019-04-20
      • 1970-01-01
      • 1970-01-01
      • 2017-11-05
      • 2011-12-26
      • 2011-10-19
      • 2016-10-14
      • 1970-01-01
      • 2012-03-22
      相关资源
      最近更新 更多