2つの緯度/経度を指定した場合、それらが互いに1マイル以内にあるかどうかをどのように確認できますか?


8

2つのポイントが互いに1マイル以内にあるかどうかを確認する非常に効率的なチェックを実装しようとしています。

私の現在のアプローチは、Haversine距離を計算し、それが1マイル未満かどうかを確認することです。

大きなレコードセットの場合は、このyes / noフラグを計算する必要があるため、この場合は効率が重要になります。

それらが1マイル以内にあるかどうかだけを気にします -距離については何も私には関係ありません。

それでは、2つの緯度/経度のポイントが互いに1マイル以内にあるかどうかを確認する最も効率的な方法は何ですか?

コメントに応えて、私はSQL Serverでこれを行っています。私のコードは以下です。

CREATE FUNCTION dbo.USR_UFN_HAVERSINE_DISTANCE
(
  @LAT1 FLOAT(18)
 ,@LONG1 FLOAT(18)
 ,@LAT2 FLOAT(18)
 ,@LONG2 FLOAT(18)
 ,@UnitOfMeasure NVARCHAR(10) = 'KILOMETERS'
)
RETURNS FLOAT(18)
AS
BEGIN
  DECLARE
    @R FLOAT(8)
   ,@DLAT FLOAT(18)
   ,@DLON FLOAT(18)
   ,@A FLOAT(18)
   ,@C FLOAT(18)
   ,@D FLOAT(18)
   ;
  SET @R =
    CASE @UnitOfMeasure
      WHEN 'MILES'      THEN 3956.55 
      WHEN 'KILOMETERS' THEN 6367.45
      WHEN 'FEET'       THEN 20890584
      WHEN 'METERS'     THEN 6367450
      ELSE 6367.45  --km
    END
  SET @DLAT = RADIANS(@LAT2 - @LAT1);
  SET @DLON = RADIANS(@LONG2 - @LONG1);
  SET @A = SIN(@DLAT / 2) 
         * SIN(@DLAT / 2) 
         + COS(RADIANS(@LAT1))
         * COS(RADIANS(@LAT2)) 
         * SIN(@DLON / 2) 
         * SIN(@DLON / 2);
  SET @C = 2 * ASIN(MIN(SQRT(@A)));
  SET @D = @R * @C;
  RETURN @D;
END;

あなたの研究はこれまでに可能性のある候補として何を見つけましたか?
PolyGeo

1
ソフトウェアソリューションをお探しですか、それとも独自のコードを作成していますか?これまでに何を試しましたか?
MaryBeth

2
ヘイバーシン距離を確認するだけの何が問題になっていますか 平面距離を確認するだけで、処理時間を少し節約できます。
トム

4
geomA.STDistance(geomB)<dを使用できますか?
Ian Turton

2
@Tomによって提案された「平面距離」チェックは、誤って解釈される可能性があります。正しく機能するには、注意深い解釈が必要です。1つは次のとおりです。180度子午線または極でポイントを比較する必要がないと仮定すると、ピタゴラスの公式を座標(lat1、cos(lat1)* lon1)、(lat2、cos(lat2)* lon2)に適用できます。言い換えると、(lat1-lat2)^ 2 +(cos(lat1)* lon1-cos(lat2)* lon2)^ 2を1/69 ^ 2(すべて度)と比較すると、2つの点が1マイル(パーセントの精度で)。これがHaversineより速いかどうかは不明です。
whuber

回答:


2

この方法を試してください。最善ではないかもしれませんが、検索スペースをいくつかに制限することで、プロセスの高速化に役立ちます。

  1. すべてのポイントの周りに0.5マイルのバッファーを作成する
  2. 結果のバッファをディゾルブします-マルチポリゴンがないことを確認します
  3. このポリゴンの外側にあるポイントはすべてサーチスペースから除外されます

空間インデックスを構築していることを確認し、この手順によってクエリの応答時間が改善されたかどうかを確認します。1マイルを基準としてテーブルの近く(ESRI ArcGISにツールがあります)を構築して、アプローチを調整することもできます。


バッファーは半径1マイルである必要がありますね。
radouxju 2016年

@radouxju、各ポイントから2つの1/2マイルは1マイルの距離です。
addcolor 2016年

1
わかりません。事前定義されたポイントのセットに基づいてポリゴンレイヤーを作成し、このポリゴンを「ポリゴンインポイント」アルゴリズムで使用して、新しいポイントが1マイル以内にあるかどうかを確認します(半径1マイルのバッファーを計算する必要があります) ...または、すべてのポイントを0.5マイルバッファーで直接操作して、ディゾルブし、(計算する必要がある)面積に基づいて分離バッファーを選択します。1)真の1マイルバッファーの作成は非常にコストが高い2)ディゾルブすごく高価。ポリゴンを数回再利用する場合、オプション1だけが私にとって意味があります。
radouxju 2016年

2

グローバルな範囲で作業している場合は、単純な簡単なテストによって、多くの罪と余剰の計算を回避できます。

hasrsineを計算する前にポイントをスクリーニングする最初のテストは、@ DLAT> 0.015度のポイントを除外することです(より正確かもしれませんが、私は安全を好みます)。

2番目のステップでは、指定した緯度範囲で@DLONを使用して、控えめな値(-60〜60度など、@ DLON> 0.03(= 0.015 / cos(60))を除外)でこれを行うこともできます。

1マイルは非常に小さいので、これらの2つのルールを使用してHaversineを計算する必要はほとんどなく(極域で作業する場合を除く)、前述のようにHaversineをピタゴラス(2コサイン対2サインおよび2コサイン)で置き換えることができます。 @whuberによる。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.