ระยะห่างระหว่างจุดละติจูด / ลองจิจูด


10

ฉันพยายามคำนวณระยะทางระหว่างจุดละติจูด / ลองจิจูดสองจุด ฉันมีโค้ดบางส่วนที่ใช้งานได้เป็นส่วนใหญ่ซึ่งฉันดึงออกมาจากโพสต์นี้แต่ฉันไม่เข้าใจว่ามันทำงานอย่างไร

นี่คือรหัส:

<?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;
?>

ฉันมีคำถามสองสามข้อ:

  1. xa, ya, za คืออะไร ฉันเข้าใจว่าพวกเขาเป็นจุดบนระนาบคาร์ทีเซียน 3 มิติ แต่พวกมันสัมพันธ์กับที่ไหน? ศูนย์กลางของโลก?
  2. สิ่งนี้cos($xa * $xb + $ya * $yb + $za * $zb)คำนวณระยะห่างระหว่างจุดต่าง ๆ ได้อย่างไร? ฉันรู้ว่าใน 2D ฉันจะทำสิ่งนี้:

ข้อความแสดงแทน

Pythagorean Theorem 
distance^2 = b^2 + a^2
distance = sqr((y2-y1)^2 + (x2 - x1)^2)
  1. สิ่งนี้จะแม่นยำแค่ไหน? มีการอภิปรายเกี่ยวกับเรื่องนั้นในหน้าอื่น ๆ แต่ฉันต้องการใช้ระยะทางโดยเฉพาะเพื่อบอกว่าผู้ใช้อยู่ในระยะเช่น 10m, 20m หรือ 50m ของกันและกัน ฉันจะสามารถทำสิ่งนี้ได้อย่างแม่นยำหรือไม่?
  2. ฉันควรใช้ทำ$MeanRadiusอะไร นั่นคือคุณค่าที่สมเหตุสมผลหรือไม่? ฉันคิดว่าค่านั้นถือว่าโลกเป็นวงรี

คำตอบ:


17

นี่เป็นรหัสที่แย่มากสำหรับการใช้งานทั่วไปเพราะสามารถให้ผลลัพธ์ที่ผิดพลาดหรือแม้แต่ล้มเหลวในระยะทางสั้น ๆ ใช้สูตร Haversineแทน

(สูตรที่ใช้รหัสของคุณแปลงสองจุดบนทรงกลม (ไม่ใช่วงรี) เป็นพิกัดคาร์ทีเซียน 3D (xa, ya, za) และ (xb, yb, zb) บนหน่วยทรงกลมและจัดรูปแบบผลคูณดอทของพวกมันซึ่งจะเท่ากับโคไซน์ของมุมระหว่างพวกมัน ฟังก์ชั่น ACos ส่งคืนมุมนั้นซึ่งเมื่อปรับขนาดด้วยรัศมีของโลกจะประมาณระยะทาง ปัญหาคือโคไซน์ของมุมเล็ก ๆ , พูดถึงขนาด 'e' เป็นเรเดียน, แตกต่างจาก 1 โดยจำนวนใกล้เคียงกับ e ^ 2/2 สิ่งนี้จะหายไปในคลาวด์ข้อผิดพลาดของจุดลอยตัวเมื่อ e มีขนาดเล็กกว่าสแควร์รูทของความแม่นยำจุดลอยตัวสองเท่า หากคุณคำนวณด้วยความแม่นยำเดียวนั่นหมายความว่าค่า e น้อยกว่า 0.001 - ประมาณหนึ่งกิโลเมตร - จะสับสนกับศูนย์! ในความแม่นยำสองเท่าค่า cutoff ประมาณ e = 10 ^ -8 แต่เมื่อถึงเวลา e = 10 ^ -4 หรือประมาณ 10 เมตรคุณอาจสูญเสียความแม่นยำได้มากจนคุณต้องกังวลมีการคำนวณภายในที่มีความแม่นยำสูงในตัว))


7

ลองดูที่เว็บไซต์นี้ http://www.movable-type.co.uk/scripts/latlong.html

หากคุณใช้มันและคุณได้รับคำตอบที่ผิดคุณอาจมีหน่วยที่ไม่ถูกต้อง ฉันคิดว่าสำหรับไซต์นั้นการดำเนินการส่วนใหญ่จะเป็นเรเดียนแทนที่จะเป็นทศนิยม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.