2009-03-19 3 views
1

PHP 페이지에서 2 포인트 사이의 마일 수를 계산하는 함수를 찾았지만 잘못되었습니다. 그것은 Google지도와 함께 작동하도록되어 있지만 거리의 차이는 Google지도에서 1.3에서 1.65 배까지 (더 정확함)까지 다양합니다.수학 관련 PHP question + latitude

다음은 함수의 :

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

나는 그것이 조금 복잡 찾을 나는 구조에 대해 많은 처리 여부를 알고 있음을 모르거나하지이 올바른 것입니다.

좀 더 많은 노하우를 가진 사람이이 문제를 살펴보고 그 문제를 볼 수 있습니까?

답변

5

운전 거리가있는 '까마귀가 날아 오는 거리'(두 지점 사이의 직선)를 비교했을 것입니까?

또한 see this post PHP에서 두 점 사이의 거리를 계산합니다.

0

나는 기하학에 대해 아무것도 몰라,하지만 구글은 당신이 Haversine formula은 당신이 위도와 경도를 두 점 사이의 거리를 계산하는 것이 유용

2

당신이 찾고 찾을 수 this page .Maybe을 제안했다.

PHP로 변환하기 쉬운 자바 can be found here에서 직접 구현됩니다.

0

참조하는 계산이 구형 좌표계를 사용하는 것처럼 보입니다. 수식이 거의 정확합니다. 계산을 포기할 수있는 부분은 사용중인 반지름입니다. 69.09는 구의 반경 (이 경우 지구)입니다. 여러분도 아시다시피, 지구는 실제로는 구체가 아닙니다. 타원체입니다. 나는 아래의 공식을 시도하는 게 좋을 것 :

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

보다 정확한 결과를 얻으려면 Vincenty 또는 하버 사인 계산을 사용할 수 있습니다.

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

+0

당신은 그것이 OP와 같은 공식이라는 것을 알고 있습니까? 또한, 지구의 비 구형성에 의해 야기 된 오류는 매우 작아서, Vordreller가 언급 한 1.3-1.65 요소를 설명 할만큼 충분히 가까이 있지 않습니다. –

+0

예. 같은 수식이지만 반경이 수정되어 더 읽기 쉽습니다. 나는 또한 지구의 일대기 자연이 오류를 도입하고 있음을 암시하려고 시도하지는 않았다. (당신이 말한 것처럼, 훨씬 더 작다.) 그러나 주로 그는 반경이 부정확했다. – patjbs

+0

실제로 반경이 정확했습니다. 곱하기 전에 OP의 공식이도 단위로 변환 되었기 때문입니다. 그건 180/pi와 180/pi * 69.09의 추가 요소를 거의 3963입니다. –

0

수식이 정확 해 보입니다. 예를 들어 Wikipedia on "great circle distance"을 참조하십시오. 앞에서 69.09의 요소는 큰 원을 따라 측정 된 1 도의 마일 (예 : 적도에서 1 도의 경도의 마일)이므로 마일리지로 표시됩니다.

당신이 직선 거리와 주행 거리를 잘못 비교했다는 jonstjohn의 생각이 나에게 가장 가능성있는 설명처럼 보입니다.

편집 : 작은 분판으로 작업하는 경우 반올림 오류 Wikipedia에 언급 될 수 있습니다. 하지만 나는 직접/주행 거리 차이에서 내 손가락을 가리킬 것이다.

2

정확도와 필요한 계산이 다른 지구 표면의 거리를 계산하는 데는 서로 다른 세 가지 방법이 있습니다.

  1. Spherical Law of Cosines [없는 매우 정확하고, 아주 간단한 계산하기]
  2. Vincenty Formula [매우 정확 [, 여전히 상대적으로 간단한 계산하는 작은 거리를 제외하고 정확]
  3. Haversine Formula을하고 여러 가지 타원체 모델을 사용할 수 있습니다 지구 표면, 계산하기가 더 복잡하다]

제공 한 예가 코사인 계산의 법칙 인 것처럼 보이지만 Google지도는 더 정확합니다. Vincenty Formula를 말합니다. (나는 Vincenty 링크가 Wikipedia 페이지보다 더 자세하게 수식을 설명한다는 것을 안다.)

편집 : 지구 표면의 어긋남에 의해 소개 된 오류는 사소하고보고있는 오류를 구성 할 수 없다는 위의 의견을 보았다. . 나는 이것이 매우 먼 거리에서만 사실 일까 두렵다. 2 백 킬로미터 이하의 거리에서, 오류는 분명히 중요하지 않을 수 있습니다.

+0

당신이 내 대답에 대해 이야기하는 경우 : 지구 표면의 타원율에 의해 나타나는 오차는 작은 거리에 대해서는 무시할 만하고 사소한 것입니다. 왜냐하면 구형과 타원형 모두 작은 스케일 위에 평평하기 때문입니다. 아마도 코사인 계산법의 반올림 오류를 생각하고있을 것입니다. –

+0

작은 거리 (1 ~ 10km)에서 코사인 법칙에 의해 생산되는 비 첸티 수식의 거리가 적어도 두 배가되는 결과를 상기합니다. 그것들을 재확인하기에는 너무 게으르다 : D, 나는 몇 포인트에서 haversine과 vincenty를 돌 렸고 나는 250km 거리에 대해 1km의 오차를 얻었다. 나에게 사소한 것은 아님 :) – sooniln

+0

더 많은 생각을하면, 코사인 법칙에 얼마나 많은 오류가있을 수 있는지 알 수는 없지만 합리적인 대답으로 보인다. – sooniln

1

여기에 간단한 버전입니다,하지만, 아주 먼 위치에 대한 정확하지 :

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

$ 포인트와 $이 getLatitude()와 getLongitude() 메소드와 위치 클래스의 인스턴스입니다.