위도 / 경도 간 거리


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는 무엇입니까? 3D 직교 평면의 점이지만 상대 위치는 어디입니까? 지구의 중심?
  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 Formula 를 사용하십시오 .

(코드는 변환에 두 점의 기반이되는 식 구형 상의 그들의 3D 데카르트 좌표 (XA, 나중에, ZA) 및 (XB, YB, ZB)에 (안 타원) 구체를 형성하고 내적을 형성하며, 이는 그 사이의 각도의 코사인과 같습니다. ACos 함수는 해당 각도를 반환합니다.이 각도는 지구 반경에 따라 크기가 조정될 때 거리를 추정합니다. 문제는 라디안 단위의 크기 'e'와 같이 작은 각도의 코사인이 e ^ 2 / 2에 가까운 양만큼 1과 다르다는 것입니다. e가 부동 소수점 정밀도의 두 배의 제곱근보다 작 으면 부동 소수점 오류 구름으로 사라집니다. 단 정밀도로 계산하는 경우 이는 0.001 미만 (약 1km)의 값이 0과 혼동됨을 의미합니다! 배정도에서 컷오프는 e = 10 ^ -8 정도이지만 e = 10 ^ -4 정도 (약 10 미터)까지는 너무 많은 정밀도를 잃어 걱정할 필요가 있습니다.)에는 고정밀 내부 계산 기능이 내장되어 있습니다)).


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.