如何解决查找与其他用户的距离的问题Sql Server 2005-Haversine
| 我有一个与用户相关的表,我需要根据纬度,经度找到最近的用户。我也需要距离。我一直在努力使用haversine公式和替代方法,但是已经遇到了一些错误。 让我们举个例子,我在马来西亚吉隆坡使用经纬度(大约为3.2、102)。 使用毕达哥拉斯:SELECT top 10 *,SQRT(SQUARE(ABS(latitude - 3.2)) + SQUARE(ABS(longitude - 102))) AS distance
FROM lfuser
ORDER BY distance
它给我“正确”的结果(接近该点的用户)。但是我无法从中得出距离(以KM为单位),我知道这并不完全正确。因此,我尝试使用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 kms来计算一个近似的距离,但是我想要更正确的结果。
我希望有人指出什么地方出了问题。
请不要发布指向hasversine公式等不同实现方式的链接。我已经看了两天了。
解决方法
过去我曾用
Haversine in SQL 2005
,所以我尝试转换程序以适应您的情况。让我知道工作是否顺利
我还认为正确的吉隆坡经度和纬度是3.139003,101.686855
declare @myLatitude decimal(12,6),@myLongitude decimal(12,@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
希望能帮助到你
, 现在只是一个快速答案。如果您使用的是SQL Server 2008,则应使用地理位置类型(以您的情况为准)来存储位置。有用于处理点之间距离的内置方法。从这里开始
您可能要在以下方面问这个问题:gis.stackexchange.com,专门研究此领域。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。