我在使用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
答案 0 :(得分:2)
单位是英里。
看起来您已经反转/交换了纬度和经度。
纬度的有效范围仅为-90到+90,它不能是-107(度)。
如果您打算在丹佛以西的科罗拉多州指定一个位置,在大章克申的中途,请交换纬度和经度值。
&#34;大圆圈计算&#34;看起来是正确的,它将返回里程,因为你乘以3959.(你需要用不同的常数替换该常数以获得除里程之外的距离单位。)
看起来你已经在表达式中正确地放置了固定的纬度和经度...我怀疑它是user_lat
和user_lng
中交换的值/逆转。