次の問題があります。long/lat値を持つテーブルと、project-idとlong / lat / radius(円)を持つ別のテーブルがあります。
次に、最初のテーブルのlong/lat値に一致するプロジェクトを見つける必要があります。
それを行う簡単な方法はありますか?
次の問題があります。long/lat値を持つテーブルと、project-idとlong / lat / radius(円)を持つ別のテーブルがあります。
次に、最初のテーブルのlong/lat値に一致するプロジェクトを見つける必要があります。
それを行う簡単な方法はありますか?
球上の距離を計算するアルゴリズムは複数ありますが、以下を使用します。
create function GetDistance(
@latitudeFrom decimal(30,10),
@longitudeFrom decimal(30,10),
@latitudeTo decimal(30,10),
@longitudeTo decimal(30,10)
)
RETURNS float
AS
BEGIN
DECLARE @distance float
SET @distance = ROUND(6378.137 * ACOS(
convert(decimal(30,10),
(SIN(RADIANS(@latitudeFrom)) * SIN(RADIANS(@latitudeTo))) +
(COS(RADIANS(@latitudeFrom)) * COS(RADIANS(@latitudeTo)) *
COS(RADIANS(@longitudeTo) - RADIANS(@longitudeFrom))))), 15)
RETURN @distance
END
go
(6378.137 - は地球の半径)
地球上の2点間の距離を計算できるようになったら、クエリを作成できます
select *
from Table1, Project
where dbo.GetDistance(
Table1.lat, Table1.lon,
Project.lat, Project.lon) < @YouRadius
どこで @YouRadius - 円のパラメーター化された半径
比較的簡単: ポイントと円の中心の間の大円距離を計算します。距離が半径より小さい場合、点は円の中にあり、そうでない場合は円の中にあります。円周上にある場合は、あなたが決めます。大圏距離の計算に関する SO の議論がいくつかあります。それらを見てください。
速度を上げるために、各円の定義とともに、その最小境界ボックスを緯度/経度の「正方形」で保存することを検討してください。これにより、ポイントが円の内側にあるかどうかを簡単にチェックし、ポイントが mbb の内側にある場合にのみ距離を計算するために必要な情報が得られます。