ozk*_*ank 9 sql sql-server sql-server-2008
我发送这些参数我的脚本:纬度:41.0186经度:28.964701(它是样本).我想找到最近的位置的名字.这该怎么做?(查询必须更改代码的地方)
Sql查询:
SELECT Name FROM Location
WHERE Latitude = 41.0186 AND longitude= 28.964701
Run Code Online (Sandbox Code Playgroud)
位置表喜欢这样:(实际上,这是巨大的表)
Latitude longitude Name
41.0200500000 40.5234490000 a
41.0185714000 37.0975924000 b
41.0184913000 34.0373739000 c
41.0166667000 39.5833333000 d
41.0166667000 28.9333333000 e
Run Code Online (Sandbox Code Playgroud)
使用此功能
CREATE FUNCTION dbo.DictanceKM(@lat1 FLOAT, @lat2 FLOAT, @lon1 FLOAT, @lon2 FLOAT)
RETURNS FLOAT
AS
BEGIN
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))*6371
END
Run Code Online (Sandbox Code Playgroud)
您可以通过此功能订购,但是对于大型数据集,它将非常慢,因此请尝试预先过滤记录集
UPD:
使用@ chopikadze的测试数据:
declare @lat float, @lng float
select @lat = 41.0186, @lng = 28.964701
declare @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 @Location
ORDER BY ABS(dbo.DictanceKM(@lat, Latitude, @lng, Longtitude))
Run Code Online (Sandbox Code Playgroud)
假设地球不是大地水准面,而是圆球,如果你需要1米以下的确切公式 - 我可以找到它,不要跟我一起