Cho hai lat / long, làm thế nào tôi có thể biết nếu chúng ở trong phạm vi 1 dặm của nhau?


8

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;

Những gì đã nghiên cứu của bạn trở thành một ứng cử viên có thể cho đến nay?
PolyGeo

1
Bạn đang tìm kiếm một giải pháp phần mềm hoặc tạo mã của riêng bạn? Bạn đã thử những gì cho đến nay?
MaryBeth

2
Có gì sai khi chỉ kiểm tra khoảng cách haversine? Bạn có thể tiết kiệm một chút thời gian xử lý bằng cách chỉ kiểm tra khoảng cách hai mặt phẳng - ở một dặm, haversine sẽ không tạo ra nhiều sự khác biệt.
Tom

4
bạn có thể sử dụng geomA.STDistance (geomB) <d không?
Ian Turton

2
Kiểm tra "khoảng cách phẳng" được đề xuất bởi @Tom có ​​thể dễ dàng bị hiểu sai: để hoạt động chính xác, nó cần được giải thích cẩn thận. Một là như sau. Giả sử bạn không bao giờ phải so sánh các điểm trên kinh tuyến 180 độ hoặc các cực, bạn có thể áp dụng công thức Pythagore cho các tọa độ (lat1, cos (lat1) * lon1), (lat2, cos (lat2) * lon2). Nói cách khác, so sánh (lat1-lat2) ^ 2 + (cos (lat1) * lon1-cos (lat2) * lon2) ^ 2 đến 1/69 ^ 2 (tất cả tính bằng độ) cho bạn biết hai điểm có cách nhau không một dặm (đến độ chính xác của một phần trăm). Liệu điều này có nhanh hơn Haversine hay không vẫn chưa rõ ràng.
whuber

Câu trả lời:


2

Hãy thử phương pháp này - có thể không phải là tốt nhất nhưng có thể giới hạn không gian tìm kiếm của bạn ở một số và do đó giúp bạn tăng tốc quá trình.

  1. Tạo bộ đệm nửa dặm xung quanh mỗi điểm
  2. Hòa tan các bộ đệm kết quả - không có đa bội
  3. Bất kỳ điểm nào nằm ngoài đa giác này hiện được loại trừ khỏi không gian tìm kiếm

Hãy chắc chắn rằng bạn đã xây dựng các chỉ mục không gian và xác minh xem quy trình này có cải thiện thời gian phản hồi truy vấn của bạn hay không. Bạn cũng có thể tinh chỉnh cách tiếp cận bằng cách xây dựng gần bảng (ESRI ArcGIS có một công cụ) với 1 dặm làm tiêu chí.


bộ đệm cần phải có bán kính một dặm, phải không?
radouxju

@radouxju, hai 1/2 dặm từ mỗi điểm là 1 dặm xa.
addcolor

1
Tôi không hiểu Bạn muốn tạo một lớp đa giác dựa trên tập hợp các điểm được xác định trước, sau đó sử dụng đa giác này với thuật toán "điểm trong đa giác" để tìm hiểu xem các điểm mới có nằm trong một dặm không (sau đó bạn cần tính toán bộ đệm bán kính một dặm ... Hoặc trực tiếp làm việc với tất cả các điểm, với bộ đệm nửa dặm, hòa tan và sau đó chọn bộ đệm bị cô lập dựa trên diện tích (mà bạn cần tính toán). Lưu ý rằng 1) tạo bộ đệm 1 dặm thực sự khá tốn kém 2) hòa tan là khá đắt. Chỉ có tùy chọn 1 có ý nghĩa với tôi, nếu bạn sử dụng lại đa giác nhiều lần.
radouxju

2

Nếu bạn làm việc ở phạm vi toàn cầu, bạn có thể tránh tính toán rất nhiều tội lỗi và cos bằng cách kiểm tra đơn giản:

Thử nghiệm đầu tiên để sàng lọc các điểm trước khi tính toán haversine là loại trừ điểm trong đó @DLAT> 0,015 độ (có thể chính xác hơn, nhưng tôi thích sự an toàn hơn).

Trong bước thứ hai, bạn cũng có thể thực hiện việc này với @DLON trong phạm vi vĩ độ nhất định với giá trị bảo toàn (ví dụ: từ -60 đến 60 độ, loại trừ @DLON> 0,03 (= 0,015 / cos (60)).

Bởi vì 1 dặm là khá nhỏ, bạn sẽ hiếm khi cần phải tính toán Haversine với hai quy tắc này (trừ khi bạn làm việc trên vùng cực), và bạn có thể thay thế Haversine với Pythagore (2 cosin vs 2 sin và 2 cosin với Haversine) như đã đề cập bởi @whuber.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.