Đây là cách tốt nhất mà tôi đã tìm thấy. Tất nhiên, nó sẽ yêu cầu bạn phải mã hóa tất cả các vĩ độ / kinh độ zipcodes trong cơ sở dữ liệu.
// 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;
}
Bạn sẽ có thể chỉ cần thả vào chức năng này. Chuyển cho nó $ lat và $ lon của mã zip bạn muốn bán kính, bao gồm bán kính tùy chọn và lấy lại danh sách mã zip.
Bạn có thể rất dễ dàng sửa đổi điều này để đưa tất cả người dùng đến nơi mã zip IN (radius_sql) và lấy lại người dùng trong danh sách của bạn.
Chúc bạn viết mã vui vẻ!