2

関連付けられた緯度と経度の座標を持つ空港のリストを含むテーブルがある場合、別の座標から 100 マイル以内にある空港のリストを取得するにはどうすればよいでしょうか? 私の最終的な目標は、ユーザーが都市で検索し、その都市の緯度と経度から 100 マイル以内にある空港を見つけることです。私はすべてのデータを持っていますが、どこから始めればよいかわかりません。

私のデータは SQL Server にあります。

4

5 に答える 5

6
create function dbo.F_GREAT_CIRCLE_DISTANCE
(
    @Latitude1  float,
    @Longitude1 float,
    @Latitude2  float,
    @Longitude2 float
)
returns float as
begin
    declare @radius float

    declare @lon1  float
    declare @lon2  float
    declare @lat1  float
    declare @lat2  float

    declare @a float
    declare @distance float

    -- Sets average radius of Earth in Miles
    set @radius = 3956

    -- Convert degrees to radians
    set @lon1 = radians( @Longitude1 )
    set @lon2 = radians( @Longitude2 )
    set @lat1 = radians( @Latitude1 )
    set @lat2 = radians( @Latitude2 )

    set @a = sqrt(square(sin((@lat2-@lat1)/2.0E)) + (cos(@lat1) * cos(@lat2) * square(sin((@lon2-@lon1)/2.0E))) )
    set @distance = @radius * ( 2.0E *asin(case when 1.0E < @a then 1.0E else @a end ))

    return @distance
end
于 2013-04-16T18:52:56.077 に答える
1

次のようなことができます。

 --SELECT Points closer than @radius
select * from #Points p
WHERE power(p.x - @locX, 2) + POWER(p.y - @locY, 2) < POWER(@radius,2)

(これはhttp://www.sqlservercentral.com/Forums/Topic1228111-8-1.aspx#bm1229043から恥知らずにリッピングされたもので、SQL + Pyhtagoras の Google 検索で見つかりました)。

于 2013-04-16T18:48:58.553 に答える
0

空港がポイント 0,0 にある場合、半径 30 マイル以内のすべての空港は円の内側にある必要があります。ポイントが円の内側にあるかどうかをテストするには、各平方方程式をテストする必要があります: sqrt(X*X + Y*Y) < R、ここで、X、Y - 各都市の位置、R = 100 マイル

于 2013-04-16T18:46:45.243 に答える
0

'as the crow flys' の式は次のとおりです。2 点間の距離: Haversine

formula:     a = sin²(Δφ/2) + cos(φ1).cos(φ2).sin²(Δλ/2)
c = 2.atan2(√a, √(1−a))
d = R.c

ここで、φ は緯度、λ は経度、R は地球の半径 (平均半径 = 6,371km) です。三角関数に渡す角度はラジアンである必要があることに注意してください。

このコードを SQL に変換できます

JavaScript: 
var R = 6371; // km
var dLat = (lat2-lat1).toRad();
var dLon = (lon2-lon1).toRad();
var lat1 = lat1.toRad();
var lat2 = lat2.toRad();

var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
        Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(lat1) * Math.cos(lat2); 
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
var d = R * c;

数学関数の T-SQL ページへのリンクは次のとおりです: http://msdn.microsoft.com/en-us/library/ms188919.aspx

于 2013-04-16T18:50:06.170 に答える