Tôi đang cố gắng thực hiện kiểm tra rất hiệu quả để xem liệu hai điểm có cách nhau một dặm hay không.
Cách tiếp cận hiện tại của tôi là tính toán khoảng cách Haversine , và sau đó kiểm tra xem nó có nhỏ hơn một dặm không.
Vấn đề hiệu quả trong trường hợp này bởi vì tôi phải tính toán cờ có / không này cho các bộ hồ sơ lớn.
Tôi chỉ quan tâm liệu họ có ở trong một dặm hay không - không có gì khác về khoảng cách với tôi.
Vì vậy, cách hiệu quả nhất để cho biết hai điểm lat / long nằm trong phạm vi một dặm của nhau là gì?
Đáp lại các bình luận, tôi đang làm điều này trong SQL Server. Mã của tôi ở dưới.
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;