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;