Khoảng cách giữa các điểm lat / long


10

Tôi đang cố gắng tính khoảng cách giữa hai điểm vĩ độ / kinh độ. Tôi có một đoạn mã chủ yếu hoạt động mà tôi đã rút ra từ bài đăng này nhưng tôi không thực sự hiểu cách thức hoạt động của nó.

Đây là mã:

<?php
// POINT 1
$thisLat = deg2rad(44.638);
$thisLong = deg2rad(-63.587);

// POINT 2
$otherLat = deg2rad(44.644);
$otherLong = deg2rad(-63.911);

$MeanRadius = 6378 - 21 * sin($lat1);

$xa = (Cos($thisLat)) * (Cos($thisLong));
$ya = (Cos($thisLat)) * (Sin($thisLong));
$za = (Sin($thisLat));

$xb = (Cos($otherLat)) * (Cos($otherLong));
$yb = (Cos($otherLat)) * (Sin($otherLong));
$zb = (Sin($otherLat));

$distance = $MeanRadius * Acos($xa * $xb + $ya * $yb + $za * $zb);

echo $distance;
?>

Tôi có một vài câu hỏi:

  1. xa, ya, za là gì? Tôi hiểu rằng chúng là các điểm trên mặt phẳng cartesian 3D nhưng chúng có liên quan đến đâu? Trung tâm của trái đất?
  2. Làm thế nào để cos($xa * $xb + $ya * $yb + $za * $zb)tính toán khoảng cách giữa các điểm? Tôi biết rằng trong 2D tôi sẽ làm điều này:

văn bản thay thế

Pythagorean Theorem 
distance^2 = b^2 + a^2
distance = sqr((y2-y1)^2 + (x2 - x1)^2)
  1. Làm thế nào chính xác điều này sẽ được? Có một số cuộc thảo luận về điều đó trên trang khác. Nhưng tôi đặc biệt muốn sử dụng khoảng cách để biết liệu người dùng có ở trong khoảng cách như 10m, 20m hoặc 50m của nhau không. Tôi sẽ có thể làm điều này với độ chính xác tốt?
  2. Tôi nên sử dụng để làm $MeanRadiusgì? Đó có phải là một giá trị hợp lý? Tôi nghĩ rằng giá trị đó giả định rằng trái đất là một hình elip.

Câu trả lời:


17

Đây là mã khủng cho việc sử dụng cho mục đích chung vì nó có thể cho kết quả sai hoặc thậm chí thất bại hoàn toàn trong khoảng cách ngắn. Sử dụng Công thức Haversine thay thế.

(Công thức dựa trên mã của bạn chuyển đổi hai điểm trên hình cầu (không phải hình elip) thành tọa độ 3D Cartesian của chúng (xa, ya, za) và (xb, yb, zb) trên đơn vịhình cầu và tạo thành sản phẩm chấm của chúng, sẽ bằng cosin của góc giữa chúng. Hàm ACos trả về góc đó, khi được thu nhỏ bởi bán kính trái đất sẽ ước tính khoảng cách. Vấn đề là cosin của một góc nhỏ, nói về kích thước 'e' tính bằng radian, khác với 1 bởi một lượng gần bằng 2/2. Điều này biến mất vào đám mây lỗi dấu phẩy động khi e nhỏ hơn căn bậc hai với độ chính xác gấp đôi điểm nổi. Nếu bạn tính toán với độ chính xác đơn, điều này có nghĩa là các giá trị của e nhỏ hơn 0,001 - khoảng một km - sẽ bị nhầm với số không! Trong độ chính xác kép, mức cắt là khoảng e = 10 ^ -8, nhưng vào thời điểm e = 10 ^ -4 hoặc hơn (khoảng 10 mét), bạn có khả năng có thể mất rất nhiều độ chính xác mà bạn cần phải lo lắng,, có một số tính toán nội bộ có độ chính xác cao được xây dựng)).


7

Hãy xem trang web này, http://www.movable-type.co.uk/scripts/latlong.html

Nếu bạn thực hiện nó và bạn nhận được câu trả lời sai, bạn có thể có các đơn vị sai. Tôi nghĩ rằng đối với trang web đó, hầu hết các hoạt động được thực hiện bằng radian thay vì độ thập phân.

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.