回答

收藏

在ms-sql找到最近的位置

技术问答 技术问答 256 人阅读 | 0 人回复 | 2023-09-14

我把这些参数发给我的脚本:纬度:41.0186经度:28.964701(以示例)。我想找到最近位置的名字。我该怎么办?(查询代码必须更改的地方)$ Y. O: z3 T. W, U7 T
SQL查询:, t& n; P# {/ r) I% g# r' R
            SELECT  Name FROM Location    WHERE Latitude = 41.0186 AND longitude= 28.964701位置表是这样的其实是巨大的表)  W# x0 [7 N; R% J  s. f
Latitude         longitude          Name41.0200500000   40.52349000000                                                                                                                                                                                                                                                                                                                                                                                 a41.0185714000   37.0979240000                                                                                          b41.0184913000   34.037373900000                                                                                                                                                                                                                                         c41.0166667000   39.5833330000                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              d41.0166667000   28.9333333000        e               
) ~7 h9 H# b2 q( Y2 T- w; i    解决方案:                                                                2 w2 @5 Q8 V; ^- f3 q' }" e
                                                                使用此功能( `2 e9 x1 e& \' g) @
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您可以通过个功能进行排序,但是在大数据集中会很慢,所以请尝试预过滤记录集$ S# [* Y. H: q% Q3 y% A
UPD:
1 Q( I& ^# S, L8 N  G  L使用@chopikadze测试数据:& p+ W1 \: `" n
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以下的公式-如果我能找到它,就不要随身携带它
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则