2010-04-16 6 views
16

나는 위도와 특정 경도를 가지고 있으며 계산할 수있는 거리를 계산하고 싶습니까?두 위도와 경도의 거리를 어떻게 계산합니까?

+3

위도와 경도로부터 거리를 얻을 수 없습니다. 거리는 두 위도와 경도가 필요합니다. –

+1

이것은 최근의 여러 가지 질문에 대한 주제였습니다. 주위를 둘러보십시오. –

+0

저는 2 위도와 경도를 가지고 있습니다 ... –

답변

32
CLLocation *location1 = [[CLLocation alloc] initWithLatitude:lat1 longitude:long1]; 
CLLocation *location2 = [[CLLocation alloc] initWithLatitude:lat2 longitude:long2]; 
NSLog(@"Distance i meters: %f", [location1 distanceFromLocation:location2]); 
[location1 release]; 
[location2 release]; 

는 또한 프로젝트에 CoreLocation.framework을 추가하고, import 문을 추가해야합니다

#import <CoreLocation/CoreLocation.h> 
5

이 그 일의 최적의 방법은 아닐 수도 있지만 작동합니다.

위도와 경도로 지정된 두 위치는 벡터로 간주 될 수 있습니다. 좌표가 Cartesion 좌표로 변환되었다고 가정하면 두 벡터의 내적을 계산하십시오.

주어 V1 = (X1, Y1, Z1)와, V2 = (X2, Y2, Z2), 다음 ...

v1 dot v2 = magnitude(v1) * magnitude(v2) * cos (theta) 

편리하게는, V1 및 V2의 크기는 동일 할 것이다 .. 지구의 반경 (R).

x1*x2 + y1*y2 + z1*z2 = R*R*cos(theta) 

쎄 타를 해결하십시오.

theta = acos ((x1*x2 + y1*y2 + z1*z2)/(R * R)); 

이제 두 벡터 사이의 각도가 라디안으로 표시됩니다. 지구 표면 따라서 건너편 여행 두 점 타협의 거리 ...

distance = theta * R. 

가 완전히 구형 좌표의 컨텍스트 내에서이 작업을 수행 할 수있는 쉬운 방법은 아마이지만, 그 지역 내 수학이 너무 퍼지 - 따라서 데카르트 좌표로의 변환.

은 ... 직교 좌표로 변환

하자 알파 위도, 그리고 베타 경도한다.

x = R * cos (alpha) * cos (beta) 
y = R * sin (alpha) 
z = R * cos (alpha) * sin (beta) 

는 수학 함수는 일반적으로 라디안으로 처리하고,도에서 위도/경도 거래를 잊지 마세요.

+3

지구는 편평한 회전 타원체입니다 (배 모양이 더 정확함). 표면은 평평하지 않습니다. – outis

+1

구형 모델 (http://trac.osgeo.org/proj/wiki/GeodesicCalculations)을 지구에 사용하는 것에 대한 오류에 대한 설명은'proj.4' 웹 사이트를 참조하십시오. 결론은 R에 대한 좋은 가치를 선택하면이 접근 방식으로 1 % 이내로 도달 할 수 있다고 말합니다. – mtrw

+0

+1. 아마도이 답변은 "큰 원 경로를 계산하는 방법"(해상 항법 용어)으로 향할 수 있습니다. UPVOTE DISCLAIMER : 저는 이것에 대해 수학을 검증 할 능력이 없습니다. 나는 그것을 생산 한 능력을 부러워하고 명확한 발표를 존중합니다. – Smandoli

1

나는 수학을 극대화하고 이제는 솔루션을 크게 단순화 할 수 있습니다.

우리가 첫 번째 벡터가 0도 위도와 0도 경도가되도록 지구를 회전한다고 상상해보십시오. 두 번째 벡터는 위도 (alpha2 - alpha1) 위도와 위도 (beta2 - beta1) 위도에 있습니다. 이후

...

sin(0) = 0 and cos(0) = 1 

우리의 내적 단순화하고 있습니다에 ...

cos(delta_alpha) * cos(delta_beta) = cos(theta) 

수학의 나머지 부분은 변경되지 않습니다.

theta = acos (cos(delta_alpha) * cos(delta_beta)) 
distance = radius * theta 

희망이 있습니다.

관련 문제