関連付けられた緯度と経度の座標を持つ空港のリストを含むテーブルがある場合、別の座標から 100 マイル以内にある空港のリストを取得するにはどうすればよいでしょうか? 私の最終的な目標は、ユーザーが都市で検索し、その都市の緯度と経度から 100 マイル以内にある空港を見つけることです。私はすべてのデータを持っていますが、どこから始めればよいかわかりません。
私のデータは SQL Server にあります。
関連付けられた緯度と経度の座標を持つ空港のリストを含むテーブルがある場合、別の座標から 100 マイル以内にある空港のリストを取得するにはどうすればよいでしょうか? 私の最終的な目標は、ユーザーが都市で検索し、その都市の緯度と経度から 100 マイル以内にある空港を見つけることです。私はすべてのデータを持っていますが、どこから始めればよいかわかりません。
私のデータは SQL Server にあります。
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
次のようなことができます。
--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 検索で見つかりました)。
空港がポイント 0,0 にある場合、半径 30 マイル以内のすべての空港は円の内側にある必要があります。ポイントが円の内側にあるかどうかをテストするには、各平方方程式をテストする必要があります: sqrt(X*X + Y*Y) < R、ここで、X、Y - 各都市の位置、R = 100 マイル
'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