正确的我一直在努力研究如何将给定的邮政编码与商店地址的数据库进行比较,并根据哪一个最接近给定的邮政编码(或者我猜的邮政编码)来排序。
这主要是出于兴趣,而不是我向您寻求建议,然后将其出售给客户:-O
首先,经过研究,我发现你必须与Lat / Long保持距离,所以我找到了一个将邮政编码/邮政编码转换为lat long的API,现在我的DB有一个id, store_name, lat, long, postcode
和我这样的结构可以将给定的邮政编码转换为lat long。
但是我如何在SQL中查询最接近给定lat long的那些?
答案 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查询中的复杂公式针对数据库条目的子集运行,而不是针对表中的每个条目。