
使用这个功能
CREATE FUNCTION dbo.DictanceKM(@lat1 FLOAT, @lat2 FLOAT, @lon1 FLOAT, @lon2 FLOAT)RETURNS FLOAT ASBEGIN RETURN ACOS(SIN(PI()*@lat1/180.0)*SIN(PI()*@lat2/180.0)+COS(PI()*@lat1/180.0)*COS(PI()*@lat2/180.0)*COS(PI()*@lon2/180.0-PI()*@lon1/180.0))*6371END
您可以通过此功能进行排序,但是在大型数据集上这将非常慢,因此请尝试对记录集进行预过滤
UPD:
使用@chopikadze的测试数据:
declare @lat float, @lng floatselect @lat = 41.0186, @lng = 28.964701declare @Location table(Latitude float, Longtitude float, Name nvarchar(50))insert into @Location(Latitude, Longtitude, Name) values (41.0200500000, 40.5234490000, 'a')insert into @Location(Latitude, Longtitude, Name) values (41.0185714000, 37.0975924000, 'b')insert into @Location(Latitude, Longtitude, Name) values (41.0184913000, 34.0373739000, 'c')insert into @Location(Latitude, Longtitude, Name) values (41.0166667000, 39.5833333000, 'd')insert into @Location(Latitude, Longtitude, Name) values (41.0166667000, 28.9333333000, 'e')SELECT ABS(dbo.DictanceKM(@lat, Latitude, @lng, Longtitude)) DistanceKm, * FROM @LocationORDER BY ABS(dbo.DictanceKM(@lat, Latitude, @lng, Longtitude))
假设地球不是大地水准面,而是圆球,如果您需要精确到1m以下的公式-我可以找到它,就不要随身携带它
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)