在此SQL查询中返回的单位是“距离”

时间:2015-04-26 02:43:51

标签: mysql haversine

我在使用Google Maps API中的一些纬度/经度相关代码,它为我提供了以下SQL语句

SELECT id, (
  3959 * acos( cos( radians(37) ) *
  cos( radians( lat ) ) *
  cos( radians( lng ) - radians(-122) ) +
  sin( radians(37) ) * sin( radians( lat ) ) ) )
AS distance
FROM marker
HAVING distance < 25
ORDER BY distance LIMIT 0 , 20;

此处链接到Google地图示例:https://developers.google.com/maps/articles/phpsqlsearch_v3

然而,返回的距离超过7,000,而我知道数据库中的所有条目都在50英里之内。我已经使用http://www.movable-type.co.uk/scripts/latlong.html验证了这一点,这也超过了Haversine公式。

所以我很好奇我提供的查询错误,返回:

  

(IMAGE)   http://gyazo.com/ece247747616c5a412edd40c82c4b0ce - (无法上传图片,格式不被接受???)。

比较所有积分
long: 39.410870
lat:  -107.102180

以下是完整查询:

SELECT id,`user_long`,`user_lat`,
( 3959 * acos( cos( radians(39.410870) ) * cos( radians( `user_lat` ) ) * cos( radians( `user_long` ) - radians(-107.102180) ) + sin( radians(39.410870) ) * sin( radians( `user_lat` ) ) ) ) AS distance
FROM `accounts`
ORDER BY distance LIMIT 0 , 20

正如你在结果中看到的那样,它真的很奇怪,因为即使与自身相比,距离也是> 7000。

ID:    1
LONG: 39.410870
LAT:  -107.102180
DIST: 7923.067131806453

1 个答案:

答案 0 :(得分:2)

单位是英里。

看起来您已经反转/交换了纬度和经度。

纬度的有效范围仅为-90到+90,它不能是-107(度)。

如果您打算在丹佛以西的科罗拉多州指定一个位置,在大章克申的中途,请交换纬度和经度值。

&#34;大圆圈计算&#34;看起来是正确的,它将返回里程,因为你乘以3959.(你需要用不同的常数替换该常数以获得除里程之外的距离单位。)

看起来你已经在表达式中正确地放置了固定的纬度和经度...我怀疑它是user_latuser_lng中交换的值/逆转。