【发布时间】:2011-07-05 08:43:17
【问题描述】:
所以我试图显示给定纬度/经度范围内的地点列表。我对此没有任何问题:
一英里以内的地方 (地点列表...)
使用类似的东西
SELECT * FROM places WHERE lat < $latmax AND lat > $latmin AND lng < $lngmax AND lng > $lngmin
然后我想列出两英里内的地点,但不是在一英里内——也就是说,我不想重复第一次查询的结果。
这是我尝试过的一个版本:
$milesperdegree = 0.868976242 / 60.0 * 1.2;
// 1 mile -- this works
$degrees = $milesperdegree * 1;
$latmin = $lat - $degrees;
$latmax = $lat + $degrees;
$lngmin = $lng - $degrees;
$lngmax = $lng + $degrees;
$query = "SELECT * FROM places WHERE lat < $latmax AND lat > $latmin AND lng < $lngmax AND lng > $lngmin";
// 2 miles -- this doesn't work
$degrees_2 = $milesperdegree * 2;
$latmin_2 = $lat - $degrees_2;
$latmax_2 = $lat + $degrees_2;
$lngmin_2 = $lat - $degrees_2;
$lngmax_2 = $lat + $degrees_2;
$query = "SELECT * FROM places WHERE ";
$query .= "lat BETWEEN $latmax AND $latmax_2 AND lng BETWEEN $lngmax AND $lngmax_2 OR ";
$query .= "lat BETWEEN $latmin AND $latmin_2 AND lng BETWEEN $lngmin AND $lngmin_2 OR ";
$query .= "lat BETWEEN $latmax AND $latmax_2 AND lng BETWEEN $lngmin AND $lngmin_2 OR ";
$query .= "lat BETWEEN $latmin AND $latmin_2 AND lng BETWEEN $lngmax AND $lngmax_2";
那不是这样做的。我猜这只是周日下午我无法理解的一些逻辑,但我可能也做错了其他事情。非常感谢任何输入。
【问题讨论】:
-
您是否意识到这个脚本只是围绕该点创建一个框(而不是一个圆圈)?此外,$milesperdegree 是纬度的函数(从数学上讲)。有一个很好的脚本 - 尽管在 JavaScript - link
-
我没有意识到圆形/方形位。我猜经度变量是 $lng +/- x 英里,而不是 $milesperdegree?
-
至于圆形/方形部分——勾股定理的简单应用就可以解决这个问题。
-
顺便说一句,
BETWEEN ... AND+1,不知道那个 ;)
标签: php mysql sql distance latitude-longitude