2011-12-29 16 views
9

Bu paramaters gönderir benim komut dosyası: Enlem: 41.0186 Boylam: 28.964701 (örnek). en yakın konumun adını bulmak istiyorum. bu nasıl yapılır?ms-sql en yakın yeri bulmak

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

Yer tablo bunu beğendi:

Sql Sorgu (sorgu kod adlı değiştirilmelidir nerede)

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

iyi bir soru 1 – evilone

cevap

4

Kullanım

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 

Bu işlev tarafından sipariş edebilirsiniz bu fonksiyon, AMA büyük veri setleri üzerinde çok yavaş olabilir, bu yüzden Recordset'e

UPD'yi ön filtresi dener:

chopikadze test verilerinin @ kullanma

:

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

Earth 1m kesin formülü altında gerekirse, bir jeoit ama yuvarlak top DEĞİLDİR varsayarsak - Onu bulabilirsem, onu yok bunlar gibi küremsi hesaplamalar km binlerce yıldır, yaklaşık 10 metre doğru olduğunu bana

1

bu kadar kolay olmadığını düşünüyorum (gerçek, bu büyük tablodur) hissettiği gibi. Bulunduğunuz yere en yakın posizyonu elde etmek için bazı trigonometri hesaplamaları yapmalısınız. Size nokta arasındaki mesafeyi verir

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; 

:

güzel JavaScript örneği bulundu.

Yoksa kare delta uzun değerleri ve Yanal bir sıralama düzeninde geçmek deneyebilirsiniz:

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

Not. Daha yüksek doğruluk gerekiyorsa, Vincenty veya Karney'nin algoritmalarını kullanın. – N8allan

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 
İlgili konular