一尘不染

php / mysql邮政编码邻近搜索

mysql

我只是在寻找有关最佳方法的建议…

我需要创建一个搜索功能,以在邮政编码的50英里半径内搜索“用户”。我有一个邮政编码表,其中包含所有美国邮政编码及其纬度/经度,但我只是想找出构造和查询数据的最佳方式…

是否应在用户表中添加纬度/经度列,并在给定邮政编码范围内的所有用户查询它?还是应该在邮政编码表中查询半径范围内的所有邮政编码,然后在用户表中查询所有具有结果(邮政编码)的用户?要么…
???目前,我愿意接受任何建议!

谢谢!


阅读 277

收藏
2020-05-17

共1个答案

一尘不染

这是我找到的最好方法。当然,这需要您在数据库中对所有经纬度的邮政编码进行编码。

// get all the zipcodes within the specified radius - default 20
function zipcodeRadius($lat, $lon, $radius)
{
    $radius = $radius ? $radius : 20;
    $sql = 'SELECT distinct(ZipCode) FROM zipcode  WHERE (3958*3.1415926*sqrt((Latitude-'.$lat.')*(Latitude-'.$lat.') + cos(Latitude/57.29578)*cos('.$lat.'/57.29578)*(Longitude-'.$lon.')*(Longitude-'.$lon.'))/180) <= '.$radius.';';
    $result = $this->db->query($sql);
    // get each result
    $zipcodeList = array();
    while($row = $this->db->fetch_array($result))
    {
        array_push($zipcodeList, $row['ZipCode']);
    }
    return $zipcodeList;
}

您应该能够使用此功能。将您想要的半径的邮政编码的$ lat和$ lon传递给它,包括可选的半径,并返回一个邮政编码列表。

您可以很容易地对其进行修改,以使所有用户的邮政编码都位于(radius_sql),并将您的列表用户带回来。

编码愉快!

2020-05-17