PHP & MySQL 地理距离计算

标签 php mysql latitude-longitude haversine

我有一个可用的 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/

相关文章:

javascript - 将 header 脚本传递给 AJAX 加载的内容

mysql - Yii2:带 CASE 的 OrderBy(订购手册)

mysql - 用于搜索城市、州和国家/地区(如 expedia.co.in)的 SQL 查询

mysql - 在mysql中使用纬度和经度查找两点之间的距离

php - 交响乐团 : Pagination with inner join

php - 在 WordPress 上更新 mysql 不起作用

mysql - 从存储过程返回游标

java - Android中如何不使用getLastKnownLocation方法获取当前经纬度?

java编码确定点是否位于多边形(矩形)内部的解决方案

php - 无论输入如何,搜索引擎的查询都会返回相同的结果