使用PHP和MySQL计算地理位置距离

时间:2012-01-31 17:50:02

标签: php mysql geolocation where-clause

我有一个php脚本和一个地理定位数据库。

目前我的用户可以输入他们的邮政编码,使用Yahaa我得到他们的地理位置。

现在我有他们的地理位置我想写一个脚本,按照距离顺序加载他们的本地业务。我猜这样做我需要从数据库中加载与用户当前地理位置具有最相似坐标的记录。我试过这段代码:

$sql = "SELECT * FROM dirlistings WHERE ABS(latitude - $lat) AND ABS(longitude - $long)";

然而,它只是按正常顺序显示结果。

我错过了什么吗?

5 个答案:

答案 0 :(得分:3)

我认为你想在那里找一个ORDER条款。

真正想要的是Haversine公式:MySQL Great Circle Distance (Haversine formula)

答案 1 :(得分:3)

这比你想象的要复杂得多。

这篇文章很有帮助我。虽然它是用javascript编写的,但你很容易将其改为php。

http://www.movable-type.co.uk/scripts/latlong.html

答案 2 :(得分:2)

你错过了很多东西。为了做你想做的事,你需要计算(使用毕达哥拉斯定理)两点之间的距离,然后按这个距离排序。

您可以通过以下方式计算距离( (lat - $lat)^2 + (lon - $lon)^2 )^0.5

SQRT(
    POW(latitude - ' . $lat . ',2) 
    + 
    POW(longitude - ' . $lon . ',2)
) AS distance

然后它就像:

一样简单
ORDER BY distance ASC

答案 3 :(得分:2)

请注意,如果您谈论的距离很远(例如数千英里),那么圆距离就不够准确,因为地球的表面并不平坦。如果您需要更好的地理距离计算公式,可以使用以下内容:

$dlat = ((double)$lat) / 57.29577951;
$dlon = ((double)$lon) / 57.29577951;

$sql = "SELECT *
        FROM dirlistings
        WHERE 3963.0 * acos(sin(latitude / 57.29577951) * sin($dlat) + cos(latitude / 57.29577951) * cos($dlat) * cos($dlon - longitude / 57.29577951)) < MAX_DIST
        ORDER BY acos(sin(latitude / 57.29577951) * sin($dlat) + cos(latitude / 57.29577951) * cos($dlat) * cos($dlon - longitude / 57.29577951))
        ";

此处的距离以英里为单位 - 确保指定正确的最大距离 - 此公式将为距离甚至一万英里的距离提供非常接近的结果。请注意,虽然这种计算是时间和功耗密集的,如果你不处理大距离(即不超过几百英里),那么你应该使用更快的近似值。

答案 4 :(得分:1)

最后尝试ORDER BY latitude, longitude。应该这样做或大约做到。