php/mysql邮政编码邻近搜索

mik*_*ike 18 php mysql sql

我只是在寻找最佳方法的建议......

我需要创建一个搜索功能,搜索邮政编码半径50英里范围内的"用户".我有一个邮政编码表,其中包含所有美国邮政编码及其纬度/经度,但我只想找出构建和查询数据的最佳方法...

我应该将纬度/经度列添加到users表并查询给定邮政编码半径范围内的所有用户吗?或者我应该在邮政编码表中查询半径范围内的所有邮政编码,然后查询具有结果的所有用户的用户表(邮政编码)?要么... ???我对此提出任何建议持开放态度!

谢谢!

Chu*_*ess 19

这是我找到的最好方法.当然,这需要您在数据库中对所有的zip /编码进行lat/lon编码.

// 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;
}
Run Code Online (Sandbox Code Playgroud)

你应该能够放弃这个功能.将它传递给你想要半径的邮政编码的$ lat和$ lon,包括可选的半径,然后获取一个zipcodes列表.

您可以非常轻松地修改它以使所有用户获得zipcode IN(radius_sql)并让您的列表用户返回.

快乐的编码!

  • 因此,唯一的方法是将地址(纬度/经度)与周围地址(纬度/经度)进行比较。话虽这么说,您仍然可以通过最近到最远的邮政编码来订购它们。但请记住,这只会指定邮政编码的“区域”,不一定邻近其他地址。我想说添加到选择: (3958*3.1415926*sqrt((Latitude-'.$lat.')*(Latitude-'.$lat.') + cos(Latitude/57.29578)*cos('.$lat.') .'/57.29578)*(Longitude-'.$lon.')*(Longitude-'.$lon.'))/180) 作为 LOC,然后在末尾 ORDER BY LOC。 (2认同)