PHP& MySQL商店距离计算器 - 邮政编码

时间:2011-04-26 13:03:41

标签: php mysql sql distance

正确的我一直在努力研究如何将给定的邮政编码与商店地址的数据库进行比较,并根据哪一个最接近给定的邮政编码(或者我猜的邮政编码)来排序。

这主要是出于兴趣,而不是我向您寻求建议,然后将其出售给客户:-O

首先,经过研究,我发现你必须与Lat / Long保持距离,所以我找到了一个将邮政编码/邮政编码转换为lat long的API,现在我的DB有一个id, store_name, lat, long, postcode和我这样的结构可以将给定的邮政编码转换为lat long。

但是我如何在SQL中查询最接近给定lat long的那些?

3 个答案:

答案 0 :(得分: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;
    }

<强>更新 有一些关于效率的讨论。这个查询对您来说是一个小基准。我有一个包含美国邮政编码的数据库。由于zipcodes的工作方式(在本主题的范围之外),其中一些是重复的。所以我的记录不到8万。我在90210上跑了20英里的半径距离:

SELECT distinct(ZipCode) FROM zipcodes  WHERE (3958*3.1415926*sqrt((Latitude-34.09663010)*(Latitude-34.09663010) + cos(Latitude/57.29578)*cos(34.09663010/57.29578)*(Longitude- -118.41242981)*(Longitude- -118.41242981))/180) <= 20

我找回了 366条总记录数,而查询 0.1770秒。你需要多高效率?

答案 1 :(得分:0)

check out this great open source project

免责声明:不是我的项目,也不是我的贡献者。纯粹是一种推荐。

答案 2 :(得分:0)

有关在查询MySQL之前计算边界框的示例,请参阅this answer to a previous question。这允许MySQL查询中的复杂公式针对数据库条目的子集运行,而不是针对表中的每个条目。