我在Google中处理一些与纬度/经度相关的代码,它为我提供了以下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示例:v3
然而,返回的距离超过7,000,而我知道数据库中的所有条目都在50英里以内。我已经用http://www.movable-type.co.uk/scripts/latlong.html验证了这一点,它也讨论了Haversine公式。
因此,对于提供的查询做错了什么,我很好奇,它返回:
(图像) 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
发布于 2015-04-25 19:54:49
单位以英里为单位。
看起来你的纬度和经度颠倒了。
纬度的有效范围只有-90到+90,不能是-107 (度).
如果您打算在科罗拉多州指定一个位置,位于丹佛以西,距离大交叉口一半,请将值替换为纬度和经度。
“大圆计算”看起来是正确的,它将返回英里,因为你是乘以3959。(你需要用不同的常量来代替这个常量,以得到距离单位,而不是英里。)
看起来你把固定的纬度和经度正确地放在了表达式中.我怀疑是user_lat
和user_lng
中的值被交换/反转了。
https://stackoverflow.com/questions/29873091
复制