2011-12-29 54 views
9

我发送这些参数我的脚本:Latitude:41.0186 Longitude:28.964701(这是示例)。我想找到最近的位置的名字。这个怎么做? (查询的WHERE代码的必须改变)在ms-sql中找到最近的位置

SQL查询:

SELECT Name FROM Location 
    WHERE Latitude = 41.0186 AND longitude= 28.964701 

位置表喜欢这样的:(在真实的,这是巨大的表)

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 
+1

很好的问题+1 – evilone 2011-12-29 12:04:52

回答

4

使用此功能

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 

您可以通过此功能顺序,但对大数据集将是非常缓慢的,所以尽量预过滤记录

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)) 

假设地球不是一个大地水准面,但圆球形,如果你需要1米精确公式下 - 我能找到它,没有它与我

1

我觉得这不是那么容易正如它的感觉。您必须执行一些三角函数计算才能获得与您所在位置最接近的位置。

找到很好的JavaScript示例:

var R = 6371; // km Radius of earth 
var dLat = (lat2-lat1).toRad(); 
var dLon = (lon2-lon1).toRad(); 
var a = Math.sin(dLat/2) * Math.sin(dLat/2) + 
     Math.cos(lat1.toRad()) * Math.cos(lat2.toRad()) * 
     Math.sin(dLon/2) * Math.sin(dLon/2); 
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
var d = R * c; 

它给你点之间的距离。

或者你可以尝试在漫长的平方增量值和拉特的排序顺序传递:

((<lat> - LAT_COLUMN) * (<lat> - LAT_COLUMN) + 
(<lng> - LNG_COLUMN) * (<lng> - LNG_COLUMN)) 
+0

注意,球体的计算,如这些都是精确到数千公里约10米。如果需要更高的精确度,请使用Vincenty或Karney的算法。 – N8allan 2014-08-29 16:24:17

1
declare @latitude float, @longitude float 
select @latitude = 41.0186, @longitude = 28.964701 

SELECT [Name] --, other columns 
     ,Distance 
     from 
     (
     select 
     [Name]  --, other columns 
     ,(3959 * acos(cos(radians(@latitude)) * cos(radians([Lattitude])) * cos(radians([Longitude]) 
     - radians(@longitude)) + sin(radians(@latitude)) * sin(radians([Lattitude])))) 
     AS Distance FROM [dbo].[Location] 
    ) as x 
    where Distance < 5 
    order by distance