2011-12-29 56 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