.NET / SQLでのサークル(経度/緯度)上の点
-
20-09-2019 - |
質問
私は、次のような問題を持っています: Iは、プロジェクトID、および長い/緯度/半径(円)と長い/緯度値を持つテーブルと他のテーブルを持っています。
今、私が最初のテーブルから長い/緯度の値と一致するプロジェクトを見つける必要があります。
これを行う簡単な方法はありますか?
解決
があり、球上の距離を計算するための複数のアルゴリズムがありますが、我々は以下を使用します:
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内にあるときだけ距離を計算、ポイントはおそらく円の内側にあるかどうかの簡単なチェックを行うために必要な情報をご提供します。
所属していません StackOverflow