我有一个用户表,我需要根据lat,long找到最近的用户。我也需要距离。两天来,我一直在努力研究半胱氨酸的配方和替代品,但我面临一些错误。
让我们假设我使用lat,长期用于马来西亚吉隆坡(大约3.2,102)。
使用毕达哥拉斯:
SELECT top 10 *,
SQRT(SQUARE(ABS(latitude - 3.2)) + SQUARE(ABS(longitude - 102))) AS distance
FROM lfuser
ORDER BY distance
它给了我“正确”的结果(靠近那一点的用户)。但我无法获得距离(以KM为单位),我知道这并不完全正确。所以我试图使用hasrsine:
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公里来计算近似距离,但我希望得到更正确的结果。
我希望有人可以指出错误。
请不要发布链接到不同的半正式公式的实现。我已经看了两天了。
答案 0 :(得分:2)
过去我曾使用Haversine in SQL 2005
所以我试图将我的程序转换为适应你的情况。如果工作正常,请告诉我
我认为正确的吉隆坡经度和纬度也是3.139003, 101.686855
declare @myLatitude decimal(12,6), @myLongitude decimal(12,6), @EarthRadius decimal(12,6)
select @myLatitude = 3.139003, @myLongitude = 101.686855, @EarthRadius = 6378.137
SELECT top 10 *,
(@EarthRadius * ACOS((SIN(PI() * @myLatitude /180)
* SIN(PI() * Latitude/180))
+ (COS(PI() * @myLatitude /180)
* COS(PI() * Latitude/180)
* COS(PI() * Longitude/180 - PI() * @myLongitude /180))))
as distance
FROM lfuser
ORDER BY distance
希望有所帮助
答案 1 :(得分:0)