문제

PHP 페이지에서 2 점 사이의 마일 수를 계산하는 함수를 찾았지만 결함이 있습니다. Google지도에서 작동해야하지만 거리의 차이는 Google지도에서 1.3 ~ 1.65 배 더 가능합니다 (이는 더 정확합니다).

기능은 다음과 같습니다.

$M =  69.09 * rad2deg(acos(sin(deg2rad($lat1)) * sin(deg2rad($lat2)) +  cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($lon1 - $lon2))));

나는 그것이 조금 복잡하다는 것을 알았고, 이것이 wheter를 아는 것이 옳지 않은 지오메트리에 대해 많이 모른다.

조금 더 지식을 가진 사람이 이것을보고 무엇이 잘못되었는지 볼 수 있습니까?

도움이 되었습니까?

해결책

어쩌면 당신은 운전 거리와 함께 '까마귀가 날아가는 거리'(두 지점 사이의 직접 선)를 비교하고 있습니까?

또한, 이 게시물을 참조하십시오 PHP의 두 지점 사이의 거리를 계산합니다.

다른 팁

당신은 찾고 있습니다 Haversine 공식 경도와 위도가있는 두 지점 사이의 거리를 계산합니다.

JavaScript에서 간단한 구현 여기에서 찾을 수 있습니다, PHP로 쉽게 변환해야합니다.

지구 표면에 거리를 계산하는 방법은 적어도 3 개의 다른 방법이 있으며, 이는 정확도와 필요한 계산이 다릅니다.

  1. 코사인의 구형 법칙 정확하지 않고 계산하기가 매우 간단합니다
  2. Haversine 공식 더 작은 거리를 제외하고 정확하지만 여전히 계산하기가 비교적 간단합니다
  3. Vincenty Formula 매우 정확하고 지구 표면의 여러 타원체 모델을 사용할 수 있으며 계산하기가 더 복잡합니다

제공 한 예제는 코사인 계산 법칙 인 것으로 보이며 Google지도는 Vincenty 공식을 사용하므로 더 정확합니다. (Vincenty Link가 Wikipedia 페이지보다 공식을 더 자세히 설명합니다).

편집 : 지구 표면의 편차에 의해 도입 된 오류는 사소한 일이며보고있는 오류를 구성 할 수 없다는 위의 의견을 보았습니다. 나는 이것이 매우 먼 거리에서만 사실이라는 것을 두려워합니다. 수백 km 이하의 거리에서 오류는 결정적으로 사소하지 않을 수 있습니다.

다음은 더 간단한 버전이 있지만 매우 먼 위치에는 정확하지 않습니다.

    const ONE_DEGREE = 111120;

public function distance( $point ) {
    $coef = cos( $this->getLatitude() / 180 * M_PI );
    $x = $this->getLatitude() - $point->getLatitude();
    $y = ( $this->getLongitude() - $point->getLongitude() ) * $coef;
    $result = sqrt( $x * $x + $y * $y ) * self::ONE_DEGREE;
    return $result;
}

$ point 및 $ this thislatitude () 및 getLongitude () 메소드가있는 위치 클래스의 인스턴스입니다.

나는 지오메트리에 대해 아무것도 모르겠지만 Google은 제안했습니다. 이 페이지. 아마도 당신은 그것이 유용하다는 것을 알게 될 것입니다

공식이 정확한 것 같습니다. 예를 들어, 참조하십시오. "큰 원 거리"에 위키 백과. 앞면의 69.09의 계수는 큰 원을 따라 1도 (예 : 적도에서 1 도의 경도에서 마일)를 측정 한 1 도의 마일 수를 믿습니다.

Jonstjohn은 직선 거리를 운전 거리와 잘못 비교할 수 있다는 생각이 나에게 가장 큰 설명처럼 보입니다.

편집하다: 또는 작은 분리로 작업하는 경우 Wikipedia가 언급 한 반올림 오류 일 수도 있습니다. 그러나 나는 손가락을 직접/운전 거리 차이를 먼저 가리 킵니다.

참조하는 계산은 구형 좌표계를 사용하는 것처럼 보입니다. 공식은 거의 정확합니다. 계산을 버릴 수있는 것의 일부는 사용중인 반경입니다. 69.09는 구의 반경입니다 (이 경우 지구). 아시다시피, 지구는 실제로 구체가 아니며 타원체가 아닙니다. 아래의 제형을 시도하는 것이 좋습니다.

3963 * acos(sin(deg2rad($lat1)) * sin(deg2rad($lat2)) +  cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($lon1 - $lon2)));

보다 정확한 결과를 얻으려면 Vincenty 또는 Haversine 계산을 사용하려고합니다.

편집 : 명확히하기 위해, 나는 당신이보고하는 오류의 대부분이 구형 좌표 계산을 사용했기 때문이라는 것을 암시하지는 않습니다. 그 오류는 당신이보고있는 것보다 훨씬 작습니다. 69.09는 단순히 라디안을 사용하는 것보다 직관적이지 않은 지구의 반경의 값이기 때문에 내가 제공 한 공식 조정은 공식의 명확한 버전으로 고안되었습니다. 또한, 매우 작은 거리를 계산하기 위해서는 위의 공식을 사용하는 것이 계산을 수행하는 시스템이 충분한 소수 자리로 작동하는 한 매우 정확합니다 (약 1m 거리). 현대 컴퓨팅에서 플로트를 사용하면 이러한 정확성이 제공됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top