SQL中的Haversine公式定义

3

你好,我目前正在开发一款Android应用程序,该程序将商店的详细信息存储在SQL数据库中,用户可以使用该应用程序搜索周围的商店。

我发现了一个名为Haversine的公式,可以通过经纬度计算两点之间的距离。

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

我很困惑,不知道哪个经纬度值对应什么!如果有人能够重写上面的代码,使我的用户具有lat1和lng1的位置,而商家具有lat2和lng2。另外,你能告诉我

中的a是什么意思吗?

  acos 

1
你是在使用MySQL还是SQL Server?如果是后者,它有一种原生的地理数据类型,可以让你进行这种计算而不需要进行繁琐的数学运算。 - undefined
你能给我一些关于这个的信息吗?当使用SQL时,如果我以这种数学方式使用该属性,在SQL Server中会增加我的服务器成本吗?与您提到的服务相比呢?@BenThul - undefined
有很多需要了解的东西。这是一个不错的开始:http://msdn.microsoft.com/en-us/library/cc280766.aspx。至于按照你目前的方式进行操作,你永远无法使用索引来执行该搜索。地理空间数据类型带有索引功能,因此像“获取某个半径范围内的点”这样的查询非常高效。 - undefined
1
是的。这涉及到一个叫做SARGability的概念。也就是说,为了满足你的查询,现在需要计算从给定点到每个其他点的距离,然后只返回那些符合你的条件(在这种情况下,距离 < 25)的点。通过使用地理数据类型,引擎能够聪明地排除掉很多点,并能够高效地确定那些有可能满足条件的点。 - undefined
1
我已经为你指出了SQL Server的相关文档。如果你正在使用SQL Server,那就仔细阅读文档并尝试一些方法。如果你没有使用SQL Server,那么你需要查看你所使用的关系数据库管理系统中是否有类似的功能。 - undefined
显示剩余2条评论
2个回答

9
lat/lng的顺序并不重要。可以这样理解…从A点到B点的距离和从B点到A点的距离是相同的。
在您的代码示例中,37是纬度点,而-122是经度点。
acos是反余弦三角函数。这里有一个解释: ArcCosine
SELECT id, ( 3959 * acos( cos( radians(Lat1) ) * cos( radians( Lat2 ) ) * cos( radians(Lng2) - radians(Lng1) ) + sin( radians(Lat1) ) * sin( radians(Lat2)))) AS distance 
FROM     markers 
HAVING distance < 25 
ORDER BY distance 
LIMIT 0 , 20;

哈,我不是指那个意思,我问的是对于我的用户,我有一个纬度和经度的值,商店的情况也一样,但上面的代码中我只有两个变量lat和lng! - undefined
我明白了。我的意思是,你代码中的37表示纬度,-122表示经度。你不应该硬编码这些数字,而是应该将它们设为变量。 - undefined

2

由于网络上关于haversine SQL的答案很少,因此我将提供完整的版本,该版本改编自https://en.wikipedia.org/wiki/Haversine_formula,方便您进行复制粘贴:

CREATE FUNCTION haversine(Lat1, Lng1, Lat2, Lng2) AS 
    2 * 6335 
        * asin(sqrt(
            pow(sin((radians(Lat2) - radians(Lat1)) / 2), 2)
            + cos(radians(Lat1))
            * cos(radians(Lat2))
            * pow(sin((radians(Lng2) - radians(Lng1)) / 2), 2)
        ));

我需要它来访问https://duckdb.org网站。希望能对某些人有所帮助!


1
似乎缺少sqrt的arcsin? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接