按距离排序邮政编码

时间:2014-05-14 15:52:34

标签: php mysqli

所以,我正在为我的网站搜索表单。我遇到了路障。似乎其他人也有,但我一直无法找到我的问题的答案,至少有一个我理解的答案。

我在网上发现了一个PHP函数,可以抓取指定半径范围内的所有邮政编码。我编辑了sql查询,因此我没有抓住该半径内的每个邮政编码,而是与用户帐户关联的邮政编码。该功能可以工作并抓取我之后的邮政编码。此函数返回带有邮政编码的数组。我想按照距离最近到最远的距离对邮政编码进行排序,显然我并没有足够聪明地知道如何去做。

我尝试过的事情:

我发现了另一个PHP函数,它将计算两组坐标(lat,lon2,lat2,lon2)之间的距离。我创建了自己的函数,循环遍历我的邮政编码数组,并通过calculateDistance函数运行每个zip。只是看起来很乱。我相信我所有的部分都不确定如何将它们放在一起。任何帮助将不胜感激。

这是我使用的zipcodeRadius函数:

    // get all the zipcodes within the specified radius - default 20
function zipcodeRadius($lat, $lon, $radius)
{
$radius = $radius ? $radius : 20;
$dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
        $sql = 'SELECT DISTINCT zipcodes.ZIP,
                     members.*,
                     location.*
                     FROM members
                     LEFT JOIN location
                     ON members.id = location.user_id
                     LEFT JOIN zipcodes
                     ON location.zip = zipcodes.ZIP
                     WHERE activated="1"
                     AND (3958*3.1415926*sqrt((Latitude-'.$lat.')*(Latitude-'.$lat.') + cos(Latitude/57.29578)*cos('.$lat.'/57.29578)*(Longitude-'.$lon.')*(Longitude-'.$lon.'))/180) <= '.$radius.';';
                     $result = mysqli_query($dbc, $sql);
// get each result
$zipcodeList = array();
while($row = mysqli_fetch_array($result))
{
    array_push($zipcodeList, $row['ZIP']);
}
return $zipcodeList;
}

这是calculateDistance函数

    function calculateDistance($latitude1, $longitude1, $latitude2, $longitude2) {
$theta = $longitude1 - $longitude2;
$miles = (sin(deg2rad($latitude1)) * sin(deg2rad($latitude2))) + (cos(deg2rad($latitude1)) * cos(deg2rad($latitude2)) * cos(deg2rad($theta)));
$miles = acos($miles);
$miles = rad2deg($miles);
$miles = $miles * 60 * 1.1515;
return $miles;
}   

而且,这是我看似毫无用处的功能:

    $matches = join(',',$zipCodeArray);
function sort_zip_by_distance($matches, $lat, $lon){
$dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
$queryDistance = "SELECT * FROM zipcodes WHERE  ZIP IN ($matches)";
$resultDistance = mysqli_query($dbc, $queryDistance)
or die("Unable to query the database");
while($rowDistance = mysqli_fetch_array($resultDistance)){
    $miles = calculateDistance($lat, $lon, $rowDistance['Latitude'],        $rowDistance['Longitude']);
    echo '<p>ZIP: ' . $rowDistance['ZIP'] . ' | Lat: ' . $rowDistance['Latitude'] . ' | Lon: ' . $rowDistance['Longitude'] . ' | Miles: ' . $miles . '</p><br />';

    $distanceTotal = array();
    array_push($distanceTotal, $rowDistance['ZIP'], $miles);
}
return $distanceTotal;
}

1 个答案:

答案 0 :(得分:1)

您可以在order by条款中进行任意数学运算,但您最有可能实际返回找到的距离,所以为什么不这样做

SELECT *, long_ugly_distance_calc_here AS distance
...
ORDER BY distance DESC