2012-01-31 108 views
1

我有一个php脚本和一个地理定位数据库。使用PHP和MySQL来计算地理位置距离

此刻我的用户可以输入自己的邮政编码,使用Yahaa我得到他们的地理位置信息。

现在,我有自己的地理位置,我想写加载在距离的顺序与其本地商家的脚本。我猜这样做我需要加载数据库中与用户当前地理位置坐标最相似的记录。我试过这个代码:

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

但是它只是以正常顺序显示结果。

我错过了什么吗?

+0

**警告**您的代码易受sql注入攻击。 – 2012-01-31 17:54:18

+0

我正在做这样的事情,事情是它存储在家里的电脑,我不在那里,我可以提供你需要的所有信息。因为地球是一个球体,所以不仅仅是减法。 – Grigor 2012-01-31 18:00:00

回答

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)) 
     "; 

的位置距离英里 - 确保指定正确的最大距离 - 这公式将给予非常密切的结果甚至一万英里的距离。请注意,这样的计算相当耗时且耗能,如果你不处理大距离(即不超过几百英里),那么你应该使用更快的近似。

+0

我已经指定了最大距离,什么都没有出现? – 2012-01-31 18:18:14

+0

在这种情况下,我建议你实际检查你的数据。我们已经使用这个公式和我们的(有效)数据已经有好几年了,并取得了巨大的成功。 – 2012-01-31 23:58:14

+0

对不起,需要一段时间才能回复。随着一些搞乱我得到它的工作。我可以问我应该把我的max_dist设置为什么吗?它只在价值很高时才有用,当我只寻找最大40英里的地点时,价值应该是多少。 – 2012-02-04 16:00:36

1

尝试ORDER BY latitude, longitude结束。这应该做或大致做到这一点。

+0

我不认为这会有用。排序必须通过使用经度和纬度的公式的结果完成,而不是单独进行。 – 2012-01-31 18:07:36

+0

你是完全正确的。哇。我几年没有这样做了,我忘记了这个公式。 – Tim 2012-01-31 18:43:36

3

我想你想在某个地方有一个ORDER条款。

但你真的是什么haversine公式:MySQL Great Circle Distance (Haversine formula)

+1

在短距离(任何小于〜50英里的距离)内,为了计算距离(至少在该域中),可以将地球视为平面。 – 2012-01-31 18:02:46

2

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

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

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

然后,它的那样简单:

ORDER BY distance ASC