我有一个可用的 PHP 函数,它接受纬度/经度坐标和以英里为单位的距离,然后在邮政编码/纬度-经度对的 MySQL 表(40,000 多行)中逐行测试每个邮政编码/纬度是否-lon 行是否落在指定距离内。
我知道这种方法效率非常低,我想在 SQL 查询中而不是使用 PHP 来完成所有三角函数和距离计算。有人可以帮我从这里出去吗?我觉得我已经尝试了所有方法,但就是无法正确获取 SQL 查询。任何帮助将不胜感激!
现有的 PHP 函数:
function getZips($lat, $lon, $radius)
{
//MySQL bit
$zipQuery = mysql_query("SELECT * FROM zip_codes");
while ($row = mysql_fetch_assoc($zipQuery))
{
$lat2 = $row['latitude'];
$lon2 = $row['longitude'];
$distance = (3958*3.1415926*sqrt(($lat2-$lat)*($lat2-$lat) + cos($lat2/57.29578)*cos($lat/57.29578)*($lon2-$lon)*($lon2-$lon))/180);
if ($distance <= $radius)
{
$zip = $row['zip'];
echo "Zip in range: <b>" .$zip . "</b><br>";
}
}
}
最佳答案
SELECT zipcode, ( 3959 * acos( cos( radians( {$coords['latitude']} ) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians( {$coords['longitude']} ) ) + sin( radians( {$coords['latitude']} ) ) * sin( radians( latitude ) ) ) ) AS distance FROM logic_zipcodes HAVING distance <= {$radius} ORDER BY distance
不记得我最初是从哪里得到这个的,但我已经使用它很长时间了。这是我的功能:
function zipsearch($start, $rad) {
// ITITIAL POINT
$result = mysql_query("SELECT latitude,longitude FROM logic_zipcodes WHERE zipcode='" . $start . "'");
while($row = mysql_fetch_array($result)) {
$coords = array('latitude' => $row['latitude'], 'longitude' => $row['longitude']);
}
//RADIUS
$radius = $rad;
// SQL FOR MILES
$sql = "SELECT zipcode, ( 3959 * acos( cos( radians( {$coords['latitude']} ) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians( {$coords['longitude']} ) ) + sin( radians( {$coords['latitude']} ) ) * sin( radians( latitude ) ) ) ) AS distance FROM logic_zipcodes HAVING distance <= {$radius} ORDER BY distance";
// OUTPUT THE ZIPCODES AND DISTANCES
$query = mysql_query($sql);
$zips = array();
while($row = mysql_fetch_assoc($query)) {
$zips[] = $row['zipcode'];
}
return $zips;
}
function getZips($zip, $rad) {
$zipcode = qt($zip);
$andstatement = implode("','", zipsearch($zipcode, $rad));
return "AND zipcode in('" . $andstatement . "')";
}
关于PHP & MySQL 地理距离计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14271510/