我有一张用户表,我需要根据 lat、long 找到最近的用户。我也需要距离。两天来我一直在努力使用haversine公式和替代方案,但我遇到了一些错误。
假设我用 lat, long 表示马来西亚吉隆坡(大约 3.2, 102)。
使用毕达哥拉斯:
SELECT top 10 *,
SQRT(SQUARE(ABS(latitude - 3.2)) + SQUARE(ABS(longitude - 102))) AS distance
FROM lfuser
ORDER BY distance
它给了我“正确”的结果(接近那个点的用户)。但我无法得到距离(以公里为单位),我知道这并不完全正确。所以我尝试使用haversine:
SELECT TOP 10 *,
ROUND(2 * ASIN(SQRT(POWER(SIN(((3.2 / 180) * PI()
- (latitude / 180) * PI()) / 2) ,2) + COS((3.2 / 180) * PI())
* COS((latitude / 180) * PI()) * POWER(SIN(((102 / 180) * PI()
- (longitude / 180) * PI()) / 2), 2))) * 6367, 4) AS distance
FROM lfuser
ORDER BY distance
奇怪的是,这给了我其他地方的用户。实际上,前 1 个结果是加纳的用户,其 lat=5.55 和 long=-0.20。
这让我发疯......我当然可以通过将毕达哥拉斯结果乘以 110 公里来计算近似距离,但我想要更正确的结果。
我希望有人能指出什么是错的。
请不要发布指向haversine公式等不同实现的链接。我已经看了两天了。