2011-12-29 12 views
9

私はこれらのパラメータを自分のスクリプトに送ります:Latitude:41.0186経度:28.964701(サンプルです)私は最も近い場所の名前を探したい。これを行う方法? (コードのを変更する必要がありますクエリの)最も近い場所を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

答えて

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メートル正確な式で必要な場合には、ジオイドが、丸いボールないと仮定すると - 私はそれを見つけることができる、とそれを持っていませんこのような回転楕円体の計算は、キロ、数千を超える約10メートルの精度であることを私

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

注意。より高い精度が必要な場合は、VincentyまたはKarneyのアルゴリズムを使用してください。 – 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 
関連する問題